zoukankan      html  css  js  c++  java
  • 【Java IO流】RandomAccessFile类的使用

    RandomAccessFile类的使用

    RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件。

    支持随机访问文件,可以访问文件的任意位置。

    RandomAccessFile类实现步骤

    (1)文件模型

    第一步要知道,在硬盘上的文件时是以byte byte byte存储的,是数据的集合。

    (2)打开文件

    打开文件硬盘上的文件有两种模式:“rw”(读写),“r”(只读)。可以用RandomAccessFile类来指定打开文件的模式,如:

    RandomAccessFile raf = new RandomAccessFile(file,"rw")

    因为RandomAccessFile类是可以随机访问文件的任意位置的,其本质是因为RandomAccessFile类提供了一个文件指针。

    文件指针,打开文件时指针在开头 pointer = 0;

    (3)基本写方法

    RandomAccessFile类里提供了一个基本的写方法write(),下面是一个写入整形int的例子:

    raf.write(int)--->只写一个字节(后8位),同时指针指向下一个位置,准备再次写入

    注意:write()方法对于字节以外的类型一次只能写入一个字节的大小,比如要完整写入一个int类型,则要使用4次write()方法。但是可以直接写入一个字节数组,如write(byte[])。

    (4)基本读方法

    RandomAccessFile类里提供了一个基本的读方法read(),用法和write()相同:

    int b = raf.read()--->只读一个字节

    (5)关闭流

    文件读写完成以后一定要关闭流(Oracle官方说明),如果不关闭可能会产生意想不到的异常!

    RandomAccessFile 类的使用案例

    上面介绍了基本的RandomAccessFile类使用步骤,接下来我写一个案例来实现一下这些步骤吧。

    1.首先在项目下创建测试目录和文件

    1 File demo= new File("demo");
    2         if(!demo.exists()){
    3             demo.mkdirs();
    4         }
    5         File file=new File(demo,"raf.txt");
    6         if(!file.exists()){
    7             file.createNewFile();
    8         }

    2.初始化RandomAccessFile类,打开刚刚创建的文件,查看文件指针的位置

    1 RandomAccessFile raf=new RandomAccessFile(file, "rw");
    2         //指针的位置
    3         System.out.println(raf.getFilePointer());

    3.使用RandomAccessFile类写入int类型变量

    1 int i=0x7fffffff;//最大的整数
    2         //用write方法每次只能写一个字节,如果把i写进去就得写4次
    3         raf.write(i>>>24);//高8位
    4         raf.write(i>>>16);
    5         raf.write(i>>>8);
    6         raf.write(i);
    7         //也可以直接用writeInt()方法,直接写入,此方法原理同上
    8         raf.writeInt(i);

    其中writeInt()方法的原理也是使用write()方法完成的,和我写的write()方法异曲同工:

    4.使用RandomAccessFile类写入String字符串

    定义一个字符串s

    String s="中文";

    1)先将字符串转为字节数组,再将此数组写入

    1 byte[] gbk=s.getBytes("utf-16be");
    2 raf.write(gbk);

    注意:这里的编码格式要按utf-16be,因为java 的内部编码格式就是这个,否则等下读出时会乱码。更多关于编码问题请阅读我另一篇文章《计算机中的编码问题》

    2)使用writeChars()方法

    raf.writeChars(s);

    原理:writeChars()是调用writeChar()方法将字符串s的一个个字符写入文件,而writeChar()的内容代码如下(本质都是利用write()方法将一个个字节写入):

    5.使用RandomAccessFile类读出文件内容

     1         //读操作,必须把指针移到头部
     2         raf.seek(0);
     3         //一次性读取
     4         byte[] buf=new byte[(int)raf.length()];
     5         raf.read(buf);
     6         System.out.println(Arrays.toString(buf));//打印出字节数组
     7         //将字节数组转为字符串
     8         String s1=new String(buf,"utf-16be");
     9     
    10         System.out.println(s1);

    运行结果:

    前面的乱码是写入的int类型,因为读出时是字符串的编码格式,所以int型就无法识别。如果要读出int型,就得使用readInt()方法读出int型变量。此外,RandomAccessFile类还提供了读出和写入各种类型的方法,使用方法类似,这里就不再阐述了,有兴趣的朋友可以自行尝试。

    注意:

    • 如果要从文件头开始读,必须把指针移到头部,seek()把指针指定到某一位置;
    • read(byte[] )可以把读到的字节都传入到该字节数组中去;
    • 将字节数组转为字符串时,主要字符串的编码格式要与写入字节时的编码格式相同,否则出现乱码。
    • 每次写入和读出时,文件指针的位置都会发生变化,请根据需要使用指针的位置。

    6.关闭RandomAccessFile类

    使用完RandomAccessFile类一定不要忘记关闭流,非常重要,要养成好习惯!!

    //最后必须关闭
    raf.close();

    题外话:我在文中提到了一个有趣的int,那就是在java中最大的int类型。为什么0x7ffffff代表最大的int值呢?

    解惑:

    每位十六进制数占4bit,因此8位十六进制等于32bit(即4个字节),刚好是一个int整型。

    F的二进制码为 1111

    7的二进制码为 0111

    这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1。就是说,这是最大的整型数 int(因为第一位是符号位,0 表示它是正数)。

  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/hysum/p/7223357.html
Copyright © 2011-2022 走看看