存储在变量、数组和对象中的数据是暂时的,当程序终止时它们就会丢失。为了能够永久地保存程序中创建的数据,需要将他们存储到磁盘或光盘上的文件中。这些文件可以传送,也可以随后被其他程序使用。本次主要学习使用File类获取文件的属性以及删除和重命名文件。

在文件系统中,每个文件都存放在一个目录下。绝对文件名(absolute file name) 是由 文件名和它的完整路径以及驱动器字母组成。例如,c:\book\welcome.java是文件Welcome.java在Windows操作系统上的绝对文件名。这里的c:\book称为该文件的目录路径(directory path)。绝对文件名是依赖机器的。在UNIX平台上,绝对文件名可能会是/home/liang/book/Welcome.java,其中/home/liang/book是文件Welcome.java的目录路径。

File类特意提供了一种抽象,这种抽象是指以不依赖机器的方式来处理很多文件和路径名依赖机器的复杂问题。File类包含许多获取文件属性的方法以及重命名和删除文件的方法,但是File类不包含读写文件的方法。

文件保存到nfs上名称乱码 文件名files_文件保存到nfs上名称乱码


文件名是一个字符串。File类是文件名及其目录路径的一个包装类。例如,在windows中,语句new File(“c:\book”)在目录c:\book下创建一个File对象,而语句new File(”c:\book\test.dat”)为文件c:book\test.dat创建一个File对象。可以用File类的isDirectory()方法来判断这个对象是否表示一个目录,还可以用isFile()方法来判断这个对象是否表示一个文件名。

警告 在Windows中目录的分隔符是反斜杠(\)。但是在Java中,反斜杠是一个特殊字符,应该写成\的形式。

构建一个File实例并不会在机器上创建一个文件。不管文件是否存在,都可以创建任意文件名的File实例。可以通过实例上的exists()方法来判断这个文件是否存在。

在程序中,不能直接使用绝对文件名。如果使用了像“c:\book\Welcome.java”之类的文件名,那么它能在Windows上工作,但是不能再其他平台上工作。应该使用与当前目录相关的文件名。例如,可以使用new File(“Welcome.java”)为当前目录下的文件Welcome.java创建一个File对象。可以使用new File(“image/us.gif”)为当前目录下的image目录下的文件us.gif创建一个File对象。斜杠(/)是java的目录分隔符,这点和UNIX是一样的,语句new File(“image/us.gif”)在Windows、UNIX或任何其他系统上都能工作。

下面演示出个创建一个File对象,以及如何使用File类中的方法获取它的属性。这个程序为us.gif差创见了一个File对象。这个文件存储在当前目录的image目录下。

public class TestFileClass {
public static void main(String args){
File file = new File("image/us.gif");
System.out.println("Does it exist?" + file.exists());
System.out.println("The file has " + file.length() + " bytes");
System.out.println("Can it be read?" + file.canRead());
System.out.println("Can it be written?" + file.canWrite());
System.out.println("Is it a directory?" +file.isDirectory());
System.out.println("Is it a file?" + file.isFile());
System.out.println("Is it absolute?" + file.isAbsolute());
System.out.println("Is it hidden?" + file.isHidden());
System.out.println("Absolute path is "+file.getAbsolutePath());
System.out.println("Last modified on " +  new Date (file.lastModified());

}
}

lastModified()方法返回文件最后被修改的日期和时间,它计算的是从UNIX时间(1970年1月1日0时0分0秒)开始的毫秒数,第14~15行使用Date类以一种易读的格式显示它。
文件的输入输出
File对象封装了文件或路径的属性,但是它既不包括创建文件,也不包括从文件读写数据的方法。为了完成I/O操作,需要使用恰当的java I/O类创建对象。这些对象包含从(向)文件读(写)数据的方法。
使用PrintWriter写数据
PrintWriter类可用来创建一个文件并向文本文件写入数据。首先,必须为一个文本文件创建一个PrintWriter对象,如下所示:

PrintWriter output = new PrintWriter(filename);

然后,可以调用PrinterWriter对象上的print、println和printf方法向文件写入数据。

文件保存到nfs上名称乱码 文件名files_java_02


下面的程序创建了一个PrintWriter实例并且向文件“score.txt”中写入两行数据的例子。

public class WriteData {
  public static void mian(String[] args) throws Exception{
  File file = new File("scores.txt");
  if(file.exists()){
     System.out.println("File already exists");
     System.exit(0);
  }
  PrintWriter output = new PrintWriter(file);
  output.print("John T Smith");
  output.println(90);
  output.print("Eric K Jones");
  output.println(85);
  output.close();
  }
}

首先检查文件是否存在,存在则退出程序。
如果不存在,调用PrintWriter的构造方法会创建一个新文件。如果文件已经存在,那么文件的当前内容将被废弃。
调用PrintWriter的构造方法可能会抛出某中I/O异常。Java强制要求编写代码来处理这类异常。