码迷,mamicode.com
首页 > 编程语言 > 详细

Java IO深入浅出

时间:2015-08-19 23:47:23      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:java

1.What is stream?

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

在Java中,IO的部分很庞大,基本包括两大部分:字节流和字符流。具体结构如下图(图源于网上):

技术分享

2:什么是字节流?

以字节为单位传输的流。字节流的输入流祖先是:Inputstream(数据单位是byte (8bits))输出的祖先是OutputStream(数据单位是byte(8bits));

【这里有一个规律:不管是子类还是装饰类都是以XXXinputStream和XXXoutputStream的方式出现,最后恒定的putStream决定了它是字节流】

FileInputStream和FileOutStream是节点流,但他们是继承关系,他们的构造方法允许通过文件的路径名来构造响相应的流。

如:FileInputStream infile = new FileInputSream("E:\\mytest");(需要注意的是在用文件输入流的时候,必须存在且可读,而输出流的时候必须文件存在且可覆盖的

);

BufferedInputStream和BufferOutputStream,他们是过滤器流,他们与祖先不是继承关系,而是装饰和被装饰关系(实际用到装饰者模式),作用是提高输入和输出的效率,其提供一个缓冲的方式;

DataInputStream和DataOutputStream 是数据驶入流和数据输出流,他们与祖先也不是继承关系,而是装饰和被装饰关系,这里主要用到(装饰模式)其可以实现程序与机器无关的方式读写Java程序,在网络传输中经常用到。


3:什么是字符流

字符流主要以字符为单位传输的流。字符流输入和输出的祖先分别是Reader和Writer数据单位是字符 (16bits))。

【这里有一个规律:不管是子类还是装饰类都是以XXXReader和XXXWriter的方式出现,最后恒定的Reader或Writer决定了它是字符流】

InputStreamReader和OutputStreamWriter。在构造它使用指定的 charset 读取字节并将其解码为字符。

BufferReaded和BufferWriter 与上面的字节流一样效果,他们与其祖先不是继承关系,而是装饰和被装饰关系(实际用到装饰者模式),使用缓冲大大提高输入输出的效率,在代码读写中以行为单位。

代码:

import java.io.*;
public class TextRead{

public static void main(String[] args){
   File fin,fout;  
   BufferedReader bf = null;
   PrintWriter pw = null;
   try{
    fin = new File("zzc.txt"); //注意文件与程序都要在同一个文件夹下。zzc.txt为要被复制的文件。
    fout = new File("copyzzc.txt"); //如果没有会自动创建。
    bf = new BufferedReader(new FileReader(fin));
    pw = new PrintWriter(fout); //PrintWriter为打印流,也可以使用BufferedWriter.
    String line = bf.readLine();
    while(line!=null){
    pw.println(line);
     line = bf.readLine();
    }
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    try{
    //关闭 文件。
     if(bf!=null){
      bf.close();
      bf = null;
     }
     if(pw!=null){
      pw.close();
      pw = null;
     }
    }catch(Exception e){
     e.printStackTrace();
    }
   }
}
}

import java.io.*;
public class TextRead{

public static void main(String[] args){
   BufferedReader bf = null;/*BufferedReader相当于一个大桶,其实就是内存,这里实现了大量大量的读写 ,而不是读一个字节或字符就直接写如硬盘,加强了对硬盘的保护。*/
   try{
    while(true){ // while(true){}循环保证程序不会结束
    
       bf = new BufferedReader(new InputStreamReader(System.in));
       /*System.in 为标准输入,System.out为标准输出*/
       /*InputStreamReader用语将字节流到字符流的转化,这也就是处理流了
        *在这里相当与2个管道接在System.in与程序之间。
        *readLine()方法功能比较好用,也就通过处理流来实现更好功能。
        **/
     String line = bf.readLine();
     System.out.println(line);
    }  
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    //一定要关闭流,用完后。最好放在

filally 里面。  
    try{   
     if(bf!=null){
      bf.close();
     }
    }catch(Exception e){
       e.printStackTrace();
    }  
   }  
}
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

Java IO深入浅出

标签:java

原文地址:http://blog.csdn.net/barnetthe/article/details/47788513

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!