IO流的简单输入输出

来源:互联网 发布:浙江网络作协 编辑:程序博客网 时间:2024/04/30 18:24

IO流分类

1.解决问题:解决设备与设备之间的数据传输问题
内存—–>硬盘 —————– 硬盘—>内存
2.IO流分类

(1)按数据流向划分
判断依据:以当前程序为参照,观察数据是流出还是流入,流出为输出,流入为输入

输入流:Input

输出刘:Output

(2)按处理单位划分

字节流:字节读取的是文件中的二进制数据,读取到的二进制数据不会经过任何处理

字符流:类似字节流,也是读取二进制单位,不过会把二进制单位转换成我们能识别的字符
字符流 = 字节流 + 解码

文件操作的输入输出流

1.输入字节流

—–InputStream 所有输入字节流的基类
———–FileInputStream 读取文件数据的输入字节流
构造方法,传入一个文件对象,在文件与程序之间构建输入通道

FileInputStram使用步骤:

(1)找到目标文件


File file = new File("D:\\java程序\\a.txt");

(2)建立输入通道


FileInputStream fileInputStream = new FileInputStream(file)

(3)开通通道,导流

1)利用fileInputStream.read()方法从文件中逐个读入数据

2)利用read()方法在读到文件末尾时会返回-1的特性,进行读取


while((contend=fileInputStream)!=-1)System.out.println(contend);

3)read()方法可以接收一个字节数组为参数,将数据读入数组,返回值为读入的字节数,所以可以开一个缓冲数组接收文件中的数据,输入时利用new String(buf),把字节数组转换为字符串输出


byte[] buf = new byte[50];int length=fileInputStream.read(buf);System.out.println(new String(buf,0,length));

4)利用缓冲数组循环接收数据,因为接收数据的字节大小不明确,所以第三种方法不可取,此时利用读取到文件末尾读到-1的特性,结合循环和缓冲数组共同使用来读取文件,这样不用担心数组不够大,并且效率远大于2方法,理论上,数组开的越大,效率越高,注意:每次循环时是直接覆盖原数组,而不是先清空数组再输入


byte[] buf = new byte[1024];int length;while((length=fileInputStream)!=-1)System.out.println(new String(buf,0,length));

(4)关闭资源

     调用通道的close方法不关闭通道的影响:在关闭jvm虚拟机之前,该文件一直处于被调用的状态,无法被其他程序调用

2.输出字节流

FileOutputStream
步骤类似输入流

输出的方法:write()

(1)FileOutputStream的构造方法

1)FileOutputStream(File file)

在file文件与程序之间搭建一个输出通道,清空原文件中的数据

2)FileOutputStream(File file,boolean append)

在file文件与程序之间搭建一个输出通道,如果append是true,不清空文件,在输出文件时直接在后面添加,是false则清空文件,再输出

(2)write()

1.write(byte[] buf)//接收一个字节数组,输出到文件
2.write(byte[] buf,int off,int len)//接收一个字节数组,把第off到len位输出到文件,第len位不输出

注:
1.可以利用getBytes把一个字符串转化为字节数组输入
2.和文件建立通道时,若文件不存在,则自动创建一个
3.使用write方法时,虽然接收的是一个int型数据(4个字节,32位),但真正写入的只有一个字节,写入低8位的二进制数据,前24位丢弃

3.文件操作中异常的处理

注意:
1.文件获取后,需要中断对后面的文件操作
2.资源处于未关闭状态,需要关闭

方法:
1.return,可以中断后面对文件的操作,但无法返回中断原因,体验度低
2.throw e(IOException);这样抛出异常可以中断后续操作,也能反馈错误原因,但使用这个方法,需要再方法外抛出IOException,用户使用这个方法时就要加try,catch块,太麻烦
3.throw new RuntimeException(e)//最优方法,利用RuntimeException包裹异常,就不用在方法外抛出异常,又指明了异常原因,用户使用也可以自己选择是否捕捉异常,更灵活

后续处理:
在finally中要关闭资源,关闭资源时也要捕捉IOException,利用一样的方法抛出异常
注:先判断通道是否为空,再关闭资源,避免前面根本没打开