Java基础(八)——IO流4_随机访问文件流
2022-01-04 21:08
417 查看
一、随机访问文件流
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 这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针位置,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能。
相关文章推荐
- Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile
- Java基础知识强化之IO流笔记47:IO流练习之 随机获取文本文件中的姓名案例
- Java IO流之普通文件流和随机读写流区别
- [Java核心API]IO流--随机访问文件RandomAccessFile
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties
- Java IO流(三)-- 文件的处理与随机访问
- Java基础巩固系列 RandomAccessFile(随机访问文件)
- Java中的随机访问文件流RandomAccessFile
- Java IO详解(七)------随机访问文件流
- java IO流 ObjectStream PipedStream 随机访问文件 字符编码--21
- 【Java基础】随机输入输出文件流(RandomAccessFile)的使用
- java基础-RandomAccessFil(随机访问)
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties
- Java IO流->处理流->“随机访问” 的方式:RandomAccessFile
- Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)
- JAVA基础 day23 IO流的其他类 (对象的序列化 管道流 RandomAccessFile类(随机读取文件) DateStream(操作基本数据类型的流) 操作数组的流 )字符编码问题
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties...
- Java基础 - 序列流,内存输出流,随机访问流,对象操作流,数据输入输出流,打印流,标准输入输出流,Properties
- JAVA_基础IO流随机存取文件流(四)
- java语言基础(85)——标准输入输出流 和 随机访问流