每天多一点之File、RandomAccessFile

1.格式:学生数,学号,成绩 按照格式写入RandomAcessFile

/**
     * Write Data
     * 
     * 今天放了两个错误:
     * <br>1、new RandomAccessFile("test/score.dat", "rw") score.dat会自动创建不需手动创建
     * <br>2、写入数据的时候无需移动指针位置
     */
    public void writeData() {
        int[] no = { 1, 2, 4, 6, 7, 9, 10, 11, 13, 15 };
        double[] score = { 81.5, 82.7, 89.2, 67.4, 77.3, 95.8, 60.4, 87.6,
                65.7, 88.5 };
        // long pos=0;
        try {
            file = new File("test");
            // 判断是否存在
            if (!file.exists()) {
                // 创建一层目录mkdir 创建多层用mkdirs
                file.mkdir();
            }
            // file=new File("test/score.dat");
            // // 判断是否存在
            // if (!file.exists()) {
            // try {
            // // 创建文件
            // file.createNewFile();
            // } catch (IOException e) {
            // // TODO Auto-generated catch block
            // e.printStackTrace();
            // }
            // }
            raFile = new RandomAccessFile("test/score.dat", "rw");
            raFile.writeInt(no.length);
            // raFile.seek(4L);
            // pos+=4L;
            for (int i = 0; i < no.length; i++) {
                raFile.writeInt(no[i]);
                // pos+=4L;
                // raFile.seek(pos);
            }

            for (int i = 0; i < score.length; i++) {
                raFile.writeDouble(score[i]);
                // pos+=8L;
                // raFile.seek(pos);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                raFile.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

2.根据1中的格式:学生数,学号,成绩 从RandomAcessFile中成绩最高的学生的学号

/**
     * Find the Max Score
     */
    public void findMaxScore() {
        // 学生数
        int num = 0;
        // 学号
        int no = 0;
        // 读取位置
        long pos = 0;
        // 最高成绩的位置
        long maxPos = 0;
        // 最高成绩
        double maxScore = 0;

        try {
            raFile = new RandomAccessFile("test/score.dat", "rw");
            // 读取出人数
            num = raFile.readInt();
            // 指针位置移动到分数区
            pos = (num + 1) * 4L;
            raFile.seek(pos);

            // 从num个分数中找出最大分数
            for (int i = 0; i < num; i++) {
                if (raFile.readDouble() > maxScore) {
                    maxScore = raFile.readDouble();
                    // 记录最大分数的位置
                    maxPos = i + 1;
                }
                // double为8字节读取一次+8
                pos += 8L;
                raFile.seek(pos);
            }
            // 根据最大成绩的位置找到学号,maxPos + 1这个+1是因为第一个是人数
            raFile.seek((maxPos + 1) * 4L);
            no = raFile.readInt();

            System.out.println("最高成绩为:" + maxScore + "学号:" + no);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                raFile.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

 
3、RandomAccessFile

RandomAccessFile允许对文件内容同时完成读和写操作,它直接继承object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法:

readXXX()或writeXXX():

如ReadInt(), ReadLine(), WriteChar(), WriteDouble()等。

int skipBytes(int n):将指针乡下移动若干字节

length():返回文件长度

long getFilePointer():返回指针当前位置

void seek(long pos):将指针调到所需位置

在生成一个随机文件对象时,除了要指明文件对象和文件名之外,还需要指明访问文件的模式。

RandomAccessFile(File file, String mode)

RandomAccessFile(String name, String mode)

mode 的取值:

“r” 只读. 任何写操作都将抛出IOException。

“rw” 读写. 文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。

“rws” 同步读写. 等同于读写,但是任何写操作的内容都被直接写入物理文件,包括文件内容和文件属性。

“rwd” 数据同步读写. 等同于读写,但任何内容写操作都直接写到物理文件,但对文件属性内容的修改不是这样。

 

4、File的一些操作

 

/**
     * 创建一个文件夹
     */
    public void createNewFolder() {
        file = new File("c:/TestFolder");
        // 判断是否存在
        if (!file.exists()) {
            // 创建一层目录mkdir 创建多层用mkdirs
            file.mkdir();
        }
    }

    /**
     * 创建一个文件
     */
    public void createNewFile() {
        // "/TestFloder"绝对路径="当前工程所在盘符:/TestFloder
        // “TestFolder”相对路径="当前工程所在目录/TestFloder"
        file = new File("C:/TestFolder/Test.txt");
        // file=new File("C:/TestFolder","Test.txt");
        // 判断是否存在
        if (!file.exists()) {
            try {
                // 创建文件
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * 查看目录下的所有文件与文件夹 <br>
     * 完整路径用listFiles <br>
     * isDirectory判断一个路径是否为目录 FileFilter 过滤器
     */
    public void listFiles() {
        // 这种形式定义一个路径 兼容所有系统
        String fileName = "D:" + File.separator;
        File f = new File(fileName);
        // 列出所有文件
        String[] str = f.list();
        for (String fileNames : str) {
            System.out.println(fileNames);
        }

        // 判断是否路径
        if (f.isDirectory()) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

        System.out.println("------------------------------------------");

        // 过滤器
        File f2 = new File("D:");
        // 根据过滤条件过滤文件
        File[] str2 = f2.listFiles(new FileFilter() {

            @Override
            public boolean accept(File file) {
                // 过滤条件
                return file.getName().endsWith(".dmp");
            }
        });
        for (File fileNames : str2) {
            System.out.println(fileNames);
        }

        System.out.println("------------------------------------------");
    }


5、About  File

File:指文件或目录路径名.

构造方法:

    File(File parent, String child)
      根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

    File(String pathname)
      通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

    File(String parent, String child)
      根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

    File(URI uri)
      通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

相关方法:

boolean createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

static File createTempFile(String prefix, String suffix)
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

static File createTempFile(String prefix, String suffix, File directory)
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

boolean delete()
删除此抽象路径名表示的文件或目录。

boolean exists()
测试此抽象路径名表示的文件或目录是否存在。

boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。

boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。

boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。

long length()
返回由此抽象路径名表示的文件的长度。

String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。

File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

File[] listFiles(FilenameFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

static File[] listRoots()
列出可用的文件系统根。

boolean mkdir()
创建此抽象路径名指定的目录。

boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

boolean renameTo(File dest)
重新命名此抽象路径名表示的文件。

posted @ 2013-05-20 23:55  HackerD  阅读(245)  评论(0编辑  收藏  举报