IO流技术解决的问题:设备与设备之间的传输问题,内存——>硬盘,硬盘——>内存,等等
IO流技术
如果按照数据的流向划分可以划分为:输入流和输出流
输入输出的标准是以程序为参考物的,如果流出则选用输出流,如果数据流入则使用输入流。
如果按照处理的单位来划分:字节流和字符流
字节流:读取文件中的二进制数据,而且读取的二进制数据不会经过任何的处理
字符流:***也是读取文件中的二进制数据,不过会吧这些二进制的数据转换成我们能识别的字符。
字符流 = 字节流 + 解码
上面的分析告诉们先看字节流再学字符流
IO流中的类的名字,都很好叫,一般都是把父类作为子类名字的后缀。
输入字节流:最大的特点是一看类的名字就知道这个类是可以干什么的
InputStream 所有输入字节流的基类
|————FileInputStream
使用FileInputStream如何读取文件:
1、找到目标文件 。File类来解决
2、建立数据的输入通道。
3、读取文件的数据,使用流对象的read方法.当读到文件结尾时返回-1,表示结束
4、关闭资源。实质上就是释放资源的作用.一般调用close方法
这一块介绍了4中读取字符流的方法,最后,留下一种是最好的。贴在下面:
//使用缓冲数组配合循环一起来读取 这是最最推荐的方式 以后都是这种方式
1 public static void readTest4() throws IOException 2{ 3 long start = System.currentTimeMillis(); 4 //找到目标文件 5 File file = new File("D:\pic.jpg"); 6 //建立数据的输入通道 7 FileInputStream fileInputStream = new FileInputStream(file); 8 //建立缓冲数组配合循环 读取文件的数据 9 int length = 0; //保存每次读取到的字节个数 10 byte[] buf = new byte[1024*3]; //缓冲数组的长度一般是1024的倍数,因为正好是计算机处理单位,理论上来说缓冲数组越大,效率越高 11 while((length = fileInputStream.read(buf))!=-1) 12 { 13 System.out.println(new String(buf, 0, length)); 14 } 15 long end = System.currentTimeMillis(); 16 System.out.println("使用时间:"+(end - start)); 17 }
注意:
1、资源文件一旦使用完毕要立马是释放,不然别的程序将无法对该资源进行操作、
2、用户混错的buf构建字符串的时候必须应当new String(buf, 0, length),因为length是每次read出的长度,又能最后一次独处的内容没有buf总的长度那么长,那么buf中残存的又上一次的数据。
字节流之输出 OutputStream 所有输出字节流的基类
OutputStream 所有输出字节流的基类 抽象类
|——FileOutputStream 向文件输出数据的输出的字节流
FileOutputStream 输出字节流的使用步骤
1、找到目标文件
2、建立文件与程序的输出通道
3、把数据转换成字节数组写出
4、关闭资源
FileOutputStream要注意的事情:
1、使用FileOutputStream的时候,如果目标文件不错在,就会自动创建目标文件。
2、使用FileOutputStream的时候,如果文件已经存在,那么会先清空目标文件中的数据,然后在写入数数据。
3、使用FileOutputStream的时候,如果文件已经存在,需要在原来的文件末尾追加元素的时候,应当使用构造函数new FileOutputStream(file, true);每创建一个FileOutputStream的时候,指正会指向文件的开始位置。每写一次指针都会做出相应的移动,拷贝文件的时候,会新建一个文件,因为指针是一直持续向后移动的。
4、使用FileOutputStream的write方法写数据的时候,虽然每次接受而的是一个int型的数据,但是整整写出的只是一个字节的数据,只是把低8位的二进制数据写出,其他24位的数据全部丢弃。
使用输出流,把字节数组中的数字写出:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static void writeTest2() throws IOException 2 { 3 //找到目标文件 4 File file = new File("D:\b.txt"); 5 //建立文件与数据的输出通道 6 FileOutputStream fileOutputStream = new FileOutputStream(file, true); 7 //把数据写出 8 String data = "hello world"; //getbytes()转变为字节数组 9 fileOutputStream.write(data.getBytes()); 10 //关闭资源 11 fileOutputStream.close(); 12 }
拷贝一张图片:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static void copyImage() throws IOException 2 { 3 //找到目标文件 4 File inFile = new File("D:\1.jpg"); 5 File destFile = new File("E:\1.jpg"); 6 //建立数据的输入输出通道 7 FileInputStream fileInputStream = new FileInputStream(inFile); 8 FileOutputStream fileOutputStream = new FileOutputStream(destFile); //追加数据.... 9 10 //每新创建一个FileOutputStream的时候,默认情况下FileOutputStream 的指针是指向了文件的开始的位置。 每写出一次,指向都会出现相应移动。 11 //建立缓冲数据,边读边写 12 byte[] buf = new byte[1024]; 13 int length = 0 ; 14 while((length = fileInputStream.read(buf))!=-1){ //不限丢人的输出来第一次我写的时候,read(buf)中的参数buf被我写丢了,好久才发现的错误 15 fileOutputStream.write(buf,0,length); //写出很多次数据,所以就必须要追加。 16 } 17 //关闭资源 原则: 先开后关,后开先关。 18 fileOutputStream.close(); 19 fileInputStream.close(); 20 }