RandomAccessFile

RandomAccessFile

public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable

随机访问文件类最大的特点是可以随机访问文件,对指定的文件位置进行读写

此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;

输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;

输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。

通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。

getFilePointer

public long getFilePointer()
throws IOException
返回此文件中的当前偏移量。
返回:
到此文件开头的偏移量(以字节为单位),在该位置发生下一个读取或写入操作。
抛出:
IOException - 如果发生 I/O 错误。

seek

public void seek(long pos)
throws IOException
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。偏移量的设置可能会超出文件末尾。偏移量的设置超出文件末尾不会改变文件的长度。只有在偏移量的设置超出文件末尾的情况下对文件进行写入才会更改其长度。
参数:
pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
抛出:
IOException - 如果 pos 小于 0 或者发生 I/O 错误。
由于实现了DataInput/DataOutput接口,RandomAccessFile可以 读写JAVA的基本类型
writeUTF

writeUTF

public final void writeUTF(String str)
throws IOException
使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。首先,把两个字节从文件的当前文件指针写入到此文件,类似于使用 writeShort 方法并给定要跟随的字节数。此值是实际写出的字节数,而不是该字符串的长度。在该长度之后,按顺序输出该字符串的每个字符,并对每个字符使用 UTF-8 修改版编码。
指定者:
接口 DataOutput 中的 writeUTF
参数:
str - 要写入的字符串。
抛出:
IOException - 如果发生 I/O 错误。      

readUTF

public final String readUTF()
throws IOException从此文件读取一个字符串。该字符串已使用 UTF-8 修改版格式进行编码。 
从当前文件指针开始读取前两个字节,此值给出已编码字符串中随后的字节数,而不是结果字符串的长度。随后的字节然后解释为 UTF-8 修改版格式的字节编码字符,并转换为字符。

在读取了所有字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readUTF
返回:
一个 Unicode 字符串。 
抛出: 
EOFException - 如果在读取所有字节之前此文件已到达末尾。 
IOException - 如果发生 I/O 错误。 
UTFDataFormatException - 如果这些字节不表示 Unicode 字符串的有效 UTF-8 修改版编码。

skipBytes

       public int skipBytes(int n)

throws IOException尝试跳过输入的 n 个字节以丢弃跳过的字节。
此方法可能跳过一些较少数量的字节(可能包括零)。这可能由任意数量的条件引起;在跳过 n 个字节之前已到达文件的末尾只是其中的一种可能。此方法从不抛出 EOFException。返回跳过的实际字节数。如果 n 为负数,则不跳过任何字节。

指定者:
接口 DataInput 中的 skipBytes
参数:
n - 要跳过的字节数。
返回:
跳过的实际字节数。

RandomAccessFile读写基本类型:

package io.randomaccessfile;

import java.io.*;

public class RandomAccessFileDemo
{
	public static void main(String[] args) throws Exception
	{
		RandomAccessFile file = new RandomAccessFile("file", "rw");
		// 以下向file文件中写数据
		file.writeInt(20);// 占4个字节
		file.writeDouble(8.236598);// 占8个字节
		file.writeUTF("这是一个UTF字符串");// 这个长度写在当前文件指针的前两个字节处,可用readShort()读取
		file.writeBoolean(true);// 占1个字节
		file.writeShort(395);// 占2个字节
		file.writeLong(2325451l);// 占8个字节
		file.writeUTF("又是一个UTF字符串");// 首先,把两个字节从文件的当前文件指针写入到此文件,类似于使用 writeShort
									// 方法并给定要跟随的字节数。此值是实际写出的字节数,而不是该字符串的长度。在该长度之后,按顺序输出该字符串的每个字符,并对每个字符使用
									// UTF-8 修改版编码。
		file.writeFloat(35.5f);// 占4个字节
		file.writeChar(‘a‘);// 占2个字节

		file.seek(0);// 把文件指针位置设置到文件起始处

		// 以下从file文件中读数据,要注意文件指针的位置
		System.out.println("——————从file文件指定位置读数据——————");
		System.out.println(file.readInt());
		System.out.println(file.readDouble());
		System.out.println(file.readUTF());

		file.skipBytes(3);// 将文件指针跳过3个字节,本例中即跳过了一个boolean值和short值。
		System.out.println(file.readLong());
		int  strSize = file.readShort();
		file.skipBytes(strSize); //
		// 跳过文件中“又是一个UTF字符串”所占字节,注意readShort()方法会移动文件指针,所以不用加2。
		System.out.println(file.readFloat());
		System.out.println(file.readChar());

		//---------------复制操作-------------------
		System.out.println("——————文件复制(从file到fileCopy)——————");
		file.seek(0);
		RandomAccessFile fileCopy = new RandomAccessFile("fileCopy", "rw");
		int onceReadLen = 1024;
		byte []buff  = new byte[onceReadLen];
		int len=0;
		while((len=file.read(buff))!=-1)
		{
			fileCopy.write(buff, 0, len);
		}

		file.close();
		fileCopy.close();

		System.out.println("复制完成!");
	}
}

