java随机访问方式读文件_Java IO详解(七)------随机访问文件流

本文介绍了Java中的RandomAccessFile类,它支持随机访问文件进行读写操作。RandomAccessFile可以像数组一样在文件的任意位置进行读写,同时它还实现了DataOutput和DataInput接口,支持数据的输入输出流功能。文章通过实例展示了如何使用RandomAccessFile进行数据的读写,以及如何进行文件复制。
摘要由CSDN通过智能技术生成

1、什么是 随机访问文件流 RandomAccessFile?

该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。

通俗来讲:我们以前讲的 IO 字节流,包装流等都是按照文件内容的顺序来读取和写入的。而这个随机访问文件流我们可以再文件的任意地方写入数据,也可以读取任意地方的字节。

public class RandomAccessFile implementsDataOutput, DataInput, Closeable {

底层源码,实现了 DataOutput类,DataInput类。

2、数据流:DataOutput,DataInput

①、DataOutput:提供将数据从任何Java基本类型转换为一系列字节,并将这些字节写入二进制流。 还有一种将String转换为modified UTF-8格式(这种格式会在写入的数据之前默认增加两个字节的长度)并编写结果字节系列的功能。

②、DataInput:提供从二进制流读取字节并从其中重建任何Java原语类型的数据。 还有,为了重建设施String从数据modified UTF-8格式。

下面我们以其典型实现:DataOutputSteam、DataInputStream 来看看它的用法:

packagestreamrandom;import java.io.*;/***

* @ClassName: DataOutputDemo

* @Description: TODO

* @Auther: chujiu

* @Date: 2020/6/11

*@version: V1.0*/

public classDataOutputDemo {public static void main(String[] args) throwsIOException {//RandomAccessFile//数据输出流

File file = new File("G:" + File.separator + "javabased" + File.separator + "JavaTest" + File.separator + "DataOutputDemo.txt");

DataOutputStream dop= new DataOutputStream(newFileOutputStream(file));//写入三种类型的数据

dop.write(65);

dop.writeChar('茶');

dop.writeUTF("雪碧");

dop.close();//数据输入流

DataInputStream dis = new DataInputStream(newFileInputStream(file));

System.out.println(dis.read());//65

System.out.println(dis.readChar()); //茶//读取UTF

System.out.println(dis.readUTF()); //雪碧

dis.close();

}

}

3、RandomAccessFile 这一个类就可以完成 实现了数据输入输出流的功能了。

//创建随机存储文件流,文件属性由参数File对象指定

public RandomAccessFile(File file, String mode)

//创建随机存储文件流,文件名由参数name指定

public RandomAccessFile(String name, String mode)

“r”:以只读的方式打开,调用该对象的任何write(写)方法都会导致IOException异常

“rw”:以读、写方式打开,支持文件的读取或写入。若文件不存在,则创建之。

“rws”:以读、写方式打开,与“rw”不同的是,还要对文件内容的每次更新都同步更新到潜在的存储设备中去。这里的“s”表示synchronous(同步)的意思

“rwd”:以读、写方式打开,与“rw”不同的是,还要对文件内容的每次更新都同步更新到潜在的存储设备中去。使用“rwd”模式仅要求将文件的内容更新到存储设备中,而使用“rws”模式除了更新文件的内容,还要更新文件的元数据(metadata),因此至少要求1次低级别的I/O操作

用 随机流顺序读取数据

packagestreamrandom;importjava.io.File;importjava.io.RandomAccessFile;/***

* @ClassName: RandomAccessFileDemo

* @Description: TODO

* @Auther: chujiu

* @Date: 2020/6/12

*@version: V1.0*/

public classRandomAccessFileDemo {public static void main(String[] args) throwsException {

File file= new File("G:" + File.separator + "javabased" + File.separator + "JavaTest" + File.separator + "RandomAccessFileDemo.txt");

write(file);

read(file);

}/*** 随机流读数据*/

private static void read(File file) throwsException {//以 r 即只读的方法读取数据

RandomAccessFile ras = new RandomAccessFile(file, "r");byte b =ras.readByte();

System.out.println(b);//65

int i =ras.readInt();

System.out.println(i);//97

String str= ras.readUTF(); //可乐

System.out.println(str);

ras.close();

}/*** 随机流写数据*/

private static void write(File file) throwsException {//以 rw 即读写的方式写入数据

RandomAccessFile ras = new RandomAccessFile(file, "rw");

ras.writeByte(65);

ras.writeInt(97);

ras.writeUTF("可乐");

ras.close();

}

}

随机流读数据

packagestreamrandom;importjava.io.File;importjava.io.RandomAccessFile;/***

* @ClassName: RandomAccessFileTest

* @Description: TODO

* @Auther: chujiu

* @Date: 2020/6/12

*@version: V1.0*/

public classRandomAccessFileTest {public static void main(String[] args) throwsException {

File file= new File("G:" + File.separator + "javabased" + File.separator + "JavaTest" + File.separator + "RandomAccessFileDemo.txt");

read(file);

}/*** 随机流读数据*/

private static void read(File file) throwsException {//以 r 即只读的方法读取数据

RandomAccessFile ras = new RandomAccessFile(file, "r");byte b =ras.readByte();

System.out.println(b);//65//我们已经读取了一个字节的数据,那么当前偏移量为 1

System.out.println(ras.getFilePointer()); //1//这时候我们设置 偏移量为 5,那么可以直接读取后面的字符串(前面是一个字节+一个整型数据=5个字节)

ras.seek(5);

String str= ras.readUTF(); //可乐

System.out.println(str);//这时我们设置 偏移量为 0,那么从头开始

ras.seek(0);

System.out.println(ras.readByte());//65//需要注意的是:UTF 写入的数据默认会在前面增加两个字节的长度

ras.close();

}

}

随机流复制文件:

packagestreamrandom;importjava.io.File;importjava.io.RandomAccessFile;/***

* @ClassName: RandomAccessFileCopy

* @Description: TODO

* @Auther: chujiu

* @Date: 2020/6/12

*@version: V1.0*/

public classRandomAccessFileCopy {public static void main(String[] args) throwsException {

File f1= new File("G:" + File.separator + "javabased" + File.separator + "JavaTest" + File.separator + "RandomAccessFileCopy1.txt");

File f2= new File("G:" + File.separator + "javabased" + File.separator + "JavaTest" + File.separator + "RandomAccessFileCopy2.txt");

copyFile(f1, f2);

}/*** 随机流复制文件

*

*@paramfileA

*@param*@throwsException*/

private static void copyFile(File fileA, File fileB) throwsException {

RandomAccessFile srcRA= new RandomAccessFile(fileA, "rw");

RandomAccessFile descRA= new RandomAccessFile(fileB, "rw");//向 文件 1.txt 中写入数据

srcRA.writeByte(65);

srcRA.writeInt(97);

srcRA.writeUTF("可乐");//获取 1.txt 文件的字节长度

int len = (int) srcRA.length();

srcRA.seek(0);//System.out.println(srcRA.readByte());//System.out.println(srcRA.readInt());//System.out.println(srcRA.readUTF());

System.out.println(srcRA.readByte() + srcRA.readInt() +srcRA.readUTF());//开始复制

srcRA.seek(0);//定义一个数组,用来存放 1.txt 文件的数据

byte[] buffer = new byte[len];//将 1.txt 文件的内容读到 buffer 中

srcRA.readFully(buffer);//再将 buffer 写入到 2.txt文件中

descRA.write(buffer);//读取 2.txt 文件中的数据

descRA.seek(0);//System.out.println(descRA.readByte());//System.out.println(descRA.readInt());//System.out.println(descRA.readUTF());

System.out.println(descRA.readByte() + descRA.readInt() +descRA.readUTF());//关闭流资源

srcRA.close();

descRA.close();

}

}

ps:一般多线程下载、断点下载都可以运用此随机流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值