Java IO详解(六)------随机访问文件流
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详解(六)------随机访问文件流的更多相关文章
- Java IO详解(七)------随机访问文件流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- Java IO 详解
Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正, ...
- java io详解(1)
一.java io结构图 二.java io的开始:文件 三.字节流: 一.java io结构图 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖先,而OutputSt ...
- Java I/O---RandomAccessFile类(随机访问文件的读取和写入)
1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引 ...
- Java IO详解(六)------序列化与反序列化(对象流)
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- JAVA IO 详解2
Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...
- JAVA IO详解
[案例1]创建一个新文件 1 2 3 4 5 6 7 8 9 10 11 import java.io.*; class hello{ public static void main(Stri ...
- Java IO详解(转)
IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块. 一.简介 IO操作面临很多问题,信息量的巨大,网络的环境等等,因为IO不仅仅是对本地文件.目录的操作,有时对二进 ...
- Java IO详解(一)------字节输入输出流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
随机推荐
- asp.net SignalR 一对一聊天
<script src="~/Scripts/jquery-1.8.2.min.js"></script> <script src="~/S ...
- ios 获取当前ViewController
- (UIViewController*)getpresentVC:(UIWindow *)window{ if ([window.rootViewController class]==[UITabB ...
- 你不得不知的逻辑或(||)与(&&)非(!)
最近重新翻开原生JS,又得到很多不同的体会,虽然现在开发框架那么多,但很多思想都还是离不开原生的基础.今天呢,我就根据自己的学习总结一下逻辑与(&&)和(逻辑或(||)和逻辑非(!). ...
- php变量布尔值验证
使用 PHP 函数对变量 $x 进行比较 表达式 gettype() empty() is_null() isset() boolean : if($x) $x = ""; str ...
- WebForm捆绑压缩js和css(WebForm Bundling and Minification)
.net framework 4以上,可以使用Microsoft.AspNet.Web.Optimization 新建4.0项目 Nuget搜索optimization,安装第一个包 加入Bundle ...
- MidpointRounding 枚举值简要说明
1. MidpointRounding.AwayFromZero 当小数点后取舍时5 时会取绝对值大的如 4.5 会取5 及正常的4舍5入. -- 官方解释翻译解释取绝对值小值感觉反译错了. 2.Mi ...
- redis 链表
redis 链表 前言 借鉴了 黄健宏 的 <<Redis 设计与实现>> 一书, 对 redis 源码进行学习 欢迎大家给予意见, 互相沟通学习 概述 redis 的链表结构 ...
- React之key详解
一个例子 有这样的一个场景如下图所示,有一组动态数量的input,可以增加和删除和重新排序,数组元素生成的组件用index作为key的值,例如下图生成的ui展示: 上面例子中的input组件渲染的代码 ...
- Hadoop安全机制之令牌
介绍 Hadoop中的安全机制包括认证和授权.而Hadoop RPC中采用SASL(Simple Authentication and Security Layer,简单认证和安全层)进行安全认证,具 ...
- 【解决问题】解决python安装模块时UnicodeDecodeError
安装模块时,出现报错: UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 68: ordinal not in ...