JavaI/O系统全面解析
立即解锁
发布时间: 2025-08-20 00:12:51 阅读量: 2 订阅数: 14 


Java编程思想:面向对象编程的精髓与实践
### Java I/O系统全面解析
#### 1. Java 1.0与1.1类的对应关系
在Java的发展过程中,从1.0版本到1.1版本,部分类有了对应关系的变化,如下表所示:
| Java 1.0 class | Corresponding Java 1.1 class |
| --- | --- |
| PrintStream | PrintWriter |
| LineNumberInputStream | LineNumberReader |
| StreamTokenizer | StreamTokenizer(use constructor that takes a Reader instead) |
| PushBackInputStream | PushBackReader |
当需要使用`readLine()`方法时,不应再使用`DataInputStream`,而应使用`BufferedReader`,不过`DataInputStream`仍是I/O库中“首选”的成员。`PrintWriter`的构造函数可以接受任何`OutputStream`对象以及`Writer`对象,方便过渡使用。并且其构造函数有一个选项可实现自动刷新,当设置该标志后,每次调用`println()`都会自动刷新。
还有一些类在Java 1.0和Java 1.1之间保持不变,如`DataOutputStream`、`File`、`RandomAccessFile`和`SequenceInputStream`。特别是`DataOutputStream`,可直接使用,用于以可传输格式存储和检索数据时,会用到`InputStream`和`OutputStream`层次结构。
#### 2. RandomAccessFile类
`RandomAccessFile`用于处理包含已知大小记录的文件,可使用`seek()`方法在不同记录间移动,然后读取或修改记录。这些记录大小不一定要相同,只需能确定其大小和在文件中的位置即可。
`RandomAccessFile`并非`InputStream`或`OutputStream`层次结构的一部分,它实现了`DataInput`和`DataOutput`接口,但与这两个层次结构没有其他关联,是一个独立编写的类,拥有自己的(大多是本地)方法。这可能是因为它的行为与其他I/O类型本质上不同,能够在文件中前后移动。
它的工作方式类似于`DataInputStream`和`DataOutputStream`的组合,还提供了`getFilePointer()`方法来确定文件中的当前位置,`seek()`方法移动到文件中的新位置,`length()`方法确定文件的最大大小。其构造函数需要第二个参数,类似于C语言中的`fopen()`,用于指定是只读(“r”)还是读写(“rw”),不支持只写文件。
以下是一个简单的使用示例:
```java
import java.io.RandomAccessFile;
import java.io.IOException;
public class RandomAccessFileExample {
public static void main(String[] args) {
try {
RandomAccessFile rf = new RandomAccessFile("rtest.dat", "rw");
for (int i = 0; i < 10; i++) {
rf.writeDouble(i * 1.414);
}
rf.close();
rf = new RandomAccessFile("rtest.dat", "rw");
rf.seek(5 * 8);
rf.writeDouble(47.0001);
rf.close();
rf = new RandomAccessFile("rtest.dat", "r");
for (int i = 0; i < 10; i++) {
System.out.println("Value " + i + ": " + rf.readDouble());
}
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
#### 3. 典型I/O流的使用
虽然可以以多种不同方式组合I/O流类,但通常只会使用几种组合。以下是一个典型I/O配置的示例:
```java
//: c11:IOStreamDemo.java
// Typical I/O stream configurations.
import java.io.*;
public class IOStreamDemo {
// Throw exceptions to console:
public static void main(String[] args) throws IOException {
// 1. Reading input by lines:
BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
String s, s2 = new String();
while ((s = in.readLine()) != null) {
s2 += s + "\n";
}
in.close();
// 1b. Reading standard input:
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter a line:");
System.out.println(stdin.readLine());
// 2. Input from memory
StringReader in2 = new StringReader(s2);
int c;
while ((c = in2.read()) != -1) {
System.out.print((char) c);
}
// 3. Formatted memory input
try {
DataInputStream in3 = new DataInputStream(new ByteArrayInputStream(s2.getBytes()));
while (true) {
System.out.print((char) in3.readByte());
}
} catch (EOFException e) {
System.err.println("End of stream");
}
// 4. File output
try {
BufferedReader in4 = new BufferedReader(new StringReader(s2));
PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
int lineCount = 1;
while ((s = in4.readLine()) != null) {
out1.println(lineCount++ + ": " + s);
}
out1.close();
} catch (EOFException e) {
System.err.println("End of stream");
}
// 5. Storing & recovering data
try {
DataOutputStream out2 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Data.txt")));
out2.writeDouble(3.14159);
out2.writeChars("That was pi\n");
out2.writeBytes("That was pi\n");
out2.close();
DataInputStream in5 = new DataInputStream(new BufferedInputStream(new FileInputStream("Data.txt")));
BufferedReader in5br = new BufferedReader(new InputStreamReader(in5));
// Must use DataInputStream for data:
System.out.println(in5.readDouble());
// Can now use the "proper" readLine():
System.out.println(in5br.readLine());
// But the line comes out funny.
// The one created with writeBytes is OK:
System.out.println(in5br.readLine());
} catch (EOFException e) {
System.err.println("End of stream");
}
// 6. Reading/writing random access files
RandomAccessFile rf = new RandomAccessFile("rtest.dat", "rw");
for (int i = 0; i < 10; i++) {
rf.writeDouble(i * 1.414);
}
rf.close();
rf = new RandomAccessFile("rtes
```
0
0
复制全文
相关推荐










