java 字节流的处理

位流

 

    计算机中的数据都是以0与1的方式来存储,如果要在两个装置之间进行数据的存取,当然也是以0与1位的方式来进行,Java将数据于目的地及来源之间的流动抽象化为一个流(Stream),而流当中流动的则是位数据

 

InputStream和OutputStream

 

     计算机中实际上数据的流动是通过电路,而上面流动的则是电流,电流的电位有低位与高位,即数字的0与1位。从程序的观点来说,通常会将数据目的地(例如内存)与来源(例如文件)之间的数据流动抽象化为一个流(Stream),而其中流动的则是位数据

 

     InputStream 是所有表示位输入流的类之父类,它是一个抽象类,继承它的子类要重新定义其中所定义的抽象方法。InputStream是从装置来源地读取数据的抽象表示,例如System中的标准输入流in对象就是一个InputStream类型的实例。在Java程序开始之后,in流对象就会开启,目的是从标准输入装置中读取数据,这个装置通常是键盘或是用户定义的输入装置

 

     OutputStream 是所有表示位输出流的类之父类,它是一个抽象类。子类要重新定义其中所定义的抽象方法,OutputStream是用于将数据写入目的地的抽象表示。例如 System中的标准输出流对象out其类型是java.io.PrintStream,这个类是OutputStream的子类 (java.io.FilterOutputStream继承OutputStream, PrintStream再继承FilterOutputStream)。在程序开始之后,out流对象就会开启,可以通过out来将数据写至目的地装置,这个装置通常是屏幕显示或用户定义的输出装置

 

   

Java代码 
  1. import java.io.IOException;  
  2.   
  3. public class Systemin {  
  4.   
  5.     public static void main(String args[]) {  
  6.         try {  
  7.             System.out.println("输入字符:");  
  8.             System.out.println("输入字符十进制表示:" + System.in.read());  
  9.         } catch (IOException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  
  13. }  

 

 

执行结果

输入字符: A

输入字符十进制表示: 65

 

字符A输入后由标准输入流in读取,A的位表示以十进制来看就是65,这是A字符的编码(查查ASCII编码表就知道了)。

 

一般来说,很少直接实现InputStream或OutputStream上的方法,因为这些方法比较低级,通常会实现它们的子类。这些子类上所定义的方法在进行输入/输出时更为方便

 

FileInputStream和FileOutputStream

 

     java.io.FileInputStream 是InputStream的子类。从开头File名称上就可以知道,FileInputStream与从指定的文件中读取数据至目的地有关。而 java.io.FileOutputStream是OutputStream的子类,顾名思义,FileOutputStream主要与从来源地写入数据至指定的文件中有关

 

    当建立一个FileInputStream或FileOutputStream的实例时,必须指定文件位置及文件名称,实例被建立时文件的流就会开启;而不使用流时,必须关闭文件流,以释放与流相依的系统资源,完成文件读/写的动作

   

    FileInputStream可以使用 read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色

 

    FileInputStream与FileOutputStream的一个例子。程序可以复制文件,它会先从来源文件读取数据至一个byte数组中,然后再将byte数组的数据写入目的文件

Java代码 < 1024) { // 剩于的数据比1024少 // 一位一位读出再写入目的文件 int remain = -1; while ((remain = fileInputStream.read()) != -1) { fileOutputStream.write(remain); } break; } else { // 从来源文件读取数据至缓冲区 fileInputStream.read(buffer); // 将数组数据写入目的文件 fileOutputStream.write(buffer); } } // 关闭流 fileInputStream.close(); fileOutputStream.close(); System.out.println("复制完成"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6.   
  7. public class FileStreamDemo {  
  8.   
  9.       
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.   
  13.         try {  
  14.             byte[] buffer = new byte[1024];  
  15.             // 源文件  
  16.             FileInputStream fileInputStream = new FileInputStream(new File(  
  17.                     args[0]));  
  18.             FileOutputStream fileOutputStream = new FileOutputStream(new File(  
  19.                     args[1]));  
  20.   
  21.             // avilable()可取得未读取数据的长度  
  22.             System.out.println("复制文件:" + fileInputStream.available() + "字节");  
  23.   
  24.             while (true) {  
  25.                 if (fileInputStream.available() < 1024) {  
  26.                     // 剩于的数据比1024少  
  27.                     // 一位一位读出再写入目的文件  
  28.                     int remain = -1;  
  29.                     while ((remain = fileInputStream.read()) != -1) {  
  30.                         fileOutputStream.write(remain);  
  31.                     }  
  32.                     break;  
  33.                 } else {  
  34.                     // 从来源文件读取数据至缓冲区  
  35.                     fileInputStream.read(buffer);  
  36.                     // 将数组数据写入目的文件  
  37.                     fileOutputStream.write(buffer);  
  38.                 }  
  39.             }  
  40.             // 关闭流  
  41.             fileInputStream.close();  
  42.             fileOutputStream.close();  
  43.             System.out.println("复制完成");  
  44.         } catch (FileNotFoundException e) {  
  45.             e.printStackTrace();  
  46.         } catch (IOException e) {  
  47.             // TODO Auto-generated catch block  
  48.             e.printStackTrace();  
  49.         }  
  50.     }  
  51. }  

 

 

       程序中示范了两个read()方法,一个方法可以读入指定长度的数据至数组,另一个方法一次可以读入一个字节。每次读取之后,读取的光标都会往前进,如果读不到数据则返回–1,使用available()方法获得还有多少字节可以读取。除了使用File来建立FileInputStream、 FileOutputStream的实例之外,也可以直接使用字符串指定路径来建立

 

Java代码 
  1. // 来源文件  
  2. FileInputStream fileInputStream =  
  3.                  new FileInputStream(args[0]);  
  4. // 目的文件  
  5. FileOutputStream fileOutputStream =  
  6.                  new FileOutputStream(args[1]);  

 

     在不使用文件流时,记得使用close()方法自行关闭流,以释放与流相依的系统资源。一个执行的结果范例如下,它将FileDemo.java复制为FileDemo.txt:

 

 

BufferedInputStream和BufferedOutputStream

 

     java.io.BufferedInputStream 与java.io.BufferedOutputStream可以为InputStream、OutputStream类的对象增加缓冲区功能。构建 BufferedInputStream实例时,需要给定一个InputStream类型的实例,实现BufferedInputStream时,实际上最后是实现InputStream实例。同样地,在构建BufferedOutputStream时,也需要给定一个OutputStream实例,实现 BufferedOutputStream时,实际上最后是实现OutputStream实例

 

     BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时,例如文件,BufferedInputStream会尽量将buf填满。当使用read ()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数据

 

     BufferedOutputStream的数据成员buf是一个位数组,默认为512字节。当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时才会实现给定的 OutputStream对象的write()方法,将buf数据写至目的地,而不是每次都对目的地作写入的动作

猜你喜欢

转载自blog.csdn.net/changpingchen/article/details/19125633