File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html

Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html

Java IO 字节输入输出流:http://www.cnblogs.com/ysocean/p/6854541.html

Java IO 字符输入输出流:https://i.cnblogs.com/EditPosts.aspx?postid=6859242

Java IO 包装流:http://www.cnblogs.com/ysocean/p/6864080.html

Java IO 对象流(序列化与反序列化):http://www.cnblogs.com/ysocean/p/6870069.html

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

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

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

我们查看 底层源码,可以看到:

public class RandomAccessFile implements DataOutput, DataInput, Closeable {

  实现了 DataOutput类,DataInput类,那么这两个类是什么呢?

2、数据流:DataOutput,DataInput

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

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

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

//数据输出流
File file = new File("io"+File.separator+"a.txt");
DataOutputStream dop = new DataOutputStream(new FileOutputStream(file));
//写入三种类型的数据
dop.write(65);
dop.writeChar('哥');
dop.writeUTF("帅锅");
dop.close(); //数据输入流
DataInputStream dis = new DataInputStream(new FileInputStream(file));
System.out.println(dis.read()); //65
System.out.println(dis.readChar()); //哥
System.out.println(dis.readUTF()); //帅锅
dis.close();

  

3、通过上面的例子,我们可以看到因为 RandomAccessFile 实现了数据输入输出流,那么 RandomAccessFile 这一个类就可以完成 输入输出的功能了。

  

这里面第二个参数:String mode 有以下几种形式:(ps:为什么这里的值是固定的而不弄成枚举形式,不然很容易写错,这是因为随机访问流出现在枚举类型之前,属于Java 历史遗留问题)

  

第一种:用 随机流顺序读取数据

public class RandomAccessFileTest {
public static void main(String[] args) throws Exception {
File file = new File("io"+File.separator+"a.txt");
write(file);
read(file);
} /**
* 随机流读数据
*/
private static void read(File file) throws Exception {
//以 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) throws Exception{
//以 rw 即读写的方式写入数据
RandomAccessFile ras = new RandomAccessFile(file, "rw");
ras.writeByte(65);
ras.writeInt(97);
ras.writeUTF("帅锅"); ras.close();
} }

  

第二种:随机读取,那么我们先介绍这两个方法

这里所说的偏移量,也就是字节数。一个文件是有N个字节数组成,那么我们可以通过设置读取或者写入的偏移量,来达到随机读取或写入的目的。

我们先看看Java 各数据类型所占字节数:

下面是 随机读取数据例子:

/**
* 随机流读数据
*/
private static void read(File file) throws Exception {
//以 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();
}

  

 随机流复制文件:

/**
* 随机流复制文件
* @param fileA
* @param B
* @throws Exception
*/
private static void copyFile(File fileA,File fileB) throws Exception{ RandomAccessFile srcRA = new RandomAccessFile(fileA, "rw");
RandomAccessFile descRA = new RandomAccessFile(fileB, "rw"); //向 文件 a.txt 中写入数据
srcRA.writeByte(65);
srcRA.writeInt(97);
srcRA.writeUTF("帅锅");
//获取 a.txt 文件的字节长度
int len = (int) srcRA.length();
srcRA.seek(0);
System.out.println(srcRA.readByte()+srcRA.readInt()+srcRA.readUTF()); //开始复制
srcRA.seek(0);
//定义一个数组,用来存放 a.txt 文件的数据
byte[] buffer = new byte[len];
//将 a.txt 文件的内容读到 buffer 中
srcRA.readFully(buffer);
//再将 buffer 写入到 b.txt文件中
descRA.write(buffer); //读取 b.txt 文件中的数据
descRA.seek(0);
System.out.println(descRA.readByte()+descRA.readInt()+descRA.readUTF());
//关闭流资源
srcRA.close();
descRA.close();
}

  

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

Java IO详解(六)------随机访问文件流的更多相关文章

  1. Java IO详解(七)------随机访问文件流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  2. Java IO 详解

    Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正, ...

  3. java io详解(1)

    一.java io结构图 二.java io的开始:文件 三.字节流: 一.java io结构图 流分类: 1.Java的字节流    InputStream是所有字节输入流的祖先,而OutputSt ...

  4. Java I/O---RandomAccessFile类(随机访问文件的读取和写入)

    1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引 ...

  5. Java IO详解(六)------序列化与反序列化(对象流)

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  6. JAVA IO 详解2

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  7. JAVA IO详解

    [案例1]创建一个新文件 1 2 3 4 5 6 7 8 9 10 11 import java.io.*; class hello{     public static void main(Stri ...

  8. Java IO详解(转)

    IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块. 一.简介 IO操作面临很多问题,信息量的巨大,网络的环境等等,因为IO不仅仅是对本地文件.目录的操作,有时对二进 ...

  9. Java IO详解(一)------字节输入输出流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

随机推荐

  1. JSP九大内置对象的作用和用法总结(转)

    SP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1.r ...

  2. MySQL---事务知识,你搞明白没有?

    MySQL - 事务 在学习事务这一概念前,我们需要需要构思一个场景 场景构思 假设该场景发生于一个银行转账背景下,月中,又到了发工资的日子.潭州教育科技集团打算给Tuple老师发放一个月的工资.(此 ...

  3. javaweb浏览器随机输出一张验证码图片

    一.在web.xml中的配置如下: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns: ...

  4. 青客宝redis内部分享ppt

    Redis:最好的缓存数据库 说Redis是缓存服务,估计有些人会不开心,因为Redis也可以把数据库持久化,但是在大多数情况Redis的竞争力是提供缓存服务.说到缓存服务必然会想到Memcached ...

  5. [原]C#与非托管——初体验

    P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简 ...

  6. 面试题(一)—Java基础(上)

    1.面向对象的三大特征 (1)封装      封装性指的是隐藏了对象的属性和实现细节,对外仅提供公共的访问方式.      好处: 将变化隔离,提供复用性和安全性. (2)继承      提高代码的复 ...

  7. chrome插件推荐

    分享自己一直在用的chrome插件 1. Adblock Plus 广告屏蔽插件,能够屏蔽YouTube视频广告.Facebook广告.弹出窗口和其他显眼的广告,个人认为非常强大. 2.AutoPag ...

  8. MySQL读写分离技术

    1.简介 当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来.然而我们有很多办法可以缓解数据库的压力.分布式数据库.负载均衡.读写分离.增加缓存服务器等等.这里我们将采用读写分 ...

  9. 变态版大鱼吃小鱼-基于pixi.js 2D游戏引擎

    之前用CSS3画了一条

  10. okHttp基础用法

    获取okHttp..jar.包 1.联网获取jar包 2.本地添加 okHttp的使用 get请求 1.创建okHttpClient对象new OkHttpClient(); 2.创建一个请求对象Re ...