知识点:RandomAccessFile (随机访问文件)类

(一)描述

前一篇博客中https://www.cnblogs.com/shuaifing/p/11490160.html,主要描述FileInputStream/FileOutPutStream、FileReader/FileWriter、BufferedInputStream/BufferedOutputStream、BufferedReader/BufferedWriter的使用,文件时,都是从文件的开头写入数据,第二次执行写操作时,会覆盖文件之前的内容,那么如果我们想,在访问一个文件时,在某个指定的位置写入数据,可以使用RandomAccessFile(随机访问文件)类。

RandomAccessFile(String name,String mode):name为文件名,model操作模式

“r” : 只读

“rw” : 读写,支持文件读取或者写入,文件不存在,创建

“rws” : s为synchronous 同步 (每次同步更新到潜在的设备中去),更新文件内容而且更新元数据(metadata),因此至少要求1次低级别的I/O操作

“rwd” : 每次同步更新到潜在的设备中去

(二)实例

(1)在文本的一行中的,某个位置插入字符串

文本文档test6.txt

//文本文档,中hello后面加上ab字符串
@Test
public void testRandomAccessFileInsertLine(){
RandomAccessFile raf2=null;
try {
raf2=new RandomAccessFile(new File("E:/test/io/test6.txt"),"rw");
//插入 ab
raf2.seek(5);//指针指向5的位置
String str= raf2.readLine();//读取文本的5位置开始第一行数据,指针指向第一行数据的末尾
raf2.seek(5);//指针从新指向5的位置
raf2.write("ab".getBytes());//在5的位置写入ab字符串
raf2.write(str.getBytes());//在ab字符串后面写入之前读取的第一行后面的数据
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf2!=null) {
try {
raf2.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
} 结果:
如果文本中有多行数据,则会显现问题如下
原文本内容:
执行代码后:

(2)在文本文档中的,任意一行的某个位置插入字符串

//文本文档,任意一行的某个位置插入字符串
@Test
public void testRandomAccessFileInsertAll(){
RandomAccessFile raf2=null;
try {
raf2=new RandomAccessFile(new File("E:/test/io/test6.txt"),"rw");
//插入 ab
raf2.seek(5);//指针指向位置5
byte[] b=new byte[20];
int len;
StringBuffer sb=new StringBuffer();//指针5位置后面的数据存放到 sb中
if((len = raf2.read(b))!=-1){
sb.append(new String(b,0,len));
}
raf2.seek(5);//指针从新指向5的位置
raf2.write("ab".getBytes());//在5的位置写入ab字符串
raf2.write(sb.toString().getBytes());//将存放到sb中的数据写入文本文件中
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf2!=null) {
try {
raf2.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

效果:

(3)文件复制

//文件读写
@Test
public void testRandomAccessFile1(){
RandomAccessFile raf1=null;
RandomAccessFile raf2=null;
try {
raf1=new RandomAccessFile(new File("E:/test/io/test.txt"),"r");
raf2=new RandomAccessFile(new File("E:/test/io/test6.txt"),"rw");
byte[] b=new byte[10];
int len;
while((len=raf1.read(b))!=-1){
raf2.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf2!=null) {
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(raf1!=null) {
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

java中的io流总结(二)——RandomAccessFile类的更多相关文章

  1. Java中的IO流(二)

    上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...

  2. Java中的IO流(三)

    上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...

  3. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

  4. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  5. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  6. Java中的IO流(四)

    上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...

  7. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  8. java中的IO流

    Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...

  9. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

  10. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

随机推荐

  1. 基于MSP430G2系列实现的步进电机控制

    基于MSP430G2系列实现的步进电机控制 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路 ...

  2. JS CSS写下拉菜单 竖行

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [NOIP普及组2001]最大公约数和最小公倍数问题

    目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 数据 样例 输入 输出 说明 题目名称:最大公约数和最小公倍数问题 来源:2001年NOIP普及组 链接 博客链接 CSDN 洛谷 ...

  4. ARTS第六周打卡

    Algorithm : 做一个 leetcode 的算法题 1.合并两个排序链表 2.树的子结构 3.二叉树的镜像 4.包含Min函数的栈 5.栈的压入.弹出 6.二叉搜索树的后序遍历 7.从上往下打 ...

  5. python学习-25 函数递归

    递归 例如: def abc(n): print(n) if int(n/2) == 0: return n return abc(int(n/2)) abc(10) 运行结果: 10 5 2 1 P ...

  6. python学习-17 列表list 2

    # 1. 选择嵌套列表里的元素(内部进行了for循环) li = [1,2,",45]],"abc",True] a = li[3][2][1] print(a) 运行结 ...

  7. c++/c在两个文件公用一个变量

    在一个cpp文件定义一个文件 在另一个文件extern+定义

  8. 数据库设计_ERMaster安装使用_PowerDesigner数据设计工具

    数据库设计 1. 说在前面 项目开发的流程包括哪些环节 需求调研[需求调研报告]-- 公司决策层 (1) 根据市场公司需求分析公司是否需要开发软件来辅助日常工作 (2) 公司高层市场考察,市场分析,决 ...

  9. c#基于TCP/IP、CIP协议的欧姆龙PLC通信

    一.关于CIP协议 CIP通信是Common Industrial Protocl(CIP)的简称,它是一个点到点的面向对象协议,能够实现工业器件(传感器,执行器)之间的连接,和高等级的控制器之间的连 ...

  10. Django rest-framework框架-组件之路由

    路由: a. url(r'^(?P<version>[v1|v2]+)/v1/$',views.ViewView.as_view()) url(r'^(?P<version>[ ...