cs61b数据结构与算法笔记 Project2 Gitlet

Lab6:Project2入门

文件

在java中,可以使用file构造函数创建file对象,并传入文件路径(相对路径)

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

您可以将此 File 对象视为对实际文件 dummy.txt 的引用--当我们创建新的 File 对象时,我们实际上并没有创建 dummy.txt 文件本身,我们只是在说:"将来,当我对 f 执行操作时,我想对 dummy.txt 执行这些操作"。要实际创建这个 dummy.txt 文件,我们可以调用

f.createNewFile();

查看是否存在文件:

f.exists();

对于对文件的读写,我们有java.utils可以使用。例如

Utils.writeContents(f, "HWorld");

将一个字符串HWorld写入文件f(即上文dummy.txt)。

目录

java里目录也用File对象来表示。例如

File d = new file("dummy");
//将d定义到一个dummy文件夹

和文件一样,上面这条命令不能创建。创建如下:

d.mkdir();

file类:

Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。

File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创建一个File对象。

简单的实现如下:

通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。

File(File parent, String child);

通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

File(String pathname) 

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(String parent, String child) 

通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。

File(URI uri) 

创建File对象成功后,可以使用以下列表中的方法操作文件:

例如:已有file对象CAPERS_FOLDER:

CAPERS_FOLDER.mkdir();        //创建CAPERS_FOLDER指定的目录。

public String getName()
返回由此抽象路径名表示的文件或目录的名称。

public boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
public boolean delete()
 删除此抽象路径名表示的文件或目录。

public boolean mkdir()
创建此抽象路径名指定的目录。

public boolean mkdirs()
创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。

 File类里还有很多方法。

 使用实例:

        File file1 = new File("D:\\aaa\\a.txt");
        File file2 = new File("D:\\aaa","a.txt");
        File file3 = new File("a.txt");
        System.out.println(file1);
        System.out.println(file2);
        System.out.println(file3);
 
        System.out.println("=================================");
        // 关键File类对象表示"D:\aaa\bbb"文件夹路径
        File file4 = new File("D:\\aaa\\bbb");
        File file5 = new File("D:\\aaa","bbb");
        File file6 = new File("bb");
        System.out.println(file4);
        System.out.println(file5);
        System.out.println(file6);
 
        System.out.println("=================================");
        File file7 = new File("D:\\aaa\\abcdefg");
        System.out.println(file7);
 
/*
        输出结果:
            D:\aaa\a.txt
            D:\aaa\a.txt
            a.txt
            =================================
            D:\aaa\bbb
            D:\aaa\bbb
            bb
            =================================
            D:\aaa\abcdefg
*/

可序列化

java对象是运行在JVM的堆内存中的,JVM停止后对象就消失了。如果想要将对象存储到磁盘中,我们可以将其序列化

序列化是将对象转换为一系列字节的过程,这些字节可以存储在文件中。然后,我们可以反序列化这些字节,并在将来调用程序时取回原始对象。

序列化机制可以使对象脱离程序独立存在,还让Java对象能够在网络上传输。

要为 Java 中的指定类启用这一功能,只需实现 java.io.Serializable 接口即可:

import java.io.Serializable;
public class Model implements Serializable{
}

该接口没有任何方法;它只是为一些特殊的 Java 类标记其子类型,以便在对象上执行 I/O。例如

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

会将 m 转换为字节流,并将其存储到文件中,文件名存储在 saveFileName 中。然后就可以用代码序列重构对象,例如

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;
}

Java 运行时会计算哪些字段需要转换为字节,以及如何转换。您需要对对象进行序列化,因此为了减少您需要编写的代码量,我们在 Utils.java 中提供了处理读写对象的辅助函数。

请注意,上面的代码非常烦人,其中包含大量神秘类和 try/catch 语句。如果使用 Utils 类中的辅助函数,序列化就会变得非常简单:

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);

注意:Project 2 规范中指出了 Serializable 的一些限制。在本实验室中不会遇到这些限制。

注:implements 继承 

Serializable接口没有方法或字段,一旦实现了此接口,就标志该类对象可以被序列化。

public interface Serializable{
}

注:Java反射 Class方法

获取一个类对应的Class类的方法

1.使用Object.getClass ()方法----引用类型的对象的获取方式

如果我们已经拿到了一个对象,可以使用这个对象的 getClass 方法获得一个 Class 对象(不过这仅限于引用类型的对象):

String string=new String();
//使用已经存在的对象的getClass()方法获取Class对象
Class  class1=string.getClass();


2.使用类的class成员属性

如果我们当前没有某个类的对象,无法使用 getClass() 方法来获取Class对象,那还可以使用 类名.class 来获取 Class对象:

//使用 类名.class来获取Class对象
Class class2=String.class;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值