RandomAccessFile是一个很有用的类,可以将字节流写入到磁盘文件中,对应的也可以从磁盘文件中读取出字节流,在API中关于RandomAccessFile的描述如下:
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针
;
输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开
始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer
方法读取,并通过 seek
方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException
(是一种 IOException
)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException
,而不是 EOFException
。需要特别指出的是,如果流已被关闭,则可能抛出 IOException
。
以下是两个RandomAccessFile的写入和读取的简单例子:
1、 将字节流写入到磁盘中
private static void testCreateFile(){
String directory = “D:/program/test”;
String name = “t.gen”;
File f = new File(directory, name);
RandomAccessFile file = null;
try {
file = new RandomAccessFile(f, “rw”);
byte[] b = {5,10,15,20};
try {
//如果没有这行,文件也会生成,只是文件为空
file.write(b,0,4);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if (null!=file){
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、 从磁盘文件中读取字节流
private static void testReadFile(){
String directory = “D:/program/luceneDemo3.0/test”;
String name = “t.gen”;
File f = new File(directory, name);
RandomAccessFile file = null;
try {
file = new RandomAccessFile(f, “rw”);
byte[] b = new byte[4];
try {
long len = file.length();
file.read(b);
//设置要读取的字节位置
file.seek(1);
System.out.println(file.readByte()+”>>FilePointer>>”+file.getFilePointer());
for (int i=0;i<b.length;i++){
System.out.println(“>>>”+b[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if (null!=file){
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
说明
:
1、 这个类依我看来,用来处理字节流(byte)是很好的,如果用来处理字符(串)或其他数据类型,比如int、long,我试了感觉效果并不好,尤其是处理中文字符串的时候,那简直就是一个灾难,你会又碰上纠缠不清的乱码!
2、
seek(long pos)方法
是在读取的时候用来设置读取到哪一个字节的,比如在例子中有5,10,15,20字节,在byte数组中分别对应0、1、2、3位置,同样在文件
file = new RandomAccessFile(f,
“rw”);中,也对应着0、1、2、3位置,所以如果设置file.seek(1);就表示通过file.readByte()读取的时候,读取的是第
1位置的数据,也就是10了。
3、 getFilePointer()方法
在通过上面说的seek
(long pos)设置后,getFilePointer()得到的就是当前文件中的字节位置,也就是所说的偏移量了。比如在这个例子中,getFilePointer()的值就是1.
4、文件模式
“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
“rws” 打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
“rwd” 打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备。
附录
:
void |
close
()
关闭此随机访问文件流并释放与该流关联的所有系统资源。 |
FileChannel |
getChannel
()
返回与此文件关联的唯一 FileChannel 对象。 |
FileDescriptor |
getFD
()
返回与此流关联的不透明文件描述符对象。 |
long |
getFilePointer
()
返回此文件中的当前偏移量。 |
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, int off, int len)
将 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 编码以与机器无关的方式将一个字符串写入该文件。 |
分享到:
相关推荐
RandomAccessFile类是Java I/O库中的一个重要组件,它提供了对文件进行随机访问的能力,这意味着你可以直接跳到文件的任意位置进行读写操作,而不仅仅局限于从头到尾的顺序访问。这个类非常适合处理大数据量的文件,...
### RandomAccessFile 解决乱码 #### 背景与问题描述 在Java编程中,`RandomAccessFile` 类提供了一种方式来处理文件中的数据,允许程序随机访问文件的任何部分。但在处理中文或其他非ASCII字符时,可能会遇到乱码...
### 使用RandomAccessFile流将一个文本文件读出并写入到另一个文件中的知识点解析 在Java编程语言中,`RandomAccessFile`类提供了一种非常灵活的方式来读取和写入文件。它支持随机访问,意味着我们可以直接跳转到...
### RandomAccessFile 向文件中写入中文 在Java编程中,经常需要处理文件操作,尤其是在涉及中文字符的写入时。本篇文章将详细介绍如何利用`RandomAccessFile`类正确地向文件中写入中文字符,并解释不同写入方法的...
Java的`RandomAccessFile`类是Java I/O流体系中的一种特殊类型,它允许程序员以随机访问模式读取和写入文件。与传统的输入/输出流不同,`RandomAccessFile`可以直接定位到文件的任意位置进行读写操作,这对于处理...
随机访问文件(RandomAccessFile)是Java提供的一个类,它允许程序随机访问文件中的任意位置,进行读写操作。使用RandomAccessFile可以在文件的任意位置插入数据,这对于那些需要在文件中间添加内容而不干扰其他数据...
Java中的RandomAccessFile类是用于文件随机读写的工具类,它属于java.io包。RandomAccessFile提供了读取和写入文件的能力,并且允许程序访问文件的任意位置,这使得它能够方便地进行文件的随机访问。...
- 读取WAV文件头信息:通过`java.io.RandomAccessFile`类读取文件,并解析出关键参数。 - 解码WAV数据:使用`java.nio`包中的缓冲区进行高效的数据读取和转换。 - 转换格式:实现音频数据的位深度和声道数转换。 - ...
okhttp +greendao+线程池+service+RandomAccessFile等技术实现多任务多线程断点续传后台下载,完整demo直接就能使用 ,demo中包含greendao 自定义类型转换
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
例如,使用`java.io.RandomAccessFile`来读写文件,`ByteBuffer`来处理二进制数据,以及手动计算和设置头信息的各个字段。 转换后的WAV文件由于包含了完整的头信息,可以被大多数音频播放器识别并播放,而无需额外...
本教程将详细介绍如何使用JSP(JavaServer Pages)创建一个基础的留言版,特别关注如何处理中文乱码问题以及使用`RandomAccessFile`进行文件操作。首先,我们需要理解JSP的核心概念,它是Java技术在Web开发中的一个...
} } /** * 随机读取文件内容 * * @param fileName * 文件名 */ public static void readFileByRandomAccess(String fileName) { RandomAccessFile randomAccessFile = null; try { randomAccessFile = new ...
在 DELPHI 中,文件操作是通过 TFileStream 来实现的,而在 JAVA 中,则是通过 InputStream/OutputStream 和 RandomAccessFile 来实现的。 目录操作 在 DELPHI 中,目录操作是通过 FindFirst 等来实现的,而在 ...
本文将详细介绍两种常用的方法来实现这一功能:使用`RandomAccessFile`类以及使用`FileWriter`类。 #### 使用`RandomAccessFile` `RandomAccessFile`是Java标准库中的一个类,它提供了对文件进行随机访问的能力。...
4. **随机访问文件类`RandomAccessFile`的应用**:掌握如何使用`RandomAccessFile`类读取大文件并定位特定记录。 #### 二、纯真IP数据库简介 纯真IP数据库是一款由国内开发者开发的免费开源IP数据库,它可以用于...
RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); PDFFile pdf...
RandomAccessFile raFile = new RandomAccessFile("目标文件路径", "rw"); raFile.seek(定位位置); // 设置写入位置 ``` 3. **写入文件**: - 写入文件时,可以选择`PrintWriter`、`BufferedWriter`或者`...
1. **RandomAccessFile类**:这是一个强大的文件I/O类,它不仅支持顺序读写,还能随机访问文件的任意位置。在这个程序中,使用`RandomAccessFile`创建了一个名为`Rdafile`的对象,用于读写文件。构造函数`...
RandomAccessFile file = new RandomAccessFile("Java_2.java", "r"); long fileLength = file.length(); while (filePoint ) { s = file.readLine(); System.out.println(s); filePoint = file....