美文网首页
RandomAccessFile

RandomAccessFile

作者: luoqiang108 | 来源:发表于2018-08-08 14:43 被阅读0次
    • 作用:可以很方便的读写文件内容
    • 计算机的硬盘在保存数据时都是byte by byte的(字节挨着字节)。
    • RandomAccessFile打开文件模式:
      rw:打开文件后可进行读写操作
      r:打开文件后只读
    • RandomAccessFile写入读取的方法:
      write(int data):写一个字节,写这个int值的低八位
      write(byte[] data):将一组字节写入。
      int read():读取一个字节,若已经读取到文件末尾返回-1。
      int read(byte[] buf):尝试读取buf.length个字节。并将读取的字节存入buf数组。返回值是实际读取的字节数。
    • RandomAccessFile是基于指针进行读写操作的指针在哪里就从哪里读/写。
    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.Arrays;
    /**
     * RandomAccessFile读写文件。
     */
    public class RandomAccessFileTest {
        public static void main(String[] args) {
            try {
                /**
                 * 向文件.\data.dat中写数据
                 * 步骤:
                 * 1、创建一个File对象用于描述该文件
                 * 2、不存在则创建该文件
                 * 3、创建RandomAccessFile,并将File传入。
                 * 使RandomAccessFile对File表示的文件进行
                 * 读写操作
                 * 4、向文件中写入内容
                 */
                //1
                File file = new File("data.dat");
                //2、不存在则创建该文件
                if (!file.exists()) {
                    file.createNewFile();
                }
                //3、对file文件可以进行读写操作
                RandomAccessFile raf =new RandomAccessFile(file,"rw");
                //4、写一个int最大值
                /**
                 * 2位16进制代表一个字节(8位2进制)
                 * 1位16进制代表4位2进制 f==1111
                 * 4字节代表32位2进制
                 *
                 * write(int)写一个字节
                 *    7f       ff       ff       ff
                 * 01111111 11111111 11111111 11111111
                 *
                 * 00000000 00000000 00000000 01111111 00 00 00 7f
                 * 00000000 00000000 01111111 11111111 00 00 7f ff
                 * 00000000 01111111 11111111 11111111 00 7f ff ff
                 * 01111111 11111111 11111111 11111111 7f ff ff ff
                 */
                int i = 0x7fffffff;//int最大值
                //写int值最高的8位
                raf.write(i>>>24);//00 00 00 7f
                raf.write(i>>>16);//00 00 7f ff
                raf.write(i>>>8);//00 7f ff ff
                raf.write(i);    //7f ff ff ff
                //定义一个10字节数组
                byte[] data = new byte[]{0,1,2,3,4,5,6,7,8,9};
                //将这10个字节全部写入文件
                raf.write(data);
                //写到这里,当前文件应该有14个字节了
                /**
                 * 写字节数组的重载方法
                 *write(byte[] data,int offset,int length)
                 * 从data数组的offset位置开始写,连续写length个字节到文件中。
                 */
                raf.write(data,2,5);//{2,3,4,5,6}
                System.out.println("当前指针位置:"+raf.getFilePointer());//19
                raf.seek(0);//将指针移动到文件开始的位置
                System.out.println("当前指针位置:"+raf.getFilePointer());//0
                /**
                 * num:00000000 00000000 00000000 00000000
                 */
                int num = 0;//准备读取的int值
                int b = raf.read();//读取第一个字节 7f
                System.out.println("当前指针位置:"+raf.getFilePointer());//1
                num = num|(b<<24);//01111111 00000000 00000000 00000000
                b = raf.read();//读取第二个字节 ff
                num = num|(b<<16);//01111111 11111111 00000000 00000000
                b = raf.read();//读取第三个字节 ff
                num = num|(b<<8);//01111111 11111111 11111111 00000000
                b = raf.read();//读取第四个字节 ff
                num = num|b;//01111111 11111111 11111111 11111111
                System.out.println("int最大值"+num);//int最大值2147483647
                raf.seek(0);
                byte[] buf = new byte[1024];//1k的容量
                int sum = raf.read(buf);//尝试读取1k的数据
                System.out.println("总共读取了"+sum+"个字节");
                System.out.println(Arrays.toString(buf));
                raf.close();//写完了不再写了就关了
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:RandomAccessFile

          本文链接:https://www.haomeiwen.com/subject/vwchqftx.html