Chinaunix首页 | 论坛 | 博客
  • 博客访问: 334111
  • 博文数量: 80
  • 博客积分: 711
  • 博客等级: 上士
  • 技术积分: 733
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-23 15:43
文章分类

全部博文(80)

文章存档

2015年(9)

2014年(14)

2013年(33)

2012年(24)

我的朋友

分类: Java

2013-05-16 18:24:03

1. 流(Stream)的定义

Java中,一个可以读取字节的序列叫做输入流(Input Stream),一个可以写入字节的序列叫做输出流(Output Stream),分别在抽象类InputStream和OutputStream中进行了说明。由于以字节的形式处理Unicode编码不方便(Unicode编码占两个字节),所以还专门针对Unicode编码提供字符读/写流,分别在抽象类Reader和Writer中进行了说明。


2. 完整的流结构


在C语言中,流的处理只需要一个FILE *类型,但在Java类库中,IO部分的内容是很庞大的,其设计者声称这样为用户提供了更丰富的选择,同时也减少程序的流使用错误。当然它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等。主要包含以下几大类:

2.1. 对于字节流

Input stream

1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用

2) StringBufferInputStream:把一个String对象作为InputStream

3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作

4) PipedInputStream:实现了pipe的概念,主要在线程中使用

5) SequenceInputStream:把多个InputStream合并为一个InputStream

Output stream

1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中

2) FileOutputStream:把信息存入文件中 

3) PipedOutputStream:实现了pipe的概念,主要在线程中使用

4) SequenceOutputStream:把多个OutStream合并为一个OutStream

2.2. 对于字符流

Input Stream

1) CharArrayReader:与ByteArrayInputStream对应

2) StringReader:与StringBufferInputStream对应

3) FileReader:与FileInputStream对应 

4) PipedReader:与PipedInputStream对应

Output Stream

1) CharArrayWrite:与ByteArrayOutputStream对应

2) StringWrite:无与之对应的以字节为导向的stream 

3) FileWrite:与FileOutputStream对应

4) PipedWrite:与PipedOutputStream对应

2.3. 两者之间的转换

InputStreamReader和OutputStreamReader能够将一个字节流转换成字符流.


3.过滤流的使用


运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。
假如我们要往一个文件中写入数据,我们可以这样操作:
    FileOutStream fs = new FileOutStream(“test.txt”);

然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,假如我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。

3.1. 过滤的字节输入流

1) DataInputStream:从stream中读取基本类型(int、char等)数据。

2) BufferedInputStream:使用缓冲区

3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)

4) PushbackInputStream:很少用到,一般用于编译器开发  

3.2. 过滤的字符输入流

1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream

2) BufferedReader:与BufferedInputStream对应 

3) LineNumberReader:与LineNumberInputStream对应

4) PushBackReader:与PushbackInputStream对应

3.3 过滤的字节输出流

1) DataIOutStream:往stream中输出基本类型(int、char等)数据。

2) BufferedOutStream:使用缓冲区

3) PrintStream:产生格式化输出

3.4. 过滤的字符输出流

1) BufferedWrite:与对应

2) PrintWrite:与对应

3.5 RandomAccessFile

可通过RandomAccessFile对象完成对文件的读写操作,在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写。可以直接跳到文件中指定的位置。


4. 使用示例


在InputStream/Reader,OutputStream/Writer中定义了完全向相同的端口,分别为

int read()

int read(char cbuf[])

int read(char cbuf[], int offset, int length)

int write()

int write(char cbuf[])

int write(char cbuf[], int offset, int length)

 


  1. import java.io.*;    
  2. public class TestIO    
  3. {    
  4.     public static void main(String[] args)    throws IOException    
  5.     {    
  6.         //1. 以行为单位从一个文件读取数据    
  7.         BufferedReader in =new BufferedReader(new FileReader("F:\\nepalon\\TestIO.java"));    
  8.         String s, s2 = new String();    
  9.         while((s = in.readLine()) != null)    
  10.             s2 += s + "\n";    
  11.  
  12.         //2. 接收键盘的输入    
  13.         BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));    
  14.         System.out.println("Enter a line:");    
  15.         System.out.println(stdin.readLine());     
  16.       
  17.         //3. 从一个String对象中读取数据    
  18.         StringReader in2 = new StringReader(s2);    
  19.         int c;    
  20.         while((c = in2.read()) != -1)    
  21.             System.out.println((char)c);    
  22.         in2.close();    
  23.          
  24.         //4. 从内存取出格式化输入    
  25.         try    
  26.         {    
  27.             DataInputStream in3 = new DataInputStream(new ByteArrayInputStream(s2.getBytes()));    
  28.             while(true)    
  29.                 System.out.println((char)in3.readByte());    
  30.         }    
  31.         catch(EOFException e)    
  32.         {    
  33.             System.out.println("End of stream");    
  34.         }     
  35.       
  36.         //5. 输出到文件    
  37.         try    
  38.         {    
  39.             BufferedReader in4 = new BufferedReader(new StringReader(s2));    
  40.             PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("F:\\nepalon\\ TestIO.out")));    
  41.             int lineCount = 1;    
  42.             while((s = in4.readLine()) != null)    
  43.                 out1.println(lineCount++ + ":" + s);    
  44.             out1.close();    
  45.             in4.close();    
  46.         }    
  47.         catch(EOFException ex)    
  48.         {    
  49.             System.out.println("End of stream");    
  50.         }     
  51.      
  52.         //6. 数据的存储和恢复    
  53.         try    
  54.         {    
  55.             DataOutputStream out2 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("F:\\nepalon\\ Data.txt")));    
  56.             out2.writeDouble(3.1415926);    
  57.             out2.writeChars("\nThas was pi:writeChars\n");    
  58.             out2.writeBytes("Thas was pi:writeByte\n");    
  59.             out2.close();    
  60.             DataInputStream in5 = new DataInputStream(new BufferedInputStream(new FileInputStream("F:\\nepalon\\ Data.txt")));    
  61.             BufferedReader in5br =new BufferedReader(new InputStreamReader(in5));    
  62.             System.out.println(in5.readDouble());    
  63.             System.out.println(in5br.readLine());    
  64.             System.out.println(in5br.readLine());    
  65.         }    
  66.         catch(EOFException e)    
  67.         {    
  68.             System.out.println("End of stream");    
  69.         }     
  70.     
  71.         //7. 通过RandomAccessFile操作文件    
  72.          RandomAccessFile rf = new RandomAccessFile("F:\\nepalon\\rtest.dat", "rw");    
  73.         for(int i=0; i<10; i++)    
  74.             rf.writeDouble(i*1.414);    
  75.         rf.close();    
  76.         rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");    
  77.         for(int i=0; i<10; i++)    
  78.             System.out.println("Value " + i + ":" + rf.readDouble());    
  79.         rf.close();    
  80.   
  81.         rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");    
  82.         rf.seek(5*8);    
  83.         rf.writeDouble(47.0001);    
  84.         rf.close();    
  85.   
  86.         rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");    
  87.         for(int i=0; i<10; i++)    
  88.             System.out.println("Value " + i + ":" + rf.readDouble());    
  89.         rf.close();    
  90.     
  91.     }    
  92. }

5. 图表目录

 

Java - IO

阅读(536) | 评论(0) | 转发(0) |
0

上一篇:Java中的try-catch-finally块

下一篇:Java-Regex

给主人留下些什么吧!~~