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操作文本数据时,该对象使用的时默认的编码表,即
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读取。
*关键字:字节化。