Java的I/O操作不像C那么简单,内含了很多比较复杂的类。
简述其继承关系如下:
1、基本字节操作方面
InputStream的子类: ByteArrayInputStream, StringBufferInputStream, FileInputStream, PipedInputStream, SequeceInputStream, FilterInputStream.
OutputStream的子类: ByteArrayOutputStream, FileOutputStream, PipedOutputStream, FilterOutputStream.
2、修饰器可以为I/O类添加性能。
对于InputStream和OutputStream来说,使用FilterInputStream和FilterOutputStream的修饰器子类来修改“流”以满足特殊需要。
FilterInputStream的子类:DataInputStream, BuffedInputStream, LineNumberInputStream, PushbackInputStream.
FilterOutputStream的子类: DataOutputStream, PrintStream, BufferedOutputStream.
3、Unicode操作方面
其中有很多子类对应于字节操作的子类。
I/O使用的例子(参考《thinking in java》),仅仅是说明这些情况下可以使用这些类,而不是说不可以使用别的类。
1、reading input by lines,使用BufferedReader。
如果是从文件读取输入的话,实例如下:
BufferedReader in = new BufferedReader( new FileReader(filename));
String s = in.readLine();
如果是从标准输入读取的话,实例如下:
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
//System.in 是一个InputStream,而BufferedReader需要的是
//一个Reader对象,所以需要用InputStreamReader来转换。
String s = in.readLine();
2、input from memory,使用StringReader。
假设s是一个String的实例,则以下代码从s中每次读取一个字符:
StringReader in = new StringReader(s);
int c;
while( (c = in.read()) != -1)
...
3、formatted memory input,使用DataInputStream。
由于以byte类型作为示例,所以还用到了ByteArrayInputStream。
该示例抛出异常。
假设s为String的实例。
try{
DataInputStream in = new DataInputStream(
new ByteArrayInputStream(s.getBytes()));
//这个例子用来从Byte Array中读取基本类型的数据
while(true)
System.out.println((char)in.readByte());//由于read返回int型值,
//所以需要进行char的类型转换
}catch (IOException e)
{
System.out.println("end");
}
4、file output,用PrintWriter输出可读的数据到文件中。该类抛出异常。
PrintWreter out = new PrintWriter(
new BufferedWriter( new FileWriter(filename)) );
具备println方法: out.println(...);
5、storing and recovering data,该实例并不是为了让人们可读数据,而是为了在一个文本中暂存数据,之后将数据读出。就是说,该实例是面向机器可读的。使用了DataInputStream和DataOutputStream。
该实例抛出异常。
首先向一个文本写入机器可读的数据:
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(filename)));
out.writeDouble(...);
out.writeUTF(...);
...
out.close();
之后从这个文本中读取数据:
DataInputStream in = new DataInputStream(
new BufferdInputStream(
new FileInputStream(filename)));
Double d = in.readDouble();
... = in.readUTF();
...
in.close();