`

RandomAccessFile类的应用

阅读更多

      文件存取通常是顺序的,每在文件中存取一次,文件的读取位置就会相对于目前的位置前进一次。然而有时必须指定文件的某个区段进行读取或写入的动作,也就是进行随机存取(Random Access),即要能在文件中随意地移动读取位置。这时可以使用RandomAccessFile,使用它的seek()方法来指定文件存取的位置,指定的单位是字节。

 

      为了移动存取位置时的方便,通常在随机存取文件中会固定每一个数据的长度。例如长度固定为每一个学生个人数据,Java中并没有直接的方法可以写入一个固定长度数据(像C/C++中的structure),所以在固定每一个长度方面必须自行设计。先设计一个学生数据的类。

 

      对于每一个学生数据的实例在写入文件时,会固定以34字节的长度写入,也就是15个字符(30字节)加上一个int整数的长度(4字节)。

     使用StringBuilder来固定字符长度,可以使用size()方法来取得长度信息。

 

package io;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

/**
 *
 * @author HaoWang
 */
public class TestRandomAccessFile {
    public static void main(String[] args) {
        Student[] students = {
            new Student("Justin", 90),
            new Student("momor", 95),
            new Student("Bush", 88),
            new Student("caterpillar", 84)};
        try {
            File file = new File("C:\\a.txt");// 建立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.print("读取第几个数据?");
            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) {
            System.out.println(e.toString());
        }
    }

    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', ' ');
    }
}

class Student {

    private String name;
    private int score;

    public Student() {
        this("No name",0);
    }

    public Student(String name, int score) {
        this.name = 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); // 最长 15 字符
        this.name = builder.toString();
    }

    public void setScore(int score) {
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    } 
    // 每个数据固定写入34字节
    public static int size() {
        return 34;
    } 
}

 

分享到:
评论

相关推荐

    RandomAccessFile类

    NULL 博文链接:https://chaoyi.iteye.com/blog/2083498

    Java的IO流讲解代码: File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型

    File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...

    Java使用RandomAccessFile类对文件进行读写

    本篇文章主要介绍了Java使用RandomAccessFile类对文件进行读写,详细的介绍了RandomAccessFile类的使用技巧和实例应用,有兴趣的可以了解一下

    JAVA随机存储流(RandomAccessFile)的应用

    NULL 博文链接:https://baihe747.iteye.com/blog/2124747

    itat复赛第3届的第3道题的答案

    *3编写一个Java应用程序,利用RandomAccessFile类,把几个int型整数(1,2,3,4,5,6,7,8,9,10) * 写入到一个名字为tom.dat文件中,然后按相反顺序读出这些数据并显示在屏幕上。(注意,一个int型数据占4个...

    java编程基础,应用与实例

    13.5 RandomAccessFile类 196 13.6 对象序列化(object serialization) 199 13.6.1 ObjectInput与ObjectOutput 199 13.6.2 ObjectOutputStream 200 13.6.3 ObjectInputStream 200 13.7 巩固练习 201 第...

    (超赞)JAVA精华之--深入JAVA API

    1.3.10 随机存取文件 RandomAccessFile 1.3.11 小结 1.4 java中的一些常用词汇 1.5 J2SE学习中的30个基本概念 1.6 Java线程 1.7 Java 5.0多线程编程 1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的...

    JAVA SE学习精华集锦

    1.3.10 随机存取文件 RandomAccessFile 56 1.3.11 小结 56 1.4 java中的一些常用词汇 56 1.5 J2SE学习中的30个基本概念 58 1.6 Java线程 60 1.7 Java 5.0多线程编程 65 1.8 Java Socket编程 80 1.9 Java的内存泄漏 ...

    RandomAccessFile_WineryApp:Java应用程序,使用JavaFX通过随机存取存储器读取和写入文件。 包括保存功能,带有视图栏和过滤器选项

    RandomAccessFile_WineryApp 使用JavaFX的Java应用程序使用随机存取存储器读取和写入文件。 包括保存功能,以及视图栏和过滤器选项。

    java初学者必看

    14.2.4 RandomAccessFile应用 14.3 字节流InputStream、OutputStream 14.3.1 字节输入、输出流 14.3.2 字节文件输入、输出流 14.3.3 字节缓冲输入、输出流 14.3.4 字节数据输入、输出流 14.3.5 字节对象输入、...

    张孝祥Java就业培训教程.pdf

    7.2 RandomAccessFile类 7.3 节点流 7.4 过滤流与包装类 7.5 IO中的高级应用 第8章 图形用户界面GUI(一) 8.1 初识AWT 8.2 AWT线程 8.3 AWT事件处理 8.4 GUI组件上的图形操作 第9章 图形用户界面GUI(二) 9.1 常用AWT...

    hscommons:java实用程序类的集合。-开源

    许多类可帮助完成应用程序中的常见任务。 当前专注于文件的输入和输出。 第一类是Java的RandomAccessFile类的缓冲版本。

    Java开发技术大全 电子版

    7.5.2RandomAccessFile类使用示例——文件加密256 7.6控制台输入和输出257 7.6.1控制台输入类Scanner257 7.6.2格式化输出printf258 7.7序列化261 7.8本章小结264 第4篇Java中的高级技术 第8章Java的多线程...

    大工15年春《Java-程序设计》在线作业三100分答案.docx

    RandomAccessFile 类对文件可以进行既读又写的操作。 A. 错误 B. 正确 ----------------- 选择:B 9. 文件的存取方式通常有顺序存取、随机存取和索引存取三种方式。 A. 错误 B. 正确 ----------------- 选择:B 10....

    java程序设计实验指导代码

    8.2 实验1 一个String类的简单应用 8.3 实验2 单词替换和统计问题 8.4 实验3 字符串的比较和查找最长子串 8.5 实验4 单词逆向输出问题 8.6 实验5 ISBN书号校验问题 第9章 Applet小应用程序 9.1 预备知识 9.2 ...

    JDK_API_1_6

    Closeable Closeable 是可以关闭的数据源或目标。 DataInput DataInput 接口用于从二进制流中读取字节,并根据所有...RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。 Reader 用于读取字符流的抽象类。

    JAVA基础课程讲义

    RandomAccessFile 166 思考作业 166 上机作业 166 提高课外作业 166 第九章 多线程技术 167 基本概念 167 程序 167 进程 167 线程 167 线程和进程的区别 167 进程与程序的区别 168 JAVA中如何实现多线程(重点!!)...

    Java开发详解.zip

    020609_【第6章:面向对象(高级)】_抽象类与接口的应用笔记.pdf 020610_〖第6章:面向对象(高级)〗_实例分析:宠物商店笔记.pdf 020611_【第6章:面向对象(高级)】_Object类笔记.pdf 020612_【第6章:面向对象...

    AIC的Java课程1-6章

     [*]知道使用RandomAccessFile类和seek方法随机存取文件。 机动时间和复习 2课时 &lt;br&gt; 考试 4课时  时间:120-150分钟;其余时间可用于答疑。  题目来源: 大纲...

Global site tag (gtag.js) - Google Analytics