RandomAccessFile java IO

1.写入字节

/**
 * java.io.RandomAccessFile
 * RAF是专门用来读写文件数据的API,其基于指针对文件任意位置进行读写.
 */
public class RafDemo1 {
    public static void main(String[] args) throws IOException {
        /*
         * 对当前目录下的raf.dat文件读写数据
         */
        RandomAccessFile raf = new RandomAccessFile("./raf.dat","rw");
        /*
         * void write(int d)
         * 向文件中写入1个字节,写入的是给定的int值
         * 所对应2进制的"低八位"
         *                            vvvvvvvv
         * 00000000 00000000 00000000 00000001
         */
        raf.write(1);
        System.out.println("写出完毕!");
        raf.close();
    }
}

2.读取字节

/**
 * 从文件中读取字节
 */
public class RafDemo2 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("raf.dat","r");
        /*
         * int read()
         * 从文件中读取1个字节,并以int形式
         * 返回.若返回值为-1则表示文件末尾
         * 00000000 00000000 00000000 11111111
         */
        int d = raf.read();
        System.out.println(d);
        d = raf.read();
        System.out.println(d);
        System.out.println("读取完毕!");
        raf.close();
    }
}

3.读写基本类型数据以及RAF基于指针的操作

/**
 * 读写基本类型数据以及RAF基于指针的操作
 */
public class RafDemo3 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
        /*
         * 获取RAF指针位置,创建后从0开始(文件第
         * 一个字节位置)
         */
        long pos = raf.getFilePointer();
        System.out.println("pos:"+pos);
        /*
         * 向文件中写入一个int最大值
         *                            vvvvvvvv
         * 01111111 11111111 11111111 11111111
         * imax>>>24
         * 00000000 00000000 00000000 01111111
         */
        int imax = Integer.MAX_VALUE;
        System.out.println(imax);
        raf.write(imax>>>24);
        System.out.println("pos:"+raf.getFilePointer());
        raf.write(imax>>>16);
        raf.write(imax>>>8);
        raf.write(imax);
        System.out.println("pos:"+raf.getFilePointer());
        /*
         * void writeInt(int d)
         * 将给定的int值对应的4字节一次性写出
         * 等同上面四句操作
         */
        raf.writeInt(imax);
        System.out.println("pos:"+raf.getFilePointer());
        raf.writeLong(123L);
        System.out.println("pos:"+raf.getFilePointer());
        raf.writeDouble(123.123);
        System.out.println("pos:"+raf.getFilePointer());
        System.out.println("写出完毕!");
        /*
         * void seek(long pos)
         * 移动指针到指定位置
         */
        raf.seek(0);
        System.out.println("pos:"+raf.getFilePointer());
        /*
         * int readInt()
         * 连续读取4个字节并返回该int值,若连续读取
         * 4个字节的过程中发现读取到了文件末尾,此时
         * 会直接抛出异常EOFException
         * EOF(end of file)文件末尾
         */
        int d = raf.readInt();
        System.out.println(d);
        System.out.println("pos:"+raf.getFilePointer());
        //读取long值
        //1移动指针到long的所在位置
        raf.seek(8);
        //2读取long的8字节还原long值
        long lon = raf.readLong();
        System.out.println(lon);
        System.out.println("pos:"+raf.getFilePointer());
        double dou = raf.readDouble();
        System.out.println(dou);
        System.out.println("pos:"+raf.getFilePointer());
        /*
         * 将第二个int值内容改为int最小值
         */
        //1移动指针到第二个int值的开始位置
        raf.seek(4);
        //2重写写入新的int值来覆盖原内容
        raf.writeInt(Integer.MIN_VALUE);
        System.out.println("pos:"+raf.getFilePointer());
        raf.seek(4);
        d = raf.readInt();
        System.out.println(d);
        raf.close();
    }
}

4.用RAF复制文件(单字节,很慢)

/**
 * 复制文件
 */
public class CopyDemo {
    public static void main(String[] args) throws IOException {
        RandomAccessFile src = new RandomAccessFile("./movie.mp4","r");
        RandomAccessFile desc = new RandomAccessFile("./movie_cp.mp4","rw");
        int d = -1;//用于保存每次读取到的字节
        long start = System.currentTimeMillis();
        while((d = src.read())!=-1) {
            desc.write(d);
        };
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时:"+(end-start)+"ms");
        src.close();
        desc.close();
    }
}

5.用RAF复制文件(块读,速度快)

/**
 * 通过提高每次读写的数据量,减少实际读写的次数可以提高读写效率.
 * 单字节读写是随机读写,效率差
 * 块读写是一组一组字节的读写,效率高
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile src = new RandomAccessFile("movie.mp4","r");
        RandomAccessFile desc = new RandomAccessFile("movie_cp.mp4","rw");
        /*
         * int read(byte[] data)
         * 一次性从文件中读取给定数组总长度的字节量,并将读取到的数据存入到该数组
         * 中,返回值为实际读取到的字节量.若返回值为-1,则表示文件末尾(本次没有
         * 读取到任何数据)

         * void write(byte[] data)
         * 一次性将给定字节数组中所有字节写入文件
         *
         * void write(byte[] data,int s,int len)
         * 将给定字节数组从下标s处开始的连续len个字节一次性写入文件
         */
        //10K
        byte[] data = new byte[1024*10];
        int len = -1;//每次实际读取到的字节数
        long start = System.currentTimeMillis();
        while((len = src.read(data))!=-1) {
            desc.write(data,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时"+(end-start)+"ms");
        src.close();
        desc.close();
    }
}

6.读取文本数据

/**
 * 读取文本数据
 */
public class ReadStringDemo {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("raf.txt","r");
        byte[] data = new byte[(int)raf.length()];
        raf.read(data);
        String str = new String(data,"UTF-8");
        System.out.println(str);
        raf.close();
    }
}

7.写入字符串

/**
 * 使用RAF向文件中写入字符串
 */
public class WriteStringDemo {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
        String line = "夜空中最亮的星";
        /*
         * String提供了转换为字节的方法:
         * byte[] getBytes()
         * 将当前字符串按照系统默认字符集转换为一组字节
         *
         * byte[] getBytes(String csn)
         * 重载的getBytes方法要求我们传入一个
         * 字符串参数表示字符集的名称,该名称
         * 不区分大小写,作用是将当前字符串按照
         * 给定的字符集转换为一组字节,推荐用
         * 这种方式,不要按照系统默认字符集操作.
         */
        byte[] data = line.getBytes("UTF-8");
        raf.write(data);
        raf.write(",能否听清,".getBytes("UTF-8"));
        System.out.println("写出完毕!");
        raf.close();
    }
}

8.RAF简单应用

/**
 * 用户注册
 * 程序启动后,要求用户输入注册信息:
 * 用户名,密码,昵称,年龄
 * 其中除了年龄是int值外,其余三个是String.
 * 然后将该信息写入user.dat文件中保存.
 *
 * 每条记录固定占用100字节.
 * 其中用户名,密码,昵称为字符串,各占用32字节.
 * 年龄为int值固定的4字节.
 */
public class RegDemo {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("欢迎注册");
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        System.out.println("请输入密码:");
        String password = scanner.nextLine();
        System.out.println("请输入昵称:");
        String nickname = scanner.nextLine();
        System.out.println("请输入年龄:");
        int age = Integer.parseInt(scanner.nextLine());
        System.out.println(username+","+password+","+nickname+","+age);
        RandomAccessFile raf = new RandomAccessFile("user.dat","rw");
        //首先将指针移动到文件末尾,以便追加新记录
        raf.seek(raf.length());
        //写入用户名
        byte[] data = username.getBytes("UTF-8");
        //扩容数组到32字节
        data = Arrays.copyOf(data, 32);
        raf.write(data);
        //写密码
        data = password.getBytes("UTF-8");
        data = Arrays.copyOf(data, 32);
        raf.write(data);
        //写昵称
        data = nickname.getBytes("UTF-8");
        data = Arrays.copyOf(data, 32);
        raf.write(data);
        //写年龄
        raf.writeInt(age);
        System.out.println("pos:"+raf.getFilePointer());
        System.out.println("注册完毕!");
        raf.close();
    }
}
/**
 * 将user.dat文件中的用户信息显示到控制台
 */
public class ShowAllUserDemo {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("user.dat","r");
        for(int i=0;i<raf.length()/100;i++) {
            byte[] data = new byte[32];
            raf.read(data);
            String username = new String(data,"UTF-8").trim();
            raf.read(data);
            String password = new String(data,"UTF-8").trim();
            raf.read(data);
            String nickname = new String(data,"UTF-8").trim();
            int age = raf.readInt();
            System.out.println(username+","+password+","+nickname+","+age);
            System.out.println("pos:"+raf.getFilePointer());
        }
        raf.close();
    }
}
/**
 * 完成修改昵称操作
 *
 * 程序启动后要求输入用户名和新的昵称.然后
 * 修改user.dat文件中该用户的昵称.
 * 若输入的用户名在user.dat文件中不存在则输出
 * 提示信息:该用户不存在!
 */
public class UpdateDemo {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        System.out.println("请输入新的昵称:");
        String nickname = scanner.nextLine();
        RandomAccessFile raf = new RandomAccessFile("user.dat","rw");
        boolean updated = false;//是否修改过信息
        for(int i=0;i<raf.length()/100;i++) {
            //移动到每条记录的开始位置
            raf.seek(i*100);
            //读取用户名
            byte[] data = new byte[32];
            raf.read(data);
            String name = new String(data,"UTF-8").trim();
            if(name.equals(username)) {
                //移动指针到昵称位置
                raf.seek(i*100+64);
                data = nickname.getBytes("UTF-8");
                data = Arrays.copyOf(data, 32);
                raf.write(data);
                System.out.println("修改完毕!");
                updated = true;
                break;
            }
        }
        if(!updated) {
            System.out.println("该用户不存在!");
        }
        raf.close();
    }
}

原文地址:https://www.cnblogs.com/hello4world/p/12129580.html

时间: 2024-11-08 23:06:05

RandomAccessFile java IO的相关文章

[Java IO]01_File类和RandomAccessFile类

File类 File类是java.io包中唯一对文件本身进行操作的类.它可以进行创建.删除文件等操作. File类常用操作 (1)创建文件 可以使用 createNewFille() 创建一个新文件. 注意: Windows 中使用反斜杠表示目录的分隔符"\". Linux 中使用正斜杠表示目录的分隔符"/". 最好的做法是使用 File.separator 静态常量,可以根据所在操作系统选取对应的分隔符. (2)删除文件 可以使用 delete() 删除一个文件.

Java IO RandomAccessFile 任意位置读/写

随机读写类 RandomAccessFile的唯一父类是Object,与其他流父类不同.是用来访问那些保存数据记录的文件的,这样你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的. RandomAccessFile是不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系

Java—IO流 RandomAccessFile类

RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. java文件模型,在硬盘上的文件是byte byte byte存储的,是数据的集合 打开文件,有两种模式,"rw"读写."r"只读:RandomAccessFile raf = new RandomAccessFile(file, "rw");,文件指针,打开文件时指针在开头 point = 0; 写方法,

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类                                                                 --转载请注明出处:coder-pig 本节引言: 兜兜转转,又回来写Java了,上一篇J2SE知识点归纳笔记(六)---Java常用类是上2014.4.14写的,时隔一年 又来重拾之前还没写完的系列了,前些天群里一个妹子反映她Java基础薄弱,然后抱怨在cs

Java.io.RandomAccessFile

RandomAccessFile Java提供的对文件内容的访问,既可以读文件,也可以写文件.支持随机访问文件,可以访问文件的任意位置. 1)Java文件模型 在硬盘上的文件是byte byte byte存储的,是数据的集合. 2)打开文件 有两种模式 rw 读写  r 只读. RandomAccessFile randomAccessFile=new RandomAccessFile(file, "rw"); 文件指针,打开文件时指针在开头 pointer=0. 3)写方法 rand

Java IO流 之 RandomAccessFile

http://www.verejava.com/?id=16994711024818 package com.randomaccessfile; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFil

Java IO流 之 RandomAccessFile 多线程下载

http://www.verejava.com/?id=16994721196019 package com.randomaccessfile; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFil

系统学习 Java IO (三)----FileInputStream/FileOutputStream &amp; RandomAccessFile

目录:系统学习 Java IO---- 目录,概览 FileInputStream 这是一个简单的FileInputStream示例: InputStream input = new FileInputStream("D:\\input.txt"); int data = input.read(); while(data != -1) { //do something with data... doSomethingWithData(data); data = input.read()