输出:

——————从file文件指定位置读数据——————
20
8.236598
这是一个UTF字符串
2325451
35.5
a
——————文件复制(从file到fileCopy)——————
复制完成!

  

RandomAccessFile 的一个应用是  多线程下载文件

时间: 2024-11-10 07:46:08

RandomAccessFile的相关文章

RandomAccessFile拆分合并文件

import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.io.SequenceInputStream; import java.util.Vector; public class RandonFileAccessTest { public static void main(String[]

[Java开发之路](7)RandomAccessFile类详解

RandomAccessFile适用于大小已知的记录组成的文件,提供的对文件访问,既可以读文件,也可以写文件,并且支持随机访问文件,可以访问文件的任意位置.文件中记录的大小不一定都相同,只要我们知道记录的大小和位置.但是该类仅限于操作文件. RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分.除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和

深入理解JAVA I/O系列四:RandomAccessFile

一.简述 这个是JDK上的截图,我们可以看到它的父类是Object,没有继承字节流.字符流家族中任何一个类.并且它实现了DataInput.DataOutput这两个接口,也就意味着这个类既可以读也可以写. 二.存在的意义 1.是JAVA I/O流体系中功能最丰富的文件内容访问类,它提供了众多方法来访问文件内容. 2.由于可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,RandomAccessFile将是更好的选择. 3.可以用来访问保存数据记录的文件,文件的记录的大小不必相同,但是

随机访问流 RandomAccessFile

RandomAccessFile不属于流,是Object的子类 但是它融合了InputStream和OutputStream的功能,支持对文件随机读取和写入 构造方法 public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模式 模式有4种,但是最常用的"rw",这种方法表示既可以写数据,也可以输出数据 package cn.idcast; import java.io.IOException; im

RandomAccessFile 文件读写中文乱码解决方案!

RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么   使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1 所以 输出显示是还要在进行一次转码 例子: package fileReadAndWrite; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /*

Java篇:RandomAccessFile

1 package ares.io; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.RandomAccessFile; 6 import java.util.Arrays; 7 8 //Java文件模型操作 9 public class RafSample { 10 11 public static void main(String[] args) throws IOException { 12 /

File操作-RandomAccessFile

一.知识点笔记 1. 文件操作——RandomAccessFile 1. 创建对象 Java提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读写是基于指针的操作. 1.1.2. 只读模式 RandomAccessFile在对文件进行随机访问操作时有两个模式,分别为只读模式(只读取文件数据),和读写模式(对文件数据进行读写). 只读模式: 在创建RandomAccessFile时,其提供的构造方法要求我们传入访问模式: RandomAcces

Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile

1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文件的读取和写入. RandomAccessFile的构造方法: 构造方法摘要 RandomAccessFile(File file, String mode)           创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定. RandomAccessFile(St

Java的RandomAccessFile对文件内容进行读写

 RandomAccessFile是Java提供的对文件内容的访问,她既可以读文件,也可以写文件,并且RandomAccessFile支持随机访问文件,也就是说他可以指定位置进行访问.   我们知道Java的文件模型,文件硬盘上的文件是byte byte byte的字节进行存储的,是数据的集合.下面就是用这个类的步骤. (1)打开指定的文件,有两种模式“rw”(读写) “r”(只读),创建对象,并且指定file和模式,例如:       RandomAccessFile ac=new Rando

随机访问文件RandomAccessFile 与 内存映射文件MappedByteBuffer

一.RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. RandomAccessFile不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系