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