CS61B_Lab6
Lab 6: Getting Started on Project 2
Goal
- Learn how to run Java from the command line.
- Learn how to process file and directories in Java.
- Learn how to serialize Java objects to a file and read them back later(Persistence).
Intro
我们将会通过两种方式来保存运行中程序的状态:
- 明文写入文件保存.
- 序列化对象保存到文件中.
这项技能会被直接运用到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
绝对地址是指从根目录开始的路径,而相对地址则是相对与你当前所在目录的文件的地址.
.表示当前目录..表示上一级目录
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 ""来覆盖掉.

浙公网安备 33010602011771号