RandomAccessFile适用于大小已知的记录组成的文件,提供的对文件访问,既可以读文件,也可以写文件,并且支持随机访问文件,可以访问文件的任意位置。文件中记录的大小不一定都相同,只要我们知道记录的大小和位置。但是该类仅限于操作文件。
RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分。除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个继承层次结构没有任何关系,它甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,从头开始编写其所有的方法(大多数都是本地的)。这么做是因为RandomAccessFile拥有和别的IO类型本质上不同的行为,因为我们可以在一个文件内向前和向后移动。它是一个直接继承Object的,独立的类。
本质上说,RandomAccessFile的工作方式类似于把DataInputStream和DataOutputStream结合起来,还添加了一些方法,其中方法getFilePointer( )用来查找当前所处的文件位置,seek( )用来在文件内移至新的位置,length( )用来判断文件大小。此外,它的构造方法还需要一个参数来表示打开模式(只读方式
r 读写方式 rw),它不支持只写文件。
只有RandomAccessFile支持搜寻方法(seek()),并且这个方法也只适用于文件。BufferedInputStream却只能允许标注(mark())位置(其值存储在内部某个变量内)和重新设定位置(reset()),但是这些功能有限,不是非常实用。
在JDK 1.4中,RandomAccessFile的绝大多数功能(但不是全部)已经被nio内存映射文件给取代了。
方法:
方法 |
描述 |
void close() |
关闭此随机访问文件流并释放与该流关联的所有系统资源。 |
FileChannelgetChannel()
|
返回与此文件关联的唯一 FileChannel 对象。 |
FileDescriptorgetFD()
|
返回与此流关联的不透明文件描述符对象。 |
longgetFilePointer()
|
返回此文件中的当前偏移量,用来查找当前所处的位置。 |
long length() |
返回此文件的长度。 |
int read() |
从此文件中读取一个数据字节 |
int read(byte[] b) |
将最多 b.length 个数据字节从此文件读入 byte 数组。 |
int read(byte[] b,int off,int len) |
将最多 len 个数据字节从此文件读入 byte 数组。 |
boolean readBoolean() |
从此文件读取一个 boolean。 |
byte readByte() |
从此文件读取一个有符号的八位值。 |
char readChar() |
从此文件读取一个字符 |
double readDouble() |
从此文件读取一个 double。 |
float readFloat() |
从此文件读取一个 float。 |
void readFully(byte[] b) |
将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。 |
void readFully(byte[] b,int off,int len)
|
将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。 |
int readInt() |
从此文件读取一个有符号的 32 位整数。 |
String readLine() |
从此文件读取文本的下一行。 |
long readLong() |
从此文件读取一个有符号的 64 位整数。 |
short readShort() |
从此文件读取一个有符号的 16 位数。 |
int readUnsignedByte() |
从此文件读取一个无符号的八位数 |
int readUnsignedShort() |
从此文件读取一个无符号的 16 位数。 |
String readUTF() |
从此文件读取一个字符串。 |
void seek(long pos) |
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。 |
void setLength(long newLength) |
设置此文件的长度。 |
int skipBytes(int n) |
尝试跳过输入的 n 个字节以丢弃跳过的字节。 |
void write(byte[] b) |
将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 |
void write(byte[] b, intoff, intlen)
|
将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。 |
void write(int b) |
向此文件写入指定的字节。 |
void writeBoolean(boolean v) |
按单字节值将 boolean 写入该文件。 |
void writeByte(int v) |
按单字节值将 byte 写入该文件 |
void writeBytes(String s) |
按字节序列将该字符串写入该文件。 |
void writeChar(int v) |
按双字节值将 char 写入该文件,先写高字节。 |
void writeChars(String s) |
按字符序列将一个字符串写入该文件。 |
void writeDouble(double v) |
使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。 |
void writeFloat(float v) |
使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四字节数量将该 int 值写入该文件,先写高字节。 |
void writeInt(int v) |
按四个字节将 int 写入该文件,先写高字节。 |
void writeLong(long v) |
按八个字节将 long 写入该文件,先写高字节 |
void writeShort(int v) |
按两个字节将 short 写入该文件,先写高字节。 |
void writeUTF(String str) |
使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。 |
案例:
package com.qunar.bean;
import java.io.File;
import java.io.RandomAccessFile;
import java.util.Arrays;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
// 判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
// 读写方式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// write 从当前指针开始写入,写入一个字节
randomAccessFile.write('A');
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
randomAccessFile.write('B');
int num = 0x7fffffff;
// 如果用write方法,每次只能写一个字节,需要写4次
randomAccessFile.write(num >>> 24);
randomAccessFile.write(num >>> 16);
randomAccessFile.write(num >>> 8);
randomAccessFile.write(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// 或者是用writeInt方法 一次写入
randomAccessFile.writeInt(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// 文件指针指向文件开头
randomAccessFile.seek(0);
// 一次性读取 把文件中内容都读到字节数组中
byte[] buffer = new byte[(int)randomAccessFile.length()];
randomAccessFile.read(buffer);
for (byte b : buffer) {
// 16进制输出
System.out.print(Integer.toHexString(b)+" ");
}//for
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.qunar.bean;
import java.io.File;
import java.io.RandomAccessFile;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
// 判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
// 读写方式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
// 写值
for(int i = 0;i < 5;++i){
randomAccessFile.writeInt(i);
}//for
// 将文件指针移到第二个Int值后
randomAccessFile.seek(2*4);
// 覆盖第三个Int值
randomAccessFile.writeInt(6);
// 文件指针指向文件开头
randomAccessFile.seek(0);
// 输出
for (int i = 0;i < 5;++i) {
System.out.print(randomAccessFile.readInt()+" ");
}//for
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.qunar.bean;
import java.io.File;
import java.io.RandomAccessFile;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
// 以下向file文件中写数据
// 占4个字节
randomAccessFile.writeInt(2015);
// 占8个字节
randomAccessFile.writeDouble(12.23);
// 占2个字节
randomAccessFile.writeShort(19);
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("欢迎来到小斯的博客");
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
// 占2个字节
randomAccessFile.writeChar('Y');
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("小斯的博客欢迎你");
// 把文件指针位置设置到文件起始处
randomAccessFile.seek(0);
System.out.println("读取一个Int值:"+randomAccessFile.readInt());
System.out.println("读取一个Double值:"+randomAccessFile.readDouble());
System.out.println("读取一个Short值:"+randomAccessFile.readShort());
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
// 将文件指针跳过2个字节
randomAccessFile.skipBytes(2);
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
031202_【第12章:JAVA IO】_RandomAccessFile笔记.pdf 031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf 031204_【第12章:JAVA IO】_字节-字符转换流笔记.pdf 031205_【第12章:JAVA IO】_内存操作流笔记.pdf ...
下面小编就为大家带来一篇Java RandomAccessFile的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java中IO流 RandomAccessFile类实例详解的相关资料,需要的朋友可以参考下
NULL 博文链接:https://chaoyi.iteye.com/blog/2083498
RandomAccessFile类的用法.docRandomAccessFile类的用法.docRandomAccessFile类的用法.doc
NULL 博文链接:https://baihe747.iteye.com/blog/2124747
本篇文章主要介绍了Java使用RandomAccessFile类对文件进行读写,详细的介绍了RandomAccessFile类的使用技巧和实例应用,有兴趣的可以了解一下
主要为大家详细介绍了Java核心编程之文件随机读写类RandomAccessFile,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
花1K内存实现高效I-O的RandomAccessFile类 自己搜搜这个关键字. 我主要是用来优化Android上多线程断点下载的写文件效率 RandomAccessFile是操作硬盘的,比操作内存的数据慢了几百万倍, 所有有人做出优化,我特上传...
在JAVA程序设计不少涉及到对文件的读写操作,本例针对这方面的问题,介绍RandomAccessFile类的文件读写操作,文件中包含有1个java文件和1个class文件
java api中的java.io.RandomAccessFile类实现文件的随机写入.
文件操作——File 、 RandomAccessFile(上).mp4
1 JAVA SE ...3.5 JavaMail(JAVA邮件服务)API详解 3.6 jxl.jar 包简介 3.7 Java与XML联合编程之SAX篇 3.8 Java与XML联合编程之DOM篇 4 其他 4.1 代码复用的规则 4.2 Java IO 包中的Decorator模式
RandomAccessFile 解决乱码
【IT十八掌徐培成】Java基础第16天-01.RandomAccessFile.zip
*3编写一个Java应用程序,利用RandomAccessFile类,把几个int型整数(1,2,3,4,5,6,7,8,9,10) * 写入到一个名字为tom.dat文件中,然后按相反顺序读出这些数据并显示在屏幕上。(注意,一个int型数据占4个...
Java中正确使用RandomAccessFile向文件中写入中文
花1K内存实现高效IO的RandomAccessFile类.doc
主要介绍了java使用RandomAccessFile类基于指针读写文件实例代码,具有一定参考价值,需要的朋友可以了解下。