当前位置:首页 > 操作系统 > MacOs

RandomAccessFile java IO

* 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.读取字节

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

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

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

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

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

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

<span style="color: #008000;">/**</span><span style="color: #008000;">
 * 通过提高每次读写的数据量,减少实际读写的次数可以提高读写效率. 
 * 单字节读写是随机读写,效率差
 * 块读写是一组一组字节的读写,效率高
 </span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> CopyDemo2 {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
        RandomAccessFile src </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("movie.mp4","r"<span style="color: #000000;">);
        RandomAccessFile desc </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("movie_cp.mp4","rw"<span style="color: #000000;">);    
        </span><span style="color: #008000;">/*</span><span style="color: #008000;">
         * int read(byte[] data)
         * 一次性从文件中读取给定数组总长度的字节量,并将读取到的数据存入到该数组
         * 中,返回值为实际读取到的字节量.若返回值为-1,则表示文件末尾(本次没有
         * 读取到任何数据)
 
         * void write(byte[] data)
         * 一次性将给定字节数组中所有字节写入文件
         * 
         * void write(byte[] data,int s,int len)
         * 将给定字节数组从下标s处开始的连续len个字节一次性写入文件
         </span><span style="color: #008000;">*/</span>
        <span style="color: #008000;">//</span><span style="color: #008000;">10K</span>
        <span style="color: #0000ff;">byte</span>[] data = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[1024*10<span style="color: #000000;">];
        </span><span style="color: #0000ff;">int</span> len = -1;<span style="color: #008000;">//</span><span style="color: #008000;">每次实际读取到的字节数        </span>
        <span style="color: #0000ff;">long</span> start =<span style="color: #000000;"> System.currentTimeMillis();
        </span><span style="color: #0000ff;">while</span>((len = src.read(data))!=-1<span style="color: #000000;">) {
            desc.write(data,</span>0<span style="color: #000000;">,len);
        }
        </span><span style="color: #0000ff;">long</span> end =<span style="color: #000000;"> System.currentTimeMillis();
        System.out.println(</span>"复制完毕!耗时"+(end-start)+"ms"<span style="color: #000000;">);
        src.close();
        desc.close();
    }
}</span>

6.读取文本数据

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

7.写入字符串

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

8.RAF简单应用

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

RandomAccessFile java IO

标签:break   扩容   dat文件   can   简单   system   scan   dem   下标   

本文系统来源:https://www.cnblogs.com/hello4world/p/12129580.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