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(); } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。