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;