参考文档:
https://www.cnblogs.com/guweiwei/p/6526268.html
参考文档:
http://blog.sina.com.cn/s/blog_14ffae8a60102x2zf.html
RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。
RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。
基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。
只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。
RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)"给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了。
现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追加了,结果XXX君傻了,他内存只有4G,如果强制读取所有的数据并追加,会报内存溢出的异常。
其实上面的需求很简单,如果我们使用JAVA IO体系中的RandomAccessFile类来完成的话,可以实现零内存追加。其实这就是支持任意位置读写类的强大之处。
RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。
如果我们只希望访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的代码以及更好的性能。
下面来看下RandomAccessFile类中比较重要的2个方法,其他的和普通IO类似,在这里,就不详细说明了。
方法名 作用
getFilePointer() 返回文件记录指针的当前位置
seek(long pos) 将文件记录指针定位到pos的位置
1.功能one,读取任意位置的数据
2.功能two,追加数据
3.功能three,任意位置插入数据
public class Random {
public static void main(String[] args) {
String path="randomtest.txt";
int seekPointer=20;
randomRed(path,seekPointer);
randomWrite(path);
public static void randomRed(String path,int pointe){
try{
RandomAccessFile raf=new RandomAccessFile(path, "r");
System.out.println("RandomAccessFile文件指针的初始位置:"+raf.getFilePointer());
raf.seek(pointe);
byte[] buff=new byte[1024];
int hasRead=0;
while((hasRead=raf.read(buff))>0){
System.out.println(new String(buff,0,hasRead));
}catch(Exception e){
e.printStackTrace();
public static void randomWrite(String path){
try{
RandomAccessFile raf=new RandomAccessFile(path, "rw");
raf.seek(raf.length());
raf.write("我是追加的 \r\n".getBytes());
}catch(Exception e){
e.printStackTrace();
* 实现向指定位置
* 插入数据
* @param fileName 文件名
* @param points 指针位置
* @param insertContent 插入内容
* **/
public static void insert(String fileName,long points,String insertContent){
try{
File tmp=File.createTempFile("tmp", null);
tmp.deleteOnExit();
RandomAccessFile raf=new RandomAccessFile(fileName, "rw");
FileOutputStream tmpOut=new FileOutputStream(tmp);
FileInputStream tmpIn=new FileInputStream(tmp);
raf.seek(points);
byte [] buff=new byte[1024];
int hasRead=0;
while((hasRead=raf.read(buff))>0){
tmpOut.write(buff, 0, hasRead);
raf.seek(points);
raf.write(insertContent.getBytes());
while((hasRead=tmpIn.read(buff))>0){
raf.write(buff,0,hasRead);
}catch(Exception e){
e.printStackTrace();
区别:
1、FileOutputStream没有xxx.writeInt(int n)方法
想写一个完整的int型数据n只能:
xxx.write(n>>>24);
xxx.write(n>>>16);
xxx.write(n>>>8);
xxx.write(n);
2、执行程序,用FileOutputStream对a1文件写入11—a1中是11
再次执行程序写入5,实际上是先把a1清空然后写入5—a1中是5
构造方法:FileOutputStream fop=new FileOutputStream(“sss”);
3、若想追加的写入字节,可用FlieOutputStream的重载方法
构造方法:
FileOutputStream fop=new FileOutputStream(“sss”,true);
执行程序,用FileOutputStream对a1文件写入11—a1中是11
再次执行程序写入5—a1中是115
4、对比RandomAccessFile
执行程序,用RandomAccessFile对b1文件写入3个字节信息[1,2,3]
关闭IO口,再次执行程序,对b1文件写一个字节:45
打开b1文件,发现该文件包含的是:[45,2,3]
参考文档:https://www.cnblogs.com/guweiwei/p/6526268.html参考文档:http://blog.sina.com.cn/s/blog_14ffae8a60102x2zf.htmlRandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。...
RandomAccessFile
RandomAccessFile允许你来回读写文件,也可以替换文件中的某些部分。FileInputStream和FileOutputStream没有这样的功能。
在使用RandomAccessFile之前,必须初始化它。
RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
请注意构造函数的第二个参数:“rw”,表明你以读写方式打开文件。
1.1 在RandomAcc
标准输入输出流
Java中的标准输入 / 输出分别通过System.in和System.out实现,默认情况下是键盘和显示器
PrintStream类:PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
PrintWriter类:向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream中的所有 print方法。它不包含用于写入原...
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
字节流(InputStream&OutputStream) & 字符类 & RandomAccessFile & 对象序列化 & 线程创建与启动 & 守护线程 线程中断
目录:字节流(InputStream&OutputStream)&字符类&RandomAccessFile&对象序列化& 线程创建与启动&守护线程 线程中断
字节流(InputStream&OutputStream)
InputStrea
1.RandomAccessFile特点
RandomAccessFile是java Io体系中功能最丰富的文件内容访问类。即可以读取文件内容,也可以向文件中写入内容。但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。
因为RandomAccessFile可以自由访问文件的任意位置,所以如果我们希望只访问文件的部分内容,那就可以使用RandomAccessFile类。
与OutputStearm,Writer等输出流不同的是,RandomAccessFile类允许自由定位文件
private String fileDir= this.getFilesDir().getAbsolutePath() + “/fileurl/”;
/** 创建文件夹 文件 **/
public static File createFile(String filePath, String fileName) throws IOException {
/** 生成文件夹之后,再生成文件,不然会出错 **/
`RandomAccessFile`类是 Java IO 包中的类,它提供了对文件进行随机读写的功能。该类具有 read() 和 write() 方法,可以在文件的任意位置读写数据。它同时也实现了`DataInput`和`DataOutput`接口,所以也提供了读写基本数据类型的方法。
使用方法:
- 首先需要使用构造函数`RandomAccessFile(String name, String mode)`创建RandomAccessFile对象
- 其中第一个参数是文件的名称,第二个参数是文件的访问模式,有"r"和"rw"两种
- 模式“r”表示文件只用于读取
- 模式“rw”表示文件既用于读取也用于写入
一个例子:
import java.io.IOException;
import java.io.RandomAccessFile;
public class Main {
public static void main(String[] args) {
try {
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.writeChars("Hello world!");
raf.close();
} catch (IOException e) {
e.printStackTrace();
注意:使用完RandomAccessFile后需要调用 close() 方法关闭文件,释放系统资源。