Loading

CS61B_Lab6

Lab 6: Getting Started on Project 2

Goal

  1. Learn how to run Java from the command line.
  2. Learn how to process file and directories in Java.
  3. Learn how to serialize Java objects to a file and read them back later(Persistence).

Intro

我们将会通过两种方式来保存运行中程序的状态:

  1. 明文写入文件保存.
  2. 序列化对象保存到文件中.

这项技能会被直接运用到project2以及后续项目中来保存状态.

持久化 (Conceptually)

程序通过把数据写入物理硬盘来存储数据从而保持持久化(Persistence).

而同样的,java的静态变量和实例也不是持久化的,也需要我们通过文件系统来保存.

接下来,需要了解一些文件系统和命令行的知识为了完成lab6和proj2做准备.

Java与编译

$ javac *.java

可以将所有的.java文件编译为.class

$ cat Main.class

我们查看.class文件会发现有一些不可见字符,这些被称为字节码(bytecode)

Make

Unix基础命令之一make的简单使用.

$ make

单独输入make可以编译所有的java文件.

$ make check

可以用来检查代码编写的正确性.

后面的check被称为make targets.

我们可以在Makefile中编写自己的make targets

Files and Directories in Java

在我们用Java操作文件和文件夹之前,先了解一些文件系统基础.

Current Working Directory

CWD是指当前运行java程序的工作目录,我们可以通过System.getProperty("user.dir")拿到当前的CWD.

在shell中可以直接输入:

$ pwd

也可以直接拿到CWD.

Absolute and Relative Paths

绝对地址是指从根目录开始的路径,而相对地址则是相对与你当前所在目录的文件的地址.

  1. .表示当前目录
  2. ..表示上一级目录

File & Directory Manipulation in Java

File

用Java来表示一个名为dummy.txt的文件:

File f = new File("dummy.txt");

以下代码用于创建它:

f.createNewFile();

f.exists() // 用于判断文件是否存在

由于在java中对文件写入很麻烦,因此lab提供了一个Utils.java,我们可以用其中的很多方法来进行对文件进行操作.

Utils.writeContents(f, "Hello World");

Directories

File d = new File("dummy");
d.mkdir(); // 创建文件夹

Serializable

当我们想存储一个更复杂的对象的的时候,我们就不能直接写入文件了.你可能会说,我们重写对象的toString不就可以了吗?但那样还是旭阳把输出的文本解析然后才能实现类似读档的操作. 事实上,我们有一个更好的选择——序列化.

序列化帮我们把对象转换成字符串进行保存,当我们需要读档恢复它的时候,只需要进行反序列化就行.

我们只需要import java.io.Serializable,然后让想被序列化的类继承Serializable接口就可以被序列化了.

事实上,这个接口里面没有任何东西,他只是相当于一个标志提示你.

序列化代码示例:

Model m = ....;
File outFile = new File(saveFileName);
try {
    ObjectOutputStream out =
        new ObjectOutputStream(new FileOutputStream(outFile));
    out.writeObject(m);
    out.close();
} catch (IOException excp) {
    ...
}

反序列化示例:

Model m;
File inFile = new File(saveFileName);
try {
    ObjectInputStream inp =
        new ObjectInputStream(new FileInputStream(inFile));
    m = (Model) inp.readObject();
    inp.close();
} catch (IOException | ClassNotFoundException excp) {
    ...
    m = null;
}

Lab中提供的帮助函数可以帮我们减少代码量:

Model m;
File outFile = new File(saveFileName);

// Serializing the Model object
writeObject(outFile, m);


Model m;
File inFile = new File(saveFileName);

// Deserializing the Model object
m = readObject(inFile, Model.class);

Exercise: Canine Capers

One More Thing Debugging

在这个lab中,我们全程的操作没有依赖IntelliJ,那要如何使用它的debug呢?IntelliJ提过了一个叫做remote JVM debugging的功能供我们使用,从而能够在命令行操作的过程中也能下断点来debug.

注意设置REPO_DIR环境变量:

export REPO_DIR="/d/CS61B/skeleton-sp21"

字符串转Integer

Integer.parseInt(args[2])

关于git

  • 如果重写git commit -m 的提交信息有误想修改,可以使用git commit --amend -m ""来覆盖掉.
posted @ 2025-12-26 14:32  幽暗天琴沙雕  阅读(4)  评论(0)    收藏  举报