1. File 类
下面例子是一个设置与操作File 类的例子,可以指定查询某个目录下的所有文件与目录名称。
此类的实例可能表示(也可能不表示)实际文件系统对象,如文件或目录。如果它表示这种对象,那么该对象驻留在一个分区 中。分区是文件系统特定于操作系统的存储分区。一个存储设备(例如,物理磁盘驱动器、闪存、CD-ROM )可以包含多个分区。对象(如果有)将驻留在此路径名(绝对形式)某个祖先指定的分区上。
文件系统可以实现对实际文件系统对象上的某些操作(比如,读、写、执行)进行限制。这些限制统称为访问权限 。文件系统可以对一个对象设置多个访问权限。例如,一个设置可能适用于对象的所有者 ,另一个设置则可能适用于所有其他用户。对象上的访问权限可能导致此类的某些方法执行失败。
File
类的实例是不可变的;也就是说,一旦创建,File
对象表示的抽象路径名将永不改变。
package file;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
public class FileDemo {
public static void main(String[] args) {
try {
File file = new File(args[0]);
if (file.isFile()) // 是否为文件
{
System. out .println(args[0] + " 文件 " );
System. out .println(file.canRead() ? " 可读 " : " 不可读 " );
System. out .println(file.canWrite() ? " 可写 " : " 不可写 " );
System. out .println(file.length() + " 字节 " );
} else { // 列出所有的文件及目录
File[] files = file.listFiles();
ArrayList<File> fileList = new ArrayList<File>();
for ( int i = 0; i < files. length ; i++) {
if (files[i].isDirectory()) // 是否为目录
{
System. out .println( "[" + files[i].getPath() + "]" );
} else {
// 文件先存入 fileList, 下面在列出来
fileList.add(files[i]);
}
}
Iterator iterator = fileList.iterator();
while (iterator.hasNext()) {
System. out .println(iterator.next() + " " );
}
System. out .println();
}
} catch (ArrayIndexOutOfBoundsException e) {
System. out .println( "using:java FileDemo pathname" );
}
}
}
File 类是文件的抽象代表,若要做文件输入输出,必须配合其他类一起使用。
2. RandomAccessFile 类
文件存取通常是循序的,每在文件中存取一次,文件的读取位置就会相对于目前的位置前进一次。然而有时必须指定文件的某个区段进行读取或是写入的动作,也就是能随机存取。可以使用 RandomAccessFile 类的 seek() 方法来指定文件存取的位置,指定的单位是字节。
由于 JAVA 里面没有固定长度的数据( c/c++ 的 structure ),所以固定每一个长度方面必须自行设计。
下面设计一个学生类:
package file;
public class Student {
private String name ;
private int score ;
public Student() {
setName( "noname" );
}
public Student(String name, int score) {
setName(name);
this . score = score;
}
public String getName() {
return name ;
}
public void setName(String name) {
StringBuilder builder = null ;
if (name != null )
builder = new StringBuilder(name);
else
builder = new StringBuilder(15);
builder.setLength(15);
this . name = builder.toString();
}
public int getScore() {
return score ;
}
public void setScore( int score) {
this . score = score;
}
public static int size() {
return 34;
}
}
对于每个学生数据的实例在写入文件时,会固定以 34 字节的长度写入,也就是 15 个字符( 30 字节)加上一个 int 整数的长度( 4 字节)。范例使用了 StringBuilder 来固定长度,可以使用 size() 方法来获得长度信息。
package file;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
public class RandomAccessFileDemo {
public static void main(String[] args) {
Student[] students = { new Student( "dengjie" , 90),
new Student( "bailong" , 91), new Student( "shensha" , 92),
new Student( "liuqiu" , 94), };
try {
File file = new File(args[0]);
// 建立 RandomAccessFile 实例并以读写模式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw" );
for ( int i = 0; i < students. length ; i++) {
// 使用对应的 write 方法写入数据
randomAccessFile.writeChars(students[i].getName());
randomAccessFile.writeInt(students[i].getScore());
}
Scanner scanner = new Scanner(System. in );
System. out .println( " 读取第几个数据? " );
int num = scanner.nextInt();
// 使用 seek() 方法操作存取位置
randomAccessFile.seek((num - 1) * Student.size ());
Student student = new Student();
// 使用对应的 read 方法读出数据
student.setName(readName (randomAccessFile));
student.setScore(randomAccessFile.readInt());
System. out .println( " 姓名: " + student.getName());
System. out .println( " 分数: " + student.getScore());
// 设置关闭文件
randomAccessFile.close();
} catch (ArrayIndexOutOfBoundsException e) {
System. out .println( " 请指定文件名称 " );
} catch (IOException e) {
e.printStackTrace();
}
}
private static String readName(RandomAccessFile randomAccessfile)
throws IOException {
char [] name = new char [15];
for ( int i = 0; i < name. length ; i++)
name[i] = randomAccessfile.readChar();
// 将空字符取代为空格符并返回
return new String(name).replace( '/0' , ' ' );
}
}
读写文件的流程:
1. 打开文件并指定读写方式:在JAVA 中,当实例化一个与文件相关的输入输出类时,就会进行打开文件的动作。在实例化的同时要指定文件是要以读出(r) 写入(w) 可读可写(rw) 的方式打开。
2. 使用对应的写入方法:对文件进行写入,要使用对应的写入方法。在JAVA 中通常是write 的名称作为开头,在低级的文件写入中,要写入某种类型的数据,就要使用对应类型的方法如:writeInt(),writeChar() 等。
3. 使用对应读出方法: 如:readInt(),readChar()