文件类
存储在变量、对象中的数据是暂时的,程序终止的时候就会消失,将数据存储到文件中,可以使得数据可以传送并被其他程序使用。在面向对象的程序设计中,万物皆对象,所以为了允许程序对文件进行处理,需要把一个文件抽象成对象,在java中,获取文件属性以及删除、重命名文件等工作由File类来完成。
File类包含许多获取文件属性、删除文件等方法,但是,File类不包含创建文件和读写文件内容的方法 ,使用File类需要引入包java.io.File
在文件系统中,每个文件都存放在一个目录下,一个File类实例表示一个目录/文件,但是需要注意,创建一个file实例并不会在机器上创建一个文件,无论文件是否存在,都可以创建任意文件名的file实例,可以调用exists()方法来判断文件是否存在。
File对象封装了文件或路径的属性,但是不包括创建文件、读写文件数据的方法,为了完成I/O操作,需要使用java I/O类创建对象来完成。可以使用Scanner和PrintWriter类读写文本文件的内容。
例如:
File file =new File("image/us.gif");
创建了一个代表image/us.gif这个文件的对象file,在后续的操作中,用到文件的地方都用file这个对象来表示。
Windows中目录分隔符是反斜杠(),如
C:\book\hi.java
,但在java中反斜杠是特殊字符,所以windows文件目录应该表示为C:\\book\\hi.java
。Unix中文件目录分隔符为斜杠(/),如/home/jing/hi.java
。Java的目录分隔符也是(/),语句new File("image/us.gif")
在Windows、Unix或者其他任何系统上都能工作。
通过File类我们已经把一个具体的文件抽象成了java世界中的对象,接下来需要对这个文件进行创建、写入、读取。对于文件的输入/输出,Java提供了许多类,这些类可以分为文本I/O类和二进制I/O类。本文介绍文本I/O,二进制I/O另开文章介绍
对于文本,创建和写入的工作由输出对象--PrintWriter对象来完成,读取的工作由输入对象--Scanner对象来完成。输入对象(也称输入流,input stream)从文件读取数据流,输出对象(也称输出流,outputream)将数据流写入文件。
PrintWriter写数据
java.io.PrintWriter类实例可以创建一个文件,并向文本文件写入数据。
PrintWriter中的常用方法:
方法 | 方法描述 |
PrintWriter(File f) | 为指定的文件对象f创建一个PrintWriter对象,这个对象专门负责对文件f进行各种写入操作。如果文件不存在,则创建该文件,如果存在,则文件的当前内容被废弃。调用构造函数可能抛出异常,需要进行处理 |
PrintWriter(String fileName) | 为指定的文件名字符串创建一个PrintWriter对象 |
print() | 向文件中写入内容,根据参数不同,有各种重载方法,写入字符串、double型、int型等等 |
println() | 比print()多打印一个行分隔符,行分隔符是由系统定义的,Windows是\r\n,Unix系统是\n |
close() | 必须使用close()方法关闭文件,否在写入的数据不能正确的保存到文件中 |
例如:
import java.io.File
import java.io.PrintWriter
public class WriteData{
public static void main(String[] args){
File f=new File("a.txt");
try {
PrintWriter output=new PrintWriter(f);
output.print("hiworld");
output.close();
}catch (Exception e) {
System.out.println("写文件错误");
}
}
以上程序,为a.txt文件创建一个文件对象,为该文件对象创建写入对象,通过写入对象写入“hi java”,最后关闭该文件。
注意:
1. 调用PrintWriter的构造方法可能抛出I/O异常,注意处理
2. 必须使用close()方法关闭文件,否在写入的数据不能正确的保存到文件中
Scanner读数据
java.util.Scanner
类用来读取字符串和基本类型数值,将输入分为由空白字符分隔的有用信息,为了从文件或者键盘读取数据,需要为文件或System.in创建Scanner。例如:
Scanner input=new Scanner(System.in);//从键盘读取,为System.in创建Scanner
Scanner input=new Scanner(new File(filename));//为一个文件创建Scanner
注意:
1. 调用Scanner构造方法可能抛出I/O异常,注意处理。
2. 输入文件不必须关闭,但是关闭是个好习惯。
Scanner如何工作
nextByte()
等都称为令牌读取方法,读取用分隔符分隔开的令牌,默认空格,可以使用ustDelimiter(String regex)
方法设置新的分隔符模式。next()
和nextLint()
都会读取一个字符串,next()
方法读取一个由分隔符分隔的字符串,nextLint()读取一个以行分隔符结束的行。
在Windows平台上,行分隔符字符串是
\r\n
,在Unix平台上是\n
。
为得到特定平台上的行分隔符,使用String lineSeparator = System.getProperty("line.separator");
如果从键盘输入,每行以回车结束,对应\n
字符。
一个令牌读取方法,首先跳过分隔符,然后读取一个以分隔符结束的令牌,然后将令牌自动转换为byte,int等类型,对于next()方法是不需要转换的。如果令牌和期望的类型不匹配,抛出运行异常java.util.InputMismatchException
。
令牌读取方法不读取令牌后面的分隔符,如果令牌读取方法之后调用nextLine(),该方法读取从这个分隔符开始,到这行的行分隔符结束的字符,这个行分隔符也被读取,但行分隔符不是nextLine()返回分字符串部分。
例如:
一个test.txt的文本文件包含一行
12 345
在执行完下面代码之后,
Scanner input=new Scanner(new File("test.txt"));
int intValue=input.nextInt();
String line=input.nextLine();
intValue的值为12,line包含的字符是’ ‘、’3’、’4’、’5’
如果输入是从键盘输入,且用回车作为分隔,即输入12 然后回车,接着输入345,然后在回车。
Scanner input=new Scanner(System.in);
int intValue=input.nextInt();
String line=input.nextLine();
执行之后,intValue的值为12,line是一个空的字符串。原因:令牌读取方法nextInt()读取12,然后在分隔符处停止,这里的分隔符是行分隔符。nextLine()会在读取行分隔符之后结束,然后返回在行分隔符之前的字符串,由于在行分隔符之前没有字符,所以line是空的。