问题 A: 二进制文件读取
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
已知一个二进制文件,文件名为dict.dic。它是由下边的代码生成。
int a ;
boolean b = true ;
double c , f ;
String d ;
DataOutputStream out = new DataOutputStream( new FileOutputStream("dict.dic"));
Scanner cin = new Scanner(System.in);
for (int i = 0 ; i < 5 ; i ++ ) {
a = cin.nextInt() ;
f = Math.random() ;
if ( f > 0.5 ) b = true ;
else b = false ;
c = cin.nextDouble() ;
d = cin.next() ;
out.writeInt(a);
out.writeBoolean(b);
out.writeDouble(c);
out.writeUTF(d);
}
out.close(); // Remember this!
cin.close();
}
你的任务是写一段程序,将这些内容读出来。
输入格式
为一个整数,只可能是1,2,3,4,5之一。
输出格式
将dict.dic中的相关内容输出到屏幕上,如果输入是1,则输出那段代码第一次循环写入的内容,如果输入是2,则输出那段代码第二次循环写入的内容,依此类推。
形式如样例。double类型的不是保留一位小数,直接输出就可以了。
样例输入
1
样例输出
100
false
72.5
helloworld
答:
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int targetLoop = cin.nextInt();
cin.close();
try (DataInputStream in = new DataInputStream(new FileInputStream("dict.dic"))) {
int a;
boolean b;
double c;
String d;
for (int i = 0; i < 5; i++) {
a = in.readInt();
b = in.readBoolean();
c = in.readDouble();
d = in.readUTF();
if (i + 1 == targetLoop) {
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d); // 输出字符串
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Keys:
在Java中,有多种文件读写方式可供选择,每种方式都有其适用的场景和特点。下面是对一些常见的文件读写方式的简要介绍:
1. FileInputStream 和 FileOutputStream:
- FileInputStream 用于从文件中读取字节数据,提供了对文件的字节级别的读取操作。
- FileOutputStream 用于向文件中写入字节数据,提供了对文件的字节级别的写入操作。
2. FileReader 和 FileWriter:
- FileReader 用于从文件中读取字符数据,提供了对文件的字符级别的读取操作。
- FileWriter 用于向文件中写入字符数据,提供了对文件的字符级别的写入操作。
3. BufferedReader 和 BufferedWriter:
- BufferedReader 提供了带缓冲的字符读取功能,可以高效地读取大文件或按行读取文本文件。
- BufferedWriter 提供了带缓冲的字符写入功能,可以高效地写入大量字符数据或按行写入文本文件。
4. DataInputStream 和 DataOutputStream:
- DataInputStream 用于从输入源中读取基本数据类型的数据,提供了对基本数据类型的读取操作。
- DataOutputStream 用于向输出源中写入基本数据类型的数据,提供了对基本数据类型的写入操作。
5. ObjectInputStream 和 ObjectOutputStream:
- ObjectInputStream 用于从输入源中读取对象,提供了对对象的序列化和反序列化操作。
- ObjectOutputStream 用于向输出源中写入对象,提供了对对象的序列化和反序列化操作。
6. RandomAccessFile:
- RandomAccessFile 提供了对文件的随机访问,可以在文件中的任意位置读写数据,支持读写指针的移动。
以上仅是列举了一些常见的文件读写方式,每种方式在不同的场景下有不同的用途和特点。根据具体的需求和文件操作的要求,选择适当的文件读写方式来实现相应的功能。同时,注意在读写完成后,需要关闭相关的流以释放资源。
在上面的代码中,首先创建了一个 FileInputStream
对象,用于打开文件。然后,将 FileInputStream
对象作为参数传递给 DataInputStream
构造函数,创建一个 DataInputStream
对象。
通过 DataInputStream
对象,我们可以使用诸如 readInt()
、readDouble()
、readBoolean()
等方法读取文件中的数据。在示例中,我们读取了一个整数、一个双精度浮点数和一个布尔值,并将它们打印出来。
最后,记得在操作完成后关闭输入流,以释放资源。
问题 B: 对象序列化
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述现有类Person和Book,其定义如下:
import java.io.Serializable;
import java.time.LocalDate;
class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name ;
private String gender ;
private LocalDate birthday ;
private String biography ;
public Person() {
}
public Person(String name , String gender , String biography ,
int year , int month ,int day) {
this.name = name ;
this.gender = gender ;
this.biography = biography ;
this.birthday = LocalDate.of(year , month , day) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;