实例解析IO字节流 - 极悦
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 实例解析IO字节流

实例解析IO字节流

更新时间:2020-11-19 17:32:23 来源:极悦 浏览874次

从流的内容来讲,有字节和字符之分。顾名思义,字节流是由字节组成的,字符流是由字符组成的。IO字节流是Java IO流中非常重要的一种IO流,本文我们就通过实例一起来学习IO字节流


IO字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream。


一、字节输出流:OutputStream

OutputStream是整个IO包中字节输出流的最大父类,此类的定义如下:

public abstract class OutputStream extends Object implements Closeable,Flushable

从以上的定义可以发现,此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化

Closeable表示可以关闭的操作,因为程序运行到最后肯定要关闭

Flushable:表示刷新,清空内存中的数据

FileOutputStream类的构造方法如下:

public FileOutputStream(File file)throws FileNotFoundException

写数据:

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class Test11 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建

String str="Hello World";

byte[] b=str.getBytes();

out.write(b);//因为是字节流,所以要转化成字节数组进行输出

out.close();

}

}

也可以一个字节一个字节进行输出,如下:

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class Test11 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建

String str="Hello World";

byte[] b=str.getBytes();

for(int i=0;i<b.length;i++){< p="">

out.write(b[i]);

}

out.close();

}

}


以上输出只会进行覆盖,如果要追加的话,请看FileOutputStream类的另一个构造方法:

public FileOutputStream(File file,boolean append)throws FileNotFoundException

在构造方法中,如果将append的值设置为true,则表示在文件的末尾追加内容。

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class Test11 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

OutputStream out=new FileOutputStream(f,true);//追加内容

String str="\r\nHello World";

byte[] b=str.getBytes();

for(int i=0;i<b.length;i++){< p="">

out.write(b[i]);

}

out.close();

}

}

文件中换行为:\r\n


二、字节输入流:InputStream

既然程序可以向文件中写入内容,则就可以通过InputStream从文件中把内容读取进来,首先来看InputStream类的定义:

public abstract class InputStream extends Object implements Closeable

与OutputStream类一样,InputStream本身也是一个抽象类,必须依靠其子类,如果现在是从文件中读取,就用FileInputStream来实现。

观察FileInputStream类的构造方法:

public FileInputStream(File file)throws FileNotFoundException

读文件:

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

public class Test12 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

InputStream in=new FileInputStream(f);

byte[] b=new byte[1024];

int len=in.read(b);

in.close();

System.out.println(new String(b,0,len));

}

}


但以上方法是有问题的,用不用开辟这么大的一个字节数组,明显是浪费嘛,我们可以根据文件的大小来定义字节数组的大小,File类中的方法:public long length()

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

public class Test13 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

InputStream in=new FileInputStream(f);

byte[] b=new byte[(int) f.length()];

in.read(b);

in.close();

System.out.println(new String(b));

}

}

我们换种方式,一个字节一个字节读入~

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

public class Test14 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

InputStream in=new FileInputStream(f);

byte[] b=new byte[(int) f.length()];

for(int i=0;i<b.length;i++){< p="">

b[i]=(byte) in.read();

}

in.close();

System.out.println(new String(b));

}

}

但以上情况只适合知道输入文件的大小,不知道的话用如下方法:

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

public class Test15 {

public static void main(String[] args) throws IOException {

File f = new File("d:" + File.separator+"test.txt");

InputStream in=new FileInputStream(f);

byte[] b=new byte[1024];

int temp=0;

int len=0;

while((temp=in.read())!=-1){//-1为文件读完的标志

b[len]=(byte) temp;

len++;

}

in.close();

System.out.println(new String(b,0,len));

}

}


实际上IO字节流和IO字符流的使用是非常相似的,但字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。学完了IO字节流,想要学习IO字符流的小伙伴可以观看本站的Java教程学习,对比两种IO流我们学习起来也能事半功倍哦。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>