javaI/O流学习小结

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

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

特点:

字节流:读到一个字节就返回一个字节,并且可以处理诸如MP3,avi,jpg等格式的文件。

字符流:读到字节时先按照编码规则转化,然后输出。只能处理纯文本数据。

节点流:

类型字符流字节流
File(文件)
FileReader
FileWriter
FileInputStream
FileOutputSream
Memory Array
CharArrayReader
CharArrayWriter
ByteArrayInputStream
ByteArrayOutputSream
Memory String
StringReader
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.Serializable
16 {
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         try
25         {
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         try
48         {
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 block
72                 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

转载于:https://www.cnblogs.com/kangh/p/5255036.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值