Java基础——IO流4_随机访问文件流

Posted 匠心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础——IO流4_随机访问文件流相关的知识,希望对你有一定的参考价值。

一、随机访问文件流

1、介绍

  RandomAccessFile既可以作为一个输入流,又可以作为一个输出流。作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。若存在,则会对原有文件内容进行覆盖,默认情况下,从头覆盖。注意,不会覆盖掉整个文件内容。
  创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定它的访问模式:

  r:以只读方式打开。
  rw:打开以便读取和写入。
  rwd:打开以便读取和写入;同步文件内容的更新。
  rws:打开以便读取和 写入;同步文件内容和元数据的更新。

  如果模式为 r,则不会创建文件,而是去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。
  如果模式为 rw 读写,若文件不存在则会创建文件,若存在则不会创建。

2、RandomAccessFile

  代码示例:复制图片

 public class Main 
     public static void main(String[] args) 
         try (RandomAccessFile raf1 = new RandomAccessFile(new File("F:\\\\hello.png"), "r");
              RandomAccessFile raf2 = new RandomAccessFile(new File("F:\\\\hello_1.png"), "rw");) 
 
             byte[] buffer = new byte[1024];
             int len;
 
             while ((len = raf1.read(buffer)) != -1) 
                 raf2.write(buffer, 0, len);
             
          catch (Exception e) 
         
     
 

  代码示例:随机写入文件

 // 文件:F:\\\\hello.txt
 // 内容:abcdefgh
 public class Main 
     public static void main(String[] args) 
 
         File file = new File("F:\\\\hello.txt");
         try (RandomAccessFile raf = new RandomAccessFile(file, "rw");) 
 
             // raf1.seek(file.length()); // 可实现在文件末尾追加
 
             // 将指针调到角标为3的位置
             raf.seek(3);
             raf.write("xyz".getBytes());
 
          catch (Exception e) 
         
     
 
 
 // 结果
 // abcxyzgh

  代码示例:实现数据插入的效果

 // 文件:F:\\\\hello.txt
 // 内容:
 abcdefghi
 jkl
 mn
 public class Main 
     public static void main(String[] args) 
         File file = new File("F:\\\\hello.txt");
 
         try (RandomAccessFile raf = new RandomAccessFile(file, "rw");) 
             // 1.将要插入的位置后面的数据保存起来
             raf.seek(3);
             StringBuilder builder = new StringBuilder((int) file.length());
 
             // 2.将读到的数据保存在 builder 中
             byte[] buffer = new byte[1024];
             int len;
             while ((len = raf.read(buffer)) != -1) 
                 builder.append(new String(buffer, 0, len));
             
 
             // 3.调回指针,插入数据 “xyz”
             raf.seek(3);
             raf.write("xyz".getBytes());
 
             // 4.将 builder 中的数据追加到文件中
             raf.write(builder.toString().getBytes());
          catch (Exception e) 
         
     
 
 
 // 结果
 abcxyzdefghi
 jkl
 mn

  很显然,这种方式,对于文本文件很大的情况,且在前面的位置做插入,很不友好。

3、应用

  可以用 RandomAccessFile 这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针位置,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能。

作者:Craftsman-L

本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。

如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!

以上是关于Java基础——IO流4_随机访问文件流的主要内容,如果未能解决你的问题,请参考以下文章

Java基础IO流RandomAccessFile

阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_4_OutputStreamWriter介绍&代码实现

java 21 - 12 随机访问流(不属于IO流)

毕向东_Java基础视频教程第20天_IO流(1~4)

JAVA IO 随机文件访问流

阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_4_字节输出流写入数据到文件