面向对象程序设计实践(Java)作业3

问题 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;
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值