知识点: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. centos7配置hadoop

    hadoop压缩包下载: 链接:https://pan.baidu.com/s/1dz0Hh75VNKEebcYcbN-4Hw 提取码:g2e3 java压缩包下载: 链接:https://pan.b ...

  2. JSON、GSON

    文章目录 什么是JSON 特点 JSON的数据结构 -- Object JSON的数据结构 -- Array JSON的数据结构 -- 基本类型 构建 JSON 数据 解析 JSON 数据 GSON ...

  3. TCP状态转换(图解+文字解说)

    <深入分析 javaweb 技术内幕>P38 读书扩展 作者:淮左白衣 写于2018年4月12日20:58:36 目录 TCP状态转换图解 图解三次握手 文字讲解三次握手: 图解四次挥手 ...

  4. 剑指offer15:反转链表后,输出新链表的表头。

    1 题目描述 输入一个链表,反转链表后,输出新链表的表头. 2 思路和方法 (1)利用栈作为中间存储,进行链表的反转,将压入的数据按先进后出的顺序弹出依次赋给链表再输出表头pHead. (2)将当前节 ...

  5. MongoDB 聚合函数及排序

    聚合函数 最大值  $max db.mycol.aggregate([{$group : {_id : "$by_user", num_max : {$max: "$li ...

  6. 3.ASP.NET Core Docker学习-构建单机多容器环境

    基于docker Docker运行 : docker run -p 8001:80 -d --name name1 name2:1.0 其中-p 8001:80 8001是主机的端口,80是容器的端口 ...

  7. s5p6818 从SD卡启动程序(制作SD启动卡)

    背景: 最近在学习uboot,其中有一步很重要的任务就是需要实现uboot 的验证,没有办法验证uboot是不是自己做的,那么整个开发就会收到阻碍.另外,从公司现在开发的板子来看,uboot从sd卡启 ...

  8. 通过命令行新建qt项目,并编译打包

    ref: https://blog.csdn.net/weixin_42837024/article/details/81945656 平台 :Ubuntu 18.04 QT版本   :5.9.1 ( ...

  9. Python+Appium启动手机APP或者浏览器

    一.设备信息配置 脚本如下: from appium import webdriver class my_app(): def __init__(self): desired_caps = {} # ...

  10. Python中操作mysql的pymysql模块详解(转载)

    https://www.cnblogs.com/wt11/p/6141225.html