(16)IO流之输入字节流FileInputStream和输出字节流FielOutputStream

 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、使用FileOutputStreamwrite方法写数据的时候,虽然每次接受而的是一个int型的数据,但是整整写出的只是一个字节的数据,只是把低8位的二进制数据写出,其他24位的数据全部丢弃。

使用输出流,把字节数组中的数字写出:

 

 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     }
View Code

 

拷贝一张图片:

 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     }
View Code

 

posted @ 2016-11-02 10:18  zhangoliver  阅读(400)  评论(0)    收藏  举报