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)
-
import java.io.*;
-
public class TestIO
-
{
-
public static void main(String[] args) throws IOException
-
{
-
//1. 以行为单位从一个文件读取数据
-
BufferedReader in =new BufferedReader(new FileReader("F:\\nepalon\\TestIO.java"));
-
String s, s2 = new String();
-
while((s = in.readLine()) != null)
-
s2 += s + "\n";
-
-
//2. 接收键盘的输入
-
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
-
System.out.println("Enter a line:");
-
System.out.println(stdin.readLine());
-
-
//3. 从一个String对象中读取数据
-
StringReader in2 = new StringReader(s2);
-
int c;
-
while((c = in2.read()) != -1)
-
System.out.println((char)c);
-
in2.close();
-
-
//4. 从内存取出格式化输入
-
try
-
{
-
DataInputStream in3 = new DataInputStream(new ByteArrayInputStream(s2.getBytes()));
-
while(true)
-
System.out.println((char)in3.readByte());
-
}
-
catch(EOFException e)
-
{
-
System.out.println("End of stream");
-
}
-
-
//5. 输出到文件
-
try
-
{
-
BufferedReader in4 = new BufferedReader(new StringReader(s2));
-
PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("F:\\nepalon\\ TestIO.out")));
-
int lineCount = 1;
-
while((s = in4.readLine()) != null)
-
out1.println(lineCount++ + ":" + s);
-
out1.close();
-
in4.close();
-
}
-
catch(EOFException ex)
-
{
-
System.out.println("End of stream");
-
}
-
-
//6. 数据的存储和恢复
-
try
-
{
-
DataOutputStream out2 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("F:\\nepalon\\ Data.txt")));
-
out2.writeDouble(3.1415926);
-
out2.writeChars("\nThas was pi:writeChars\n");
-
out2.writeBytes("Thas was pi:writeByte\n");
-
out2.close();
-
DataInputStream in5 = new DataInputStream(new BufferedInputStream(new FileInputStream("F:\\nepalon\\ Data.txt")));
-
BufferedReader in5br =new BufferedReader(new InputStreamReader(in5));
-
System.out.println(in5.readDouble());
-
System.out.println(in5br.readLine());
-
System.out.println(in5br.readLine());
-
}
-
catch(EOFException e)
-
{
-
System.out.println("End of stream");
-
}
-
-
//7. 通过RandomAccessFile操作文件
-
RandomAccessFile rf = new RandomAccessFile("F:\\nepalon\\rtest.dat", "rw");
-
for(int i=0; i<10; i++)
-
rf.writeDouble(i*1.414);
-
rf.close();
-
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
-
for(int i=0; i<10; i++)
-
System.out.println("Value " + i + ":" + rf.readDouble());
-
rf.close();
-
-
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
-
rf.seek(5*8);
-
rf.writeDouble(47.0001);
-
rf.close();
-
-
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
-
for(int i=0; i<10; i++)
-
System.out.println("Value " + i + ":" + rf.readDouble());
-
rf.close();
-
-
}
-
}
|
5. 图表目录
阅读(636) | 评论(0) | 转发(0) |