2005/06/04 | Java文件操作的两个“踢不死” - -
类别(编程相关) | 评论(0) | 阅读(124) | 发表于 23:25
Java文件操作的两个“踢不死” - -



“踢不死”就是英文Tips的意思

1. 判断两个路径是否指向同一个文件

我们知道在Windows操作系统下文件名是不区分大小写;另外在不同的操作系统下可以用 . 来表示当前目录,或者直接只写文件名也表示默认为当前目录,例如当前目录是D:\work,那么文件D:\work\aaa.txt和.\Aaa.txt 实际上指的是磁盘上的同一个文件,但是程序怎么来判断这种情况呢?请看下面代码

/**
* 判断两个File对象是否指向同一个文件
* @throws IOException
*/
protected static void testCanonicalFile() throws IOException{
File f1 = new File("D:\work\AAA.txt");
File f2 = new File("./aaa.txt");

boolean sameFile = f1.getCanonicalFile().
equals(f2.getCanonicalFile());

System.out.println(sameFile);
}


通过getCanonicalFile方法来获取某个文件在当前操作系统下对应的目标文件,只要两个路径指向同一个文件,则两个文件对象的getCanonicalFile返回的对象一定相等,因此上面的例子打印的值是 true.

2. 强制将文件写入磁盘

操作系统包括硬件为了提供磁盘IO的性能,都会加入一个缓冲。当应用程序在读写磁盘的时候事实上是在读写缓冲区的内容,然后由操作系统负责将缓冲的内容写入磁盘空间,这样可以大大提供应用程序的IO性能,但是同样带来一个问题是可能导致数据的丢失,当应用程序写入数据后发生系统异常或者突然断电,而这个时候操作系统还没将缓冲区的数据写入磁盘时候就会发生这种情况。因为在某些应用场合,我们的程序需要确切的将数据写入到磁盘上,我们可以使用下面的代码来进行处理:

/**
* 强制将文件写入磁盘,放置因机器意外导致文件丢失
* @throws IOException
*/
protected static void testFlushToDisk() throws IOException{
FileOutputStream fos = new FileOutputStream("D:\\aaa.txt");
FileDescriptor fd = fos.getFD();
fos.write("你好,Java自由人".getBytes());
fos.flush();
fd.sync();
}


通过获取文件对象的描述符,也就是FileDescriptor实例,然后调用sync方法即可将文件写入磁盘。

0

评论Comments