JAVA--IO流

一个流就是程序与外界通信的一条通道,它可以用来连续的传送数据项。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。


流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流。

流的分类

 
可以从不同的角度对流进行分类:

    1. 处理的数据单位不同,可分为:字符流,字节流

    2. 数据流方向不同,可分为:输入流,输出流
    3. 功能不同,可分为:节点流,处理流

处理的数据单位:

         

          


字节流(Byte Streams):



    字节流是执行基于8位字节的输入和输出,它一次读写一字节的数据。字节流是I / O的最底层流技术,因此,如果你正在阅读或写入字符数据的最佳方法是使用字符流。其他流类型是建立在字节流之上的(如Java中的InputStream、OutputStream)。

[java] view plaincopyprint?
  1. import java.io.*;  
  2. public class TestFileOutputStream{  
  3.     public static void main(String[] args){  
  4.         int b=0;  
  5.         FileInputStream in=null;  
  6.         FileOutputStream out=null;  
  7.         try{  
  8.             in=new FileInputStream("e:/学习/java实例/j2se/TestFileInputStream.java");  
  9.             out=new FileOutputStream("e:/学习/java实例/j2se/TFS.java");  
  10.             while((b=in.read())!=-1){  
  11.                 out.write(b);  
  12.                 }  
  13.             in.close();  
  14.             out.close();  
  15.               
  16.             }  
  17.             catch(FileNotFoundException e2){  
  18.                 System.out.println("找不到指定文件");  
  19.                 System.exit(-1);  
  20.             }catch(IOException e1){  
  21.                 System.out.println("文件复制错误");  
  22.                 System.exit(-1);  
  23.                 }  
  24.             System.out.println("文件已复制");  
  25.         }  
  26. }  


将TestFileInputStream.java复制到TFS.java中





字符流(Character Streams):



    字符流是执行基于16位字节(即两字节)的输入和输出,它一次读写一个字符(两个字节)的数据。所有的字符流类都是从Reader、Writer两个类延伸下来的,我们可以使用FileReader、FileWriter类进行读写I/O文件


[java] view plaincopyprint?
  1. import java.io.*;  
  2. public class TestFileReader{  
  3.     public static void main(String[] args){  
  4.         FileReader fr=null;  
  5.         int c=0;  
  6.         try{  
  7.             fr=new FileReader("e:/学习/java实例/j2se/TestFileInputStream.java");  
  8.             int ln=0;  
  9.             while((c=fr.read())!=-1){  
  10.                 System.out.print((char)c);  
  11.                 }  
  12.             fr.close();  
  13.               
  14.             }  
  15.             catch(FileNotFoundException e){  
  16.                 System.out.println("找不到指定文件");  
  17.             }catch(IOException e){  
  18.                 System.out.println("文件读取错误");  
  19.                 }  
  20.         }  
  21. }  



功能分类:



节点流:


    节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。


           


处理流:


   “连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。


            JAVA--IO流_第1张图片


[java] view plaincopyprint?
  1. import java.io.*;  
  2. public class TestBufferStream1{  
  3.     public static void main(String[] args){  
  4.         try{  
  5.             FileInputStream fis=new FileInputStream("e:/学习/java实例/j2se/TestFileInputStream.java");  
  6.             BufferedInputStream bis=new BufferedInputStream(fis);  
  7.             int c=0;  
  8.             System.out.println(bis.read());  
  9.             bis.mark(100);  
  10.             for(int i=0;i<=10 && (c=bis.read())!=-1;i++){  
  11.                 System.out.print(c+" ");  
  12.                 }  
  13.             System.out.println();  
  14.             bis.reset();  
  15.             for(int i=0;i<=10 && (c=bis.read())!=-1;i++){  
  16.                 System.out.print(c+" ");  
  17.                 }  
  18.             bis.close();  
  19.               
  20.             }  
  21.             catch(IOException e){  
  22.                 e.printStackTrace();  
  23.                 }  
  24.     }  
  25. }  





Buffered缓冲流:


BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流。


缓冲流的作用:

    避免每次跟磁盘打交道,提高数据的访问效率。(提高流的操作率),所以在缓冲区之前必须要有流对象。


利用缓冲区技术字符流读取操作。(BufferedReader) 步骤:


1,定义流对象与被读取文件相关联FileReader fr=new FileReader("f:\\1.txt");

2,定义缓冲区,把流对象作为参数放进缓冲区:

BufferedReader br=new BufferedReader(fr);
3,利用while循环,一行一行的读取(br.readLine();此处返回类型是一个String,如果返回为null说明已读取到末尾处)
           String  len=null;
           while((len=br.readLine())!=null){
               System.out.println("读出了:"+len);

}

4,最后关闭资源。

 

readLine原理:


    无论是读一行,获取多个字符,最终都是从硬盘上一个一个的读取,都是使用read方法中一次读取一个字符的方法。readLine中封装了数组,每读一个就放在缓冲区中(不立即返回),当读到\r\n时,表示读取一行结束,因此此时就返回一行数据。


总结:


    流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。


你可能感兴趣的:(JAVA--IO流)