任务描述
本关任务:使用数据 IO 流向给定文件中写入给定的 3 个 int 类型数字,并把这些数字分别读取出来。
相关知识
之前我们学习了 InputStream(字节输入流)和 OutputStream (字节输出流),下面我们来了解一下它们的间接子类---DataInputStream (数据输入流)和 DataOutputStream(数据输出流)。
DataOutputStream(数据输出流)
DataOutputStream 是 FilterOutputStream 的直接子类,而 FilterOutputStream 又是 OutputStream 的直接子类,所以 DataOutputStream 是 OutputStream 的间接子类。该流允许应用程序以与机器无关的方式将 Java 基本数据类型写到底层输出流。
DataOutputStream 的构造方法
下表中是它的构造方法:
构造方法 | 说明 |
DataOutputStream(OutputStream out) | 使用底层输出流创建 DataOutputStream 对象 |
构造方法使用示例:
1. public static void main(String[] args) throws IOException {
2. // 通过文件字节输出流创建DataOutputStream对象
3. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));
4. }
DataOutputStream 的常用方法
下表是它的常用方法:
方法 | 说明 |
write(byte[] w,int off,int len) | 把字节数组中偏移量从 off 开始的 len 个字节写入此输出流 |
write(byte [] b) | 将字节数组写入此输出流 |
writeBooolean()、writeByte()、writeShort()、writeInt() | 将指定的基本数据类型以字节的方式写入到输出流 |
flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
writeUTF(String s) | 将字符串格式化顺序写入底层的输出流 |
常用方法使用示例:
1. public static void main(String[] args) throws IOException {
2. byte b[]={69,70,71,72};
3. try(
4. // 通过文件字节输出流创建DataOutputStream对象
5. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));) {
6. // 将基本数据类型写入到输出流
7. dataOutputStream.writeChar('a');
8. dataOutputStream.writeInt(69);
9. dataOutputStream.writeUTF("hello");
10. // 将字节数组写入输出流
11. dataOutputStream.write(b);
12. 13. }
14. }
执行结果(在 d.txt 文件中写入了如下内容):
1. a E helloEFGH
从以上代码中可以看出,DataOutputStream 不仅可以将像其它字节流一样把字节数组写入输出流,还可以将 Java 基本数据类型写入输出流。
DataInputStream (数据输入流)
DataInputStream 是 FilterInputStream 的直接子类,而 FilterInputStream 又是 InputStream 的直接子类,所以 DataInputStream 是 InputStream 的间接子类。该流允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。
DataInputStream 的构造方法
下表中是它的构造方法:
构造方法 | 说明 |
DataInputStream(InputStream in) | 使用底层输入流创建一个DataInputStream 对象 |
构造方法使用示例:
1. public static void main(String[] args) throws IOException {
2. // 通过文件字节输入流创建DataInputStream对象
3. DataInputStream dataInputStream = new DataInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));
4. }
DataInputStream 的常用方法
下表是它的常用方法:
方法 | 说明 |
read(byte[] r, int off, int len) | 从流中读入字节数据到缓冲区数组中指定位置,off 为数组偏移量,len 为写入长度。 |
read(byte [] b) | 从流中读入字节数据到缓冲区数组中 |
readBooolean()、readByte()、readShort()、readInt() | 从输入流中读取基本数据类型 |
readUTF() | 按照格式化顺序读底层的输入流 |
常用方法使用示例:
1. public static void main(String[] args) throws IOException {
2. try (
3. // 通过文件字节输出流创建DataOutputStream对象
4. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));
5. // 通过文件字节输入流创建DataInputStream对象
6. DataInputStream dataInputStream = new DataInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));) {
7. // 向文件顺序写出整数、boolean值、字符串
8. dataOutputStream.writeInt(69);
9. dataOutputStream.writeBoolean(true);
10. dataOutputStream.writeUTF("java");
11. // 按顺序读入数据
12. int i = dataInputStream.readInt();
13. Boolean bool=dataInputStream.readBoolean();
14. String s = dataInputStream.readUTF();
15. System.out.print("读入的整数:"+i+"。读入的boolean值:"+bool+"。读入的字符串:"+s);
16. }
17. }
执行结果:
1. 读入的整数:69。读入的boolean值:true。读入的字符串:java
需要注意的是,要用 DataInputStream 读取一个文件,这个文件必须是由 DataOutputStream 写出的,否则会出现 EOFException 异常,因为 DataOutputStream 在写出的时候会做一些特殊标记,只有 DataInputStream 才能成功的读取。
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class FileTest {
public static void main(String[] args) throws IOException {
// 接收给定的数据
Scanner scanner = new Scanner(System.in);
String filedir = scanner.next();
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
int num3 = scanner.nextInt();
// 请在此编写代码
/********** Begin **********/
// 将数字写入文件中
try (
// 通过文件字节输出流创建DataOutputStream对象
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(filedir));
DataInputStream dataInputStream = new DataInputStream(new FileInputStream(filedir));
){
dataOutputStream.writeInt(num1);
dataOutputStream.writeInt(num2);
dataOutputStream.writeInt(num3);
// 从文件中读取数字,并输出结果
int i = 0;
while (i < 3){
System.out.println("读取的数字为:" + dataInputStream.readInt());
i ++;
}
}
/********** End **********/
}
}