您的位置:威尼斯官方网站 > 威尼斯正规官网 > 支持随机访问文件

支持随机访问文件

发布时间:2019-08-11 14:49编辑:威尼斯正规官网浏览(163)

    【Java IO流】RandomAccessFile类的使用,iorandomaccessfile

    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         }
    

    图片 1

    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()方法异曲同工:

    图片 2

    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()方法将一个个字节写入):

    图片 3

    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);
    

    运行结果:图片 4

    前面的乱码是写入的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 表示它是正数)。

    IO流】RandomAccessFile类的使用,iorandomaccessfile RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可...

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:支持随机访问文件

    关键词:

上一篇:算出的MD5值长度都是固定的

下一篇:没有了