Java IO深入浅出

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();
    }  
   }  
}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值