10月8号-输入输出-文件

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值