Sunday, April 26, 2009

File & RandomAccessFile

不同的操作系统对于文件系统路径的设置各有差别
Windows的路径指定是使用UNC(Universal Naming Convention)路径名以\\表示硬盘根目录

一个File的实例被建立时,它就不能再被改变。
不管是文件还是目录,在Java中都是以File的实例来表示
例:指定查询某个目录下的所用文件与目录名称
package 输入输出;
import java.io.*;
import java.util.*;
public class FileDemo {

/**
* @param args
*/
public static void main(String[] arg) {
// TODO Auto-generated method stub
try{
String[] args=new String[1];
args[0]="D:\\日本語\\二级\\2级语法\\2级语法190.doc";
File file=new File(args[0]);
if(file.isFile()){
System.out.println(args[0]+"文件");
System.out.print(file.canRead()?"可读":"不可读");
System.out.print(file.canWrite()?"可写":"不可写");
System.out.println(file.length()+"字节");
}
else{
File[] files=file.listFiles();//listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
ArrayList fileList=new ArrayList();
for(int i=0;i
if(files.clone()[i].isDirectory()){
System.out.println("["+files[i].getPath()+"]");
}
else {
fileList.add(files[i]);
}
}
for(File f:fileList){
System.out.println(f.toString());
}
System.out.println();
}
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("using: java FileDemo pathname");
}





RandomAccessFile类
文件存取通常是循序的,每在文件中存取一次,文件的读取位置就会相对于目前的位置前进一次
RandomAccessFile使用seek()方法来指定文件存取的位置,指定的单位是字节
为了移动存取位置时的方便,通常在随机存取文件中会固定每一个数据的长度。Java中并没有直接的方法可以写入一个固定长度数据,所以在固定每一个长度方面必须自行设计
例:设计一个学生数据的类
package 输入输出;

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 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 void setScore(int score){
this.score=score;
}
public String getName(){
return name;
}
public int getScore(){
return score;
}
public static int size(){
return 34;
}
}

对于每个学生数据的实例再写入文件时,会固定以34字节的长度写入,也就是15个字符(30字节)+一个int整数的长度(4字节)。
例:使用RandomAccessFile来写入文件,并可随机指定一个所想读出的数据
package 输入输出;
import java.io.*;
import java.util.*;
public class RandomAccessFileDemo {

/**
* @param args
*/
public static void main(String[] args) {
String arg=new String("student.dat");
// TODO Auto-generated method stub
Student[] students={
new Student("Justin",90),
new Student("Momor",95),
new Student("Bush",88),
new Student("Caterpillar",84)
};

try{
File file=new File(arg);
RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw");
for(int i=0;i< students.length;i++){
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', ' ');
}

}




No comments:

Post a Comment