1.File类
存储在程序中的数据是暂时的,当程序终止时它们就会丢失。为了能够永久地保存程序中创建的数据,需要将它们存储到磁盘或其他永久存储设备的文件中。
绝对文件名 (absolute file name) 是由文件名和它的完整 路径以 及驱动 器字母组成。而且,绝对文件名是依赖机器的。
相对文件名是相对于当前工作目录的。对于相对文件名而言,完整目录被忽略。
File 类用于提供一种抽象,这种抽象是指以不依赖机器的方式来处理很多依赖于机器的文件和路径名的复杂性。File 类包含许多获取文件属性的方法,以及重命名、删除文件和目录的方法。
在 Windows 中目 录的分隔符是反斜杠(\)。但是在 Java 中,反斜杠是一个特殊的字符,应该写成\\ 的形式。
构建一个 File 实例并不会在机器上创建一个文件。不管文件是否存在,都可以创建任意文件名的 File 实例。可以调用 File 实例上的 exists()方法来判断这个文件是否存在。
在程序中,不要直接使用绝对文件名。如果使用了像 c:\\book\\Welcome.java 之类的文件名,那么它能在 Windows 上工作,但是不能在其他平台上工作。应该使用与当前目录相关的文件名。
public class TestFileClass{
public static void main(String[] args){
java.io.File file1 = new java.io.File("image/us.gif");
java.io.File file2 = new java.io.File("hello.java";)
System.out.println(file1.exists());
System.out.println(file2.exists());
/*lastModifiedo 方法返回文件最后被修改的日期和时间
java.util.Date使用 Date 类以一种可读的格式显示它
*/
System.out.println(new java.util.Date(file1.lastModified()));
}
}
2.文件输入和输出
File 对象封装了文件或路径的属性,但是它既不包括创建文件的方法,也不包括向/从文件写/ 读数据(称为数据输入输出,简称 I/O)的方法。为了完成I/O 操作,需要使用恰’当的 Java I/O 类创建对象。这些对象包含从/ 向文件读/写数据的方法。
有两种类型的文件:文本的和二进制的。文本文件本质上是存储在磁盘上的字符。
2.1 使用 PrintWriter 写数据
java.io.PrintWriter 类可用来创建一个文件并向文本文件写入数据。
public class WriteData{
public static void main(String[] args){
java.io.File file = new java.io.File("scores.txt");
if(file.exists()){
System.out.println("File already exists");
System.exit(1);
}
}
java.io.PrintWriter output = new java.io.Printer(file);
output.print("Anne");
output.print(90);
output.close();
}
JDK 7 提供了下面的新的 try-with-resources 语法来自动关闭文件。
public class WriteDataWithAutoClose{
public static void main(String[] args)
throws Exception{
java.io.File file = new java.io.File("a.txt");
if(file.exists())
System.exit(0);
}
try{
java.io.PrintWriter outppt = new java.io.PrinterWriter(file);
}{
output.print("hello world");
output.print(8);
}
}
}
资源必须是 AutoCloseable 的子类型,比如 Printerwriter, 才具有一个 close()方法。
资源的声
明和创建必须在同一行语句中,并且可以在括号中进行多个资源的声明和创建。
块结束后,资源的 closeo 方法自动调用以关闭资源。使用 try-with-resourse 不仅可以避免错误,而且可以简化代码。
2.2 使用 Scanner 读取数据
// 从键盘读取
Scanner input = new Scanner(System.in);
// 从文件读取
Scanner input = new Scanner(new File(filename))
import java.util.Scanner;
public class ReadData{
public static void main(String[] args)
throws Exception{
java.io.File file = new java.io.File("hello.txt");
Scanner input = new Scanner(file);
while(input.hasNext()){
// input.next(),以空格为界读入。
String name = input.next();
String mi = input.next();
int age = input.nextInt();
}
input.close();
}
}
调用构造方法 new Scanner(File) 可能会抛出一个 I/O 异常。因此,main 方法声明了 throws Exception。
2.3 Scanner的工作原理
基于标记的输入方法nextByte()、nextlnt()、 nextFloat()、nextDouble()和next() 读取用分隔符分隔的输入。默认情况下,分隔符是空格。可以使用 useDelinriter(String regex) 方法设置新的分隔符模式。
一个标记读取方法首先跳过任意分隔符 (默认情况
下是空 格),然后读取一个以分隔符结束的标记。然后,针对使用的方法这个标记就分别被自动地转换为一个 short. int. long. float 或 double 类型的值。对于next()方法而言则没有进行转换。如果标记和期望的类型不匹配,就会抛出一个运行异常 java.util.InputMismatchException。
方法 next() 和 nextLine()都会读取一个字符串。方法next()读取一个由分隔符分隔的字符串,但是nextLine()读取一个以换行符结束的行。
行分隔符字符串是由系统定义的,在 Windows 平台上是 \r\n, 而在 UNIX 平台上为\n 为了得到特定平台上的行分隔符,使用String lineSeparator = System.getProperty(“1ine.separator”);
如果从键盘输入,每行就以回车键 (Enterkey) 结束,相当于\n字符。
另外,不应该在一个基于标记的输入之后使用一个基于行的输入。
3.从 Web 上读取数据
import java.util.Scanner;
public class ReadFileFromURL{
public static void main(String[] args){
String URLString = new Scanner(System.in).next();
try{
java.net.URL url1 = new java.net.URL(URLString);
int count = 0;
Scanner input = new Scanner(url.openStream);
while(input.hasNext()){
String line = input.nextLine();
cout+=line.length();
}
}
catch(java.net.MalformedURLException ex){
System.out.println("Invalid URL");
}
catch(java.io.IOException ex){
System.out.println("no such file");
}
}
}