知识点: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. Django面试题(附带答案)

    总结的一些Django中会问的问题,希望对你们有用. 1. Django的生命周期 当用户在浏览器输入url时,浏览器会生成请求头和请求体发送给服务端,url经过Django中的wsgi时请求对象创建 ...

  2. windows服务器入门 初始化数据盘

    本人在寒假的时候自行搭建了一个服务器,在此分享一下我的方法.本人服务器的系统为Windows 2012R2 在后面的讲解中中文英文都会有    所以不用在意系统的语言问题 1)第一步  自然就是打开服 ...

  3. [DEBUG] Springboot打包jar/war后访问包外的路径

    ======================================================== 我是Ruriko,我爱这个世界:)

  4. 2019php面试大全

    一 .PHP基础部分 1.PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows.Linux等)上配 ...

  5. Golang不会自动把slice转换成interface{}类型的slice

    目录 例子 原因 如何去实现 例子 我们时常会写一些interface,例如: type A interface{ Print() } type B struct { } func (b *B) Pr ...

  6. s5p6818裸机程序的设计:以GPIO为例

    为了调试方便,首先确保对于硬件的控制没有问题. Makefile # Makefile edited by Schips # 2019-06-21 schips@dingtalk.com # 文件类型 ...

  7. (一)第一个python语句、乘除法、获取用户输入、函数

    一.print语句 >>> print "hello World!!" python2 和python3 的print是不一样的,python3的print(“h ...

  8. 我对DES AES RSA的认识

    1.DES(Data Encryption Standard)算法:数据加密标准.是替换和置换细致而复杂的结合体,替换和置换一个接着一个,共循环16次.算法首先将明文分块,每块64位.密钥也是64位, ...

  9. 调用顺丰API实现电商专递下单和获取面单功能

    参考文章:https://www.cnblogs.com/zhangxiaoyong/p/8317229.html 顺丰需求文档: 链接:https://pan.baidu.com/s/16EEaph ...

  10. Java Web-Filter and listener

    Java Web-Filter and listener Filter:过滤器 概述 拦截请求,完成一些特殊的功能. 过滤器的作用: 一般用于完成通用的一些操作,例如登录验证(通过session来判断 ...