Java中的IO流
IO流概述:
IO流本质就是一种数据的流动,按照流动的方向分为输入(Input)和输出(Output)
Java中的IO操作主要指的是 java.io包下的一些常用类的使用,通过常用类对数据进行读取(输入Input)和写出(输出Output)
计算机中的任何数据(文本、图片、视频、音乐等等)都是以二进制的形式进行存储的。
在任何流进行数据传输时,底层都是采用二进制的形式进行数据传输的。
IO流的分类:
按照流的方向来分,分为输入流和输出流
按照流动的数据类型来分,可以分为:字节流、字符流、打印流、对象流等等,但我们最常见的是字节流和字符流。
字节流和字符流的区别:
最直观的区别,字节流和字符流都分为输入和输出流,其顶级父类分别为一下内容:
字节流:
----输入流: InputStream
----输出流: OutputStream
字符流:
----输入流: Reader
----输出流: Writer
应用方面区别:
字符流一般用于读取文字,字节流一般用于读取除文字外的其他内容。
原因:
文字的字节数是动态的,不同文字占用的字节数是不同的,字节流只能读取规定数量的字节数,但文字的使用的字符编码为UTF-8,UTF-8对文字进行编码时会动态规定文字所占用的字节数,是不确定的,所以字节流在读取文字时经常会出现读取半个文字的情况。
而字符流本质是将字节流进行了动态的封装,每次动态读取一个文字所占有的字节,所以在读取文字时不会出现乱码的情况。
字节流
OutputStream类:
为抽象类,也是输出字节流的所有类的超类,常见方法如下:
close();
关闭流的方法。
因为流在使用文件的过程中都是在占用文件的过程,如果在使用后没有将流关掉,则会导致其他流无法进行访问,所以在所有的流的使用完成后都需要将其关闭。
flush();
刷新该输出流,当输出流被改变时,进行刷新并强制写出任何被缓存的数据。
write(byte[] b);
将字节数组写入该输出流
write(byte[] b, int off , int len);
将字节数组从off下标开始写入文件,写len长度的数组内容
write(int b);
将字节写入此输出流,注:该传入的内容虽然为int型的内容,但本质传入的是一个字节,超过一个字节的内容不能使用。
写入的内容为数值对应的ASCII码的值
FileOutputStream
OutputStream最常用的子类,含义为:文件输出流。
构造方法:
FileOutputStream(File file);
该构造方法只能清空文件后再重新对文件进行写入。
FileOutputStream(File file , boolean append);
当布尔值为true时,在文件末尾进行写入操作,当boolean为false时,清空文件再进行写入操作。
常用方法为继承父类重写的方法,与OutputStream类中的方法功能相同。
FileInputStream
常用方法:
read();
读取文件的一个字节,返回值为int,取值范围为0~255;如果读取的应为字符,可以使用强制类型转换将其转换为char型。
当读取内容为空时,默认读取的数字为-1
read(byte[] b);
读取一个字节数组的内容。
字节流
本质是字节流的封装,在调用时对表达一个字符的字节进行封装,另字节能够整体成字符的形式;
方法与字节流基本相同。
FileWrite
输入流,用于向文件中写入内容。
构造方法:
FileWrite(File file);
该构造方法只能清空文件后再重新对文件进行写入。
FileWrite(File file , boolean append);
当布尔值为true时,在文件末尾进行写入操作,当boolean为false时,清空文件再进行写入操作。
常用方法:
write();
当构造方法中布尔值为false或不存在时,先清空文件再对文件进行写入。
append();
在文件原内容结尾处继续写,返回的值为传入的方法(this),不会新建立对象进行返回,返回的方法为传入的方法。
FileReader
从文件中读取字符。
常用方法:
read();
读取一个字节
read(char[] c);
将文件内容读取至字符数组c中;
返回值为int型的读取的长度。
注:读取后打印时,默认打印出的内容为整个数组的长度的全部内容,会大量占用内存和打印速度,可以配合String包装类中的方法来进行使用。
代码如下:
FileReader fr = new FileReader("b.txt");
char[] ch = new char[100];
int len = fr.read();
//test是将字符串数组截取出可用的部分进行打印
String test = new String(ch,0,len);
fr.close();
System.out.println(text);
//打印的内容为文件中的内容。(文件长度不得超过字符串数组的最大值)
字符流有一个特殊的内容,因为字符流本质上是对字节流的封装,将数个字节封装成一个字符,所以在加载过程中是每次读取一个字符,但可能出现一次读取半个字符的情况,在字符流中默认将其加载至缓存中,待字符的另一半出现后再加载。
在字符流的方法中flash();方法会强制读取停留在缓存中的字节,如果不刷新将缓存中的内容读取,内容不会被读取出来。
注:close();方法默认会在关闭文件前强制读取停留在缓存中的字节。