一、问答题 1. 如果准备按字节读取一个文件的内容,应当使用FileInputStream流还是FileReader流? 2. FileInputStream流的read方法和FileReader流的read方法有何不同? 3. BufferedReader流能直接指向一个文件吗? 4. 使用ObjectInputStream和ObjectOutputStream类有哪些注意事项? 5. 怎样使用输入、输出流克隆对象?
时间: 2024-02-26 21:55:47 浏览: 26
1. 如果准备按字节读取一个文件的内容,应当使用FileInputStream流。
2. FileInputStream流的read方法返回的是一个字节,而FileReader流的read方法返回的是一个字符。
3. BufferedReader流不能直接指向一个文件,但可以通过将FileReader流包装在BufferedReader流中来读取文件。
4. 使用ObjectInputStream和ObjectOutputStream类需要注意以下事项:
- 被序列化的类必须实现Serializable接口。
- 如果被序列化的类中有引用其他对象的成员变量,那么这些引用对象也必须是可序列化的。
- 如果被序列化的类中有static或transient修饰的成员变量,那么这些成员变量不会被序列化。
- 在序列化和反序列化时,要注意对象的顺序,先写入的对象要先读取出来。
5. 可以使用输入、输出流克隆对象的步骤如下:
- 使用ObjectOutputStream将对象写入输出流中。
- 使用ByteArrayOutputStream获取输出流中的字节数组。
- 使用ByteArrayInputStream将字节数组包装为输入流。
- 使用ObjectInputStream从输入流中读取对象。
相关问题
编写一个程序,分别使用字节流和字符流复制一个文本文件。要求如下: (1)使用FileInputStream、FileOutputStreaem 和FileReader、FileWriter分别进行复制。
以下是使用字节流和字符流分别复制文本文件的示例代码:
使用字节流:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("source.txt");
fos = new FileOutputStream("target.txt");
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} finally {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
}
}
}
```
使用字符流:
```java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamCopy {
public static void main(String[] args) throws IOException {
FileReader reader = null;
FileWriter writer = null;
try {
reader = new FileReader("source.txt");
writer = new FileWriter("target.txt");
char[] buffer = new char[1024];
int len;
while ((len = reader.read(buffer)) != -1) {
writer.write(buffer, 0, len);
}
} finally {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
}
}
}
```
其中,`source.txt` 是要复制的源文件,`target.txt` 是复制后的目标文件。使用字节流复制文件时,需要使用 `FileInputStream` 和 `FileOutputStream` 类,而使用字符流复制文件时,需要使用 `FileReader` 和 `FileWriter` 类。在复制过程中,需要使用一个缓冲区来存储读取的数据,并使用 `read()` 和 `write()` 方法进行读取和写入操作。最后,需要在 finally 块中关闭流。
1. 用FileOutputStream类向文件中写入一串字符,然后用FileInputStream读出写入的内容。 2. 编写一个程序实现将字节流转换为字符流。
好的,我来回答你的两个问题:
1. 用FileOutputStream类向文件中写入一串字符,然后用FileInputStream读出写入的内容。
可以使用以下代码实现:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamDemo {
public static void main(String[] args) {
String str = "Hello, World!";
File file = new File("test.txt");
try (FileOutputStream fos = new FileOutputStream(file);
FileInputStream fis = new FileInputStream(file)) {
// 写入字符串
fos.write(str.getBytes());
// 读取文件内容
byte[] buffer = new byte[(int) file.length()];
fis.read(buffer);
// 将字节数组转换成字符串并输出
String fileContent = new String(buffer);
System.out.println(fileContent);
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
在上面的代码中,我们首先创建一个名为“test.txt”的文件,然后使用FileOutputStream将字符串“Hello, World!”写入文件中。接下来,我们使用FileInputStream读取文件内容,并将字节数组转换为字符串并输出。最后,我们使用try-with-resources语句来确保在退出try块时关闭文件流。
2. 编写一个程序实现将字节流转换为字符流。
可以使用InputStreamReader和OutputStreamWriter类来实现将字节流转换为字符流。以下是一个示例代码:
```java
import java.io.*;
public class ByteToCharStreamDemo {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis);
FileOutputStream fos = new FileOutputStream("test_copy.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos)) {
// 将字节流转换为字符流并复制文件
int c;
while ((c = isr.read()) != -1) {
osw.write(c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
在上面的代码中,我们首先使用FileInputStream读取名为“test.txt”的文件,然后使用InputStreamReader将字节流转换为字符流。接下来,我们使用FileOutputStream创建一个名为“test_copy.txt”的文件,并使用OutputStreamWriter将字符流转换为字节流。最后,我们使用while循环从InputStreamReader中读取字符,并使用OutputStreamWriter将它们写入OutputStreamWriter中。最后,我们使用try-with-resources语句来确保在退出try块时关闭文件流。