RandomAccessFile 是随机访问文件的类。它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指针,当要用该类的对象读取文件中的元素时,就将要读取的元素先存储在数组中,而get方法和set方法也就是读和写操作。
需要注意的是,RandomAccessFile 虽然属于java.io包(因为它具备读和写的功能),但它不是InputStream或者OutputStream的子类; FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;但是,RandomAccessFile 同时支持文件的读和写,并且它支持随机访问,原理在于RandomAccessFile内部封装了FileInputStream和FileOutputStream。
虽然RandomAccessFile 可以同时对文件进行读取和写入,但是它却有一个较大的局限性,那就是它只能操作文件,也就是说只能操作硬盘上的数据,而不能操作内存,控制台上的数据。
构造函数:
1. RandomAccessFile 模式说明
RandomAccessFile共有4种模式:"r", "rw", "rws"和"rwd"。
<span style="font-size: 16px;"><strong>"r"</strong> 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 <strong>"rw"</strong> 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 <strong>"rws" </strong> 打开以便读取和写入。相对于 "rw","rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。 <strong>"rwd" </strong> 打开以便读取和写入,相对于 "rw","rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备。 </span>
说明:
(01) 什么是“元数据”,即metadata?
metadata是“关于数据的数据”。在文件系统中,数据被包含在文件和文件夹中;metadata信息包括:“数据是一个文件,一个目录还是一个链接”,“数据的创建时间(简称ctime)”,“最后一次修改时间(简称mtime)”,“数据拥有者”,“数据拥有群组”,“访问权限”等等。
(02) "rw", "rws", "rwd" 的区别。
当操作的文件是存储在本地的基础存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。
当模式是 "rws" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,都会将这些改变同步到基础存储设备上。
当模式是 "rwd" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]”时,都会将这些改变同步到基础存储设备上。
当模式是 "rw" 并且 操作的是基础存储设备上的文件;那么,关闭文件时,会将“文件内容的修改”同步到基础存储设备上。至于,“更改文件内容”时,是否会立即同步,取决于系统底层实现。
注意:该对象在实例化时,如果要操作的文件不存在,不管是读操作还是写操作,都会自动创建文件;如果文件存在,写数据时未指定位置,会从头开始写,即覆盖原有的内容(注意只覆盖自己写入的位置)。可以用于多线程下载或多个线程同时写数据到文件。
【代码演示】
<span style="color: #008080;"> 1</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.IOException; </span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.RandomAccessFile; </span><span style="color: #008080;"> 3</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RandomAccessFileWriteDemo { </span><span style="color: #008080;"> 4</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 { </span><span style="color: #008080;"> 5</span> RandomAccessFile rafw=<span style="color: #0000ff;">new</span> RandomAccessFile("c:htmltestr.txt","rw"<span style="color: #000000;">); </span><span style="color: #008080;"> 6</span> <span style="color: #008000;">//</span><span style="color: #008000;">文件不存在,则自动创建,当文件存在时,会覆盖原有的文件,注意只是覆盖自己写入的部分。</span> <span style="color: #008080;"> 7</span> rafw.write("sdfghjk".getBytes());<span style="color: #008000;">//</span><span style="color: #008000;">注意要进行写操作时,构造函数的mode必须设置为rw,否则报错:拒绝访问。 </span><span style="color: #008080;"> 8</span> <span style="color: #008000;">//</span><span style="color: #008000;">rafw.writeInt(17);</span><span style="color: #008000;">//</span><span style="color: #008000;">注意write方法只写入最低八位,会造成数据丢失,因此选用writeInt方法</span> <span style="color: #008080;"> 9</span> <span style="color: #000000;"> rafw.close(); </span><span style="color: #008080;">10</span> RandomAccessFile rafr=<span style="color: #0000ff;">new</span> RandomAccessFile("c:htmltestr.txt","rw"<span style="color: #000000;">); </span><span style="color: #008080;">11</span> rafr.seek(3);<span style="color: #008000;">//</span><span style="color: #008000;">可以调节指针的位置,传入3,则表示从三号位置开始读取,默认指针是从0开始</span> <span style="color: #008080;">12</span> <span style="color: #0000ff;">byte</span>[] buff=<span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[8<span style="color: #000000;">]; </span><span style="color: #008080;">13</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> num; </span><span style="color: #008080;">14</span> <span style="color: #0000ff;">while</span> ((num=rafr.read(buff))!=-1<span style="color: #000000;">){ </span><span style="color: #008080;">15</span> System.out.print(<span style="color: #0000ff;">new</span> String(buff,0<span style="color: #000000;">,num)); </span><span style="color: #008080;">16</span> <span style="color: #000000;"> } </span><span style="color: #008080;">17</span> <span style="color: #000000;"> rafr.close(); </span><span style="color: #008080;">18</span> <span style="color: #000000;"> } </span><span style="color: #008080;">19</span> }
【代码演示】:往文件的指定位置插入内容,且不能覆盖原来的内容。
<span style="color: #008080;"> 1</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.FileInputStream; </span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.FileOutputStream; </span><span style="color: #008080;"> 3</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.IOException; </span><span style="color: #008080;"> 4</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.RandomAccessFile; </span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Scanner; </span><span style="color: #008080;"> 6</span> <span style="color: #008080;"> 7</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> insertData { </span><span style="color: #008080;"> 8</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { </span><span style="color: #008080;"> 9</span> Scanner in=<span style="color: #0000ff;">new</span><span style="color: #000000;"> Scanner(System.in); </span><span style="color: #008080;">10</span> System.out.println("请输入文件存放的路径:"<span style="color: #000000;">); </span><span style="color: #008080;">11</span> String path=<span style="color: #000000;">in.nextLine(); </span><span style="color: #008080;">12</span> System.out.println("请输入要插入的位置:"<span style="color: #000000;">); </span><span style="color: #008080;">13</span> Long points=<span style="color: #000000;">in.nextLong(); </span><span style="color: #008080;">14</span> in.nextLine();<span style="color: #008000;">//</span><span style="color: #008000;">缓冲回车键</span> <span style="color: #008080;">15</span> System.out.println("请输入要插入的内容:"<span style="color: #000000;">); </span><span style="color: #008080;">16</span> String insertContent=<span style="color: #000000;">in.nextLine(); </span><span style="color: #008080;">17</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">{ </span><span style="color: #008080;">18</span> <span style="color: #000000;"> randomInserst(path,points,insertContent); </span><span style="color: #008080;">19</span> }<span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e){ </span><span style="color: #008080;">20</span> System.out.println("插入失败"<span style="color: #000000;">); </span><span style="color: #008080;">21</span> <span style="color: #000000;"> } </span><span style="color: #008080;">22</span> <span style="color: #008080;">23</span> <span style="color: #000000;"> } </span><span style="color: #008080;">24</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> randomInserst(String path,Long points,String insertContent)<span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException { </span><span style="color: #008080;">25</span> RandomAccessFile raf=<span style="color: #0000ff;">new</span> RandomAccessFile(path,"rw"<span style="color: #000000;">); </span><span style="color: #008080;">26</span> raf.seek(points);<span style="color: #008000;">//</span><span style="color: #008000;">调节指针位置</span> <span style="color: #008080;">27</span> FileOutputStream fos=<span style="color: #0000ff;">new</span> FileOutputStream("c:htmltesttmp.txt");<span style="color: #008000;">//</span><span style="color: #008000;">临时文件</span> <span style="color: #008080;">28</span> <span style="color: #0000ff;">byte</span>[] buff=<span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[12<span style="color: #000000;">]; </span><span style="color: #008080;">29</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> num; </span><span style="color: #008080;">30</span> <span style="color: #0000ff;">while</span> ((num=raf.read(buff))!=-1){<span style="color: #008000;">//</span><span style="color: #008000;">将指针后面的内容先存储到临时文件中</span> <span style="color: #008080;">31</span> fos.write(buff,0,num);<span style="color: #008000;">//</span><span style="color: #008000;">避免脏读</span> <span style="color: #008080;">32</span> <span style="color: #000000;"> } </span><span style="color: #008080;">33</span> raf.seek(points);<span style="color: #008000;">//</span><span style="color: #008000;">因为指针会随着读取数据移动,最终到末尾,所以要重新调节指针位置</span> <span style="color: #008080;">34</span> raf.writeBytes(insertContent);<span style="color: #008000;">//</span><span style="color: #008000;">将要写的内容插入</span> <span style="color: #008080;">35</span> FileInputStream fis=<span style="color: #0000ff;">new</span> FileInputStream("c:htmltesttmp.txt");<span style="color: #008000;">//</span><span style="color: #008000;">读取临时文件</span> <span style="color: #008080;">36</span> <span style="color: #0000ff;">byte</span>[] buff2=<span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[12<span style="color: #000000;">]; </span><span style="color: #008080;">37</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> num2; </span><span style="color: #008080;">38</span> <span style="color: #0000ff;">while</span> ((num2=fis.read(buff2))!=-1){<span style="color: #008000;">//</span><span style="color: #008000;">将指针后面的内容先存储到临时文件中</span> <span style="color: #008080;">39</span> raf.write(buff2,0<span style="color: #000000;">,num2); </span><span style="color: #008080;">40</span> <span style="color: #000000;"> } </span><span style="color: #008080;">41</span> <span style="color: #000000;"> fis.close(); </span><span style="color: #008080;">42</span> <span style="color: #000000;"> fos.close(); </span><span style="color: #008080;">43</span> <span style="color: #000000;"> raf.close(); </span><span style="color: #008080;">44</span> <span style="color: #000000;"> } </span><span style="color: #008080;">45</span> }
IO包中的RandomAccessFile类
标签:实例化 info 插入 rtc 子类 mod span 多个 权限
本文系统来源:https://www.cnblogs.com/ljl150/p/12370576.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!