你的位置:首页 > Java教程

[Java教程]javaI/O流学习小结


javaI/O流可根据流向分为输入和输出流,根据流数据类型可分为字符流和字节流。

下面用一张图展示I/O流的划分:

类型字符流字节流File(文件)FileReader
FileWriter
FileInputStream
FileOutputSream
Memory ArrayCharArrayReader
CharArrayWriter
ByteArrayInputStream
ByteArrayOutputSream
Memory StringStringReader
StringWriter
   -Pipe(管道)PipedReader
PipedWriter
PipedInputSream
PipedOutputSream

处理流:

对已存在的流进行连接和封装,通过所封装的流的功能实现数据的读写,处理流的构造器总带一个其它流对象作为参数,一个流对象经过其它流的多次包装,称为流的链接。

缓冲流(BufferedInPutStream/BufferedOutPutStream或者BufferedReader/BufferedWriter)

写入缓冲区对象:

 1 BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));  

读取缓冲区对象:

 1 BufferedReader bufr = new BufferedReader(new FileReader("buf.txt")); 

特点:含有readline方法,每次读一行,读到末尾返回null。机制:每次读取一个字符(字符流),先不处理,等整行读完(读到回车标识),将临时容器中数据一次性返回。

eg:

 1 package sheepmu; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.FileReader; 8 import java.io.FileWriter; 9 import java.io.IOException;10 import java.io.ObjectInputStream;11 import java.io.ObjectOutputStream;12 import java.util.ArrayList;13 import java.util.List;14 15 public class MyTest implements java.io.Serializable16 {17   private static final long serialVersionUID = 1L;18   private String name="SheepMu";19   private static int age=450*125;20   private List list=new ArrayList<String>();21   22   public static void main(String[] args)23   {24     try25     {26       BufferedWriter oos = new BufferedWriter(new FileWriter("my.txt"));//输出流保存的文件名为 my.out ;ObjectOutputStream能把Object输出成Byte流27       MyTest myTest=new MyTest();28       for (int i = 0;i<4;i++)29       {30         oos.write(myTest.name+i);31         oos.newLine();32       }33       oos.flush(); //缓冲流 34       oos.close(); //关闭流35     } catch (FileNotFoundException e) 36     {    37       e.printStackTrace();38     } catch (IOException e) 39     {40       e.printStackTrace();41     } 42     fan();//调用下面的 反序列化 代码43   }44   public static void fan() //反序列的过程45   {  46     BufferedReader oin = null;//局部变量必须要初始化47     try48     {49       oin = new BufferedReader(new FileReader("my.txt"));50     } catch (FileNotFoundException e1)51     {    52       e1.printStackTrace();53     } catch (IOException e1)54     {55       e1.printStackTrace();56     }   57     58       String[] mts = new String[6];59       try {60         for(int i = 0;i<6;i++)61         {62           mts[i] = oin.readLine();63           System.out.println(mts[i]);64         }   65 //         System.out.println("name="+mts.name);  66 //         System.out.println("age="+mts.age); 67 //         System.out.println("list="+mts.list.toString()); 68         69         System.out.print(age);70       } catch (IOException e) {71         // TODO Auto-generated catch block72         e.printStackTrace();73       }74     //由Object对象向下转型为MyTest对象75      76     77   }78 }

 

转换流(InPutStreamReader/OutPutStreamWriter):

转换流作为字符流和字节流之间的转换方式,可以对读取到的字节数据进行按照指定编码转换*

1   InputStreamReader(InputStream);    //通过构造函数初始化,使用的是本系统默认的编码表GBK。 2   InputStreamWriter(InputStream,String charSet);  //通过该构造函数初始化,可以指定编码表。 3   OutputStreamWriter(OutputStream);   //通过该构造函数初始化,使用的是本系统默认的编码表GBK。 4   OutputStreamwriter(OutputStream,String charSet);  //通过该构造函数初始化,可以指定编码表。 

  注意:

在使用FileReader操作文本数据时,该对象使用的时默认的编码表,即          

FileReader fr=new FileReader(“a.txt”); 与InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"));
的意义相同。如果要使用指定表编码表时,必须使用转换流,即如果a.txt中的文件中的字符数据是通过utf-8的形式编码,那么在读取时,就必须指定编 码表,那么转换流时必须的。即:
InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"),utf-8);
 
*关键词:字符字节间转化。
 
数据流(DataInputStream/DataOutputStream)
  该数据流可以方便地对一些基本类型数据进行直接的存储和读取,不需要再进一步进行转换,通常只要操作基本数据类型的数据,就需要通过DataStream进行包装。
 
 1 DataInputStreamReader(InputStream);
2 DataOutputStreamWriter(OutputStream); 
 
1   int readInt();//一次读取四个字节,并将其转成int值 2   writeInt(int);//一次写入四个字节,注意和write(int)不同,write(int)只将该整数的最低一个8位写入,剩余三个8为丢失 3   hort readShort(); 4   writeShort(short); 5   String readUTF();//按照utf-8修改版读取字符,注意,它只能读writeUTF()写入的字符数据。 6   writeUTF(String);//按照utf-8修改版将字符数据进行存储,只能通过readUTF读取。 

*关键字:字节化。

 

四、打印流(PrintStream/PrintWriter)
       PrintStream是一个字节打印流,System.out对应的类型就是PrintStream,它的构造函数可以接受三种数据类型的值:1.字符串路径。2.File对象 3.OutputStream
       PrintStream是一个字符打印流,它的构造函数可以接受四种类型的值:1.字符串路径。2.File对象 3.OutputStream  4.Writer  对于1、2类型的数据,可以指定编码表,也就是字符集,对于3、4类型的数据,可以指定自动刷新,当该自动刷新为True时,只有3个方法可以 用:println,printf,format。
 
五、对象流(ObjectInputStream/ObjectOutputStream)**
        该类型的流可以把类作为一个整体进行存取,主要方法有:
        Object readObject();该方法抛出异常:ClassNotFountException。
        void writeObject(Object):被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException