文本I/O
文件名是一个字符串,File类是文件名及其目录路径的一个包装类
File类用于提供一种抽象,这种抽象指以不依赖机器的方式来处理很多依赖于机器的文件和路径名的复杂性。
File类包含获取文件属性的方法,以及重命名,删除文件和目录的方法。但不包含读写文件内容的方法。
java.io.File
+File(pathname: String)
为一个指定路径名创建一个File对象,路径名可能一个目录或一个文件
+File(parent: String, child: String)
在目录parent下创建一个子路径的File对象,子路径可能是一个目录或一个文件
+File(parent: File, child: String)
目录parent是File对象,在它之下创建一个子路径的File对象
+exists(): boolean
File对象代表的文件或目录存在,返回true
+canRead(): boolean
File对象代表的文件存在且可读,返回true
+canWrite(): boolean
File对象代表的文件存在且可写,返回true
+isDirectory(): boolean
File对象代表的是一个目录,返回true
+isFile(): boolean
File对象代表的是一个文件,返回true
+isAbsolute(): boolean
File对象是采用绝对路径名创建,返回true
+getAbsolutePath(): String
返回File对象代表的完整的文件或者目录的绝对路径名
+getCanonicalPath(): String
和getAbsolutePath()一样
+getName(): String
返回File对象代表的目录和文件名的最后名字
+getPath(): String
返回File对象代表的完整目录和文件名
+getParent(): String
返回File对象代表的当前目录或文件的完整父目录
+lastModified(): long
返回文件最后修改时间
+length(): long
返回文件大小。如果不存在或是一个目录的话,返回0
+listFile(): File[]
返回一个目录File对象下面的文件
+delete(): boolean
删除File对象代表的文件或目录。如果删除成功,方法返回true
+renameTo(dest: File): boolean
将该File对象代表的文件或目录名改为dest中指定的名字。如果操作成功,返回true
+mkdir(): boolean
创建该File对象代表的目录。如果成功,返回true
+mkdirs():boolean
和mkdir相同。除了在父目录不存在的情况下,将一并创建父目录
构建一个File实例并不会在机器上创建一个文件。不管文件是否存在,都可以创建任意文件名的File实例。可调用File实例上的exists()方法来判断此文件是否存在应使用与当前目录相关的文件名。如 new File(“Welcome.java”)//为当前目录下的文件Welcone.java创建一个File对象
new File(“image/us.gif”)//为当前目录下image目录下的文件us.gif创建一个File对象。
java.io.File file = new java.io.File(“image/us.gif”);
由于lastModified()方法返回文件最后被修改的日期和时间,它计算从UNIX时间(1970,1,1,0:0:0)开始的毫秒数,我们可用new java.util.Date(file.lastModified())以一种可读的格式显示它。
文件输入和输出(I/O)
Scanner类从文件中读取文本数据,使用PrinterWriter类向文本文件写入数据。(数据输入输出,简称I/O)
两种类型文件:文本文件和二进制文件
PrinterWriter写数据
java.io.PrintWriter类可用来创建一个文件并向文本文件写入数据首先为一个文本文件创建一个PrintWriter对象:
PrintWriter output = new PrintWriter(filename);
java.io.PrintWriter
+PrintWriter(file: File)
为指定的文件对象创建一个PrintWriter对象
+PrintWriter(filename: String)
为指定的文件名字符串创建一个PrintWriter对象
+print(s: String): void
将字符串写入文件中
+print(c: char): void
将字符写入文件中
+print(cArray: char[]): void
将字符数组写入文件中
+print(i: int): void
将一个int值写入文件中
+print(l: long): void
将一个long值写入文件中
+print(f: float): void
将一个float值写入文件中
+print(d: double): void
将一个double值写入文件中
+print(b: boolean): void
将一个boolean值写入文件中
调用PrintWriter的构造方法可能会抛出I/O异常。Java强制要求编写代码来处理这类异常,简单起见,只需在方法头声明中声明throws Execption。且必须使用close()方法关闭文件。如果没有调用该方法,则数据不能正确地保存在文件中。
可以使用try-with-resources自动关闭资源
try(声明和创建资源){
使用资源来处理文件;
}
例:
try(
//资源的声明和创建必须在同一行语句中,并且可以在括号中进行多个资源的声明和创建
java.io.PrintWriter output = new java.io.PrintWriter(file);
) {
output.print("John T amith");
}
块语句使用资源结束后,资源的close()方法自动调用以关闭资源。
资源必须是AutoCloseable的子类型,如PrintWriter,才具有一个close()方法。
Scanner读取数据
从文件读取,需为文件创建一个Scanner:Scanner input = new Scanner(new File(filename));
java.util.Scanner
+Scanner(source: File)
创建一个Scanner,从指定文件中产生扫描的值
+Scanner(source: String)
创建一个Scanner,从指定字符串中产生扫描的值
+close()
关闭Scanner
+hasNext(): boolean
如果Scanner还有更多数据可以读取,则返回true
+next(): String
从Scanner中读取下一个标记作为字符串返回
+nextLine(): String
从Scanner中读取一行,以换行结束
+nextByte(): byte
从Scanner中读取下一个标记作为byte值返回
+nextShort(): short
从Scanner中读取下一个标记作为short值返回
+nextInt(): int
从Scanner中读取下一个标记作为int值返回
+nextLong(): long
从Scanner中读取下一个标记作为long值返回
+nextFloat(): float
从Scanner中读取下一个标记作为float值返回
+nextDouble(): double
从Scanner中读取下一个标记作为double值返回
+useDelimiter(pattern: String): Scanner
设置Scanner的分隔符,并且返回Scanner
Scanner一个小注意点
基于标记的读取方法(nextInt,nextbyte等等)不能读取标记后面的分隔符。在基于标记的读取方法之后调用nextLine(),该方法读取从这个分隔符开始,到这行的行分隔符结束的字符。
int value = input.nextInt();
String line = input.nextLine();
若文本文件内容是34 567 ,则value值为34,而line包含的字符为’ ', ‘5’,‘6’,‘7’。从键盘输入34,然后按回车键,再输入567,则value值为34,line是一个空字符串。
从Web上读取数据
我们可以从Web上文件的URL访问Web上文件中的数据。使用java.net.URL类的构造方法创建一个URL对象
查了一下API文档:URL(String spec) Creates a URL object from the String representation.//从字符串表示形式创建URL对象
Constructor Detail:
public URL(String spec) throws MalformedURLException{
try{
URL url = new URL(“http://www.google.com/index.html”);
}
catch (MalformedURLException ex) {
ex.printStackTrace();
}
}
如果URL字符有语法错误,会抛出一个MalformedURLException,如http:后面少了双斜杠就会引起一个MalformedURLException运行错误。
注意,要让URL类识别一个有效的URL,前缀http://是必需的。
见ReadFileFromURL.java
import java.net.MalformedURLException;
import java.net.URL;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class ReadFileFromURL {
public static void main(String[] args) {
System.out.println("Enter a URL:");
//程序提示用户输入一个URL字符串
String URLString = new Scanner(System.in).next();
try {
URL url = new URL(URLString);
int count = 0;
//使用URL类中定义的openStream()方法来打开一个输入流,并用这个输入流创建一个Scanner对象
Scanner input = new Scanner(url.openStream());
while (input.hasNext()) {
String line = input.nextLine();
count += line.length();
}
System.out.println("The file size is " + count + " characters");
}
catch (MalformedURLException ex) {
System.out.println("Invalid URL");
}
catch (IOException ex) {
System.out.println("I/O Errors: no such file");
}
}
}
如果没有正确表示URL,则构造方法将抛出一个
java.net.MalformedURLException;若给出的URL正确但不存在,将抛出一个IOException.