RandomAccessFile流总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RandomAccessFile流总结相关的知识,希望对你有一定的参考价值。

 

RandomAccessFile是  Java输入/输出流体系中功能最丰富的文件内容

访问类。

继承关系:java.lang.Object——>java.io.RandomAccessFile 

一总结点:

1既可以读取文件内容,也可以向文件输出数据

2与普通的输入/输出流不同的是,RandomAccessFile支持随机

访问,程序可以直接跳转到文件的任意地方来读写数据。这里

机访问的含义是可以自由访问文件的任意地方    (与 InputStream、

Reader等流需要依次向后读取或写出是不同的)。

3因为     RandomAccessFile可以自由访问文件的任意位置,所以

如果希望只访问文件部分内容,而不是把文件从头读到尾,此时,使

用 RandomAccessFile是很好的选择。

4当    RandomAccessFile用做输出流时,由于      RandomAccessFile

允许自由定位文件记录指针,所以  RandomAccessFile可以不从开始

地方开始输出,即  RandomAccessFile可以向已存在的文件后面追加

内容。如果程序需要向已存在的文件追加内容时,则应该使用

RandomAccessFile。

二  RandomAccessFile的构造方法

1    RandomAccessFile(File file, String  mode)

2    RandomAccessFile(String name, String mode)

  

 

 

三常用的方法

1 RandomAccessFile提供两个方法来操作文件记录指针

* long getFilePointer():返回文件记录指针的当前位置

* void seek(long pos) :将文件记录指针定位到   pos位置

2读/写方法可以查看   API文档。

四例子

例子  1

/*

本程序的功能:

使用 RandomAccessFile流读取该流关联到文件的部分数据,而不是读

取整个文件

*/

import java.io.*;

public class RandomAccessFileTest

{

public static void main(String [] args)

{

RandomAccessFile raf = null;

try

{

//以只读方式创建一个任意访问文件流 RandomAccessFile,关联到硬盘

上某个文件

raf

=

new

RandomAccessFile("D:\\\\FengKuang_Java_LiGang\\\\15\\\\15-7\\\\RandomAccessFileTest.java","

r");

//获取 RandomAccessFile对象的文件指针的位置,初始位置是   0

System.out.println("RandomAccessFile的文件指针的位置是:           "  +

raf.getFilePointer());

//移动 raf的文件记录指针的位置

raf.seek(700);

byte[] buff = new byte[1024];

  

 

 

//用于保存实际读取的字节数

int hasread = 0;

while ((hasread = raf.read(buff)) > 0)

{

//把字节数组中的数据转换成字符串,并输出

System.out.println(new String(buff,0,hasread));

}

}

catch (IOException ex)

{

ex.printStackTrace();

}

finally

{

try

{

if (null != raf)

{

raf.close();

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

}

===============================================================

例子  2

/*

本程序的功能:

使用 RandomAccessFile流向关联到的文件中追加内容

为了追加内容,程序应该先将该流的文件记录指针移到文件的最

后,然后再开始向文件中输出内容

*/

import java.io.*;

public class AppendContent

{

  

 

 

public static void main(String [] args)

{

RandomAccessFile raf = null;

try

{

//以读、写方式打开一个  RandomAccessFile流对象,关联到硬盘

上的文件

raf

=

new

RandomAccessFile("D:\\\\FengKuang_Java_LiGang\\\\15\\\\15-7\\\\使用    RandomAccessFile

向文件中追加内容","rw");

//raf.length()语句:以字节为单位测量该流所关联到的文件的长度,

并返回该长度

//raf.seek()设置该流的文件记录指针的位置,在进行下一次读、写

操作时,将从该位置开始

//此处将文件记录指针移到该流关联到的文件的最后

raf.seek(raf.length());

raf.write("追加的内容!  \\r\\n".getBytes());

}

catch (IOException e)

{

e.printStackTrace();

}

finally

{

try

{

if (raf != null)

{

raf.close();

}

}

catch (IOException ex)

{

ex.printStackTrace();

}

}

}

}

============================================================

  

 

 

例子  3

/*

本程序的功能:

使用 RandomAccessFile流实现向指定文件、指定位置插入内容的功能

实现步骤:

1先将文件中插入点后面的内容读入临时文件中

2把文件记录指针重新定位到插入点

3将需要插入的内容从插入点位置开始写入文件中

4将临时文件中的内容追加到文件的后面,即追加到插入内容的

后面

*/

import java.io.*;

public class InsertContent

{

public  static void  insert(String  filename,long pos,String  inserContent)  throws

Exception

{

RandomAccessFile raf = null;

//创建一个临时文件来保存插入点后的数据

File tmp = File.createTempFile("tmp",null);

FileInputStream tmpIn = null;

FileOutputStream tmpOut = null;

tmp.deleteOnExit();

try

{

//以读、写方式打开 RandomAccessFile流

raf = new RandomAccessFile(filename,"rw");

//创建关联到临时文件的输入输出文件流

tmpOut = new FileOutputStream(tmp);

tmpIn = new FileInputStream(tmp);

//将该流的文件记录指针定位到插入点

raf.seek(pos);

//--------下面代码将插入点后的内容读入临时文件中保存---------

byte [] buff = new byte[1024];

int hasread = 0;

//使用循环方式读取插入点后面的数据

while ((hasread = raf.read(buff)) > 0)

{

//把插入点后面的数据写入到临时文件中

  

 

 

tmpOut.write(buff,0,hasread);

}

//----------下面代码插入内容----------

//把该流的文件记录指针重新定位到 pos位置

raf.seek(pos);

//追加需要插入的内容

raf.write(inserContent.getBytes());

//----------下面代码把原来文件中插入点后面的数据追加到末尾

----------

while ((hasread = tmpIn.read(buff)) > 0)

{

raf.write(buff,0,hasread);

}

}

finally

{

if( null != raf)

{

try

{

raf.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

}

}

public static void main(String [] args) throws Exception

{

insert("源文件.txt",45,"插入的内容\\r\\n");

}

}

============================================================

  

 

 

例子  4

/*

本程序功能:

使用 RandomAccessFile流和  BufferedReader完成从键盘输入

数据

并把数据写入到硬盘的文件上,且不会覆盖文件上原来的数

据,同时记录键盘输入的时间

最后把文件上的内容输出到显示器上

*/

import java.io.*;

import java.util.*;

public class RandomAccessFile2Test

{

//修饰为 static是因为在  static main()方法中要使用

static BufferedReader    br = null;

static RandomAccessFile raf = null;

static BufferedReader br2 = null;

public static void main(String [] args)     throws Exception    //本程序暂时不处

理异常

{

/*

*/

步骤 1:先使用转换流  InputStreamReader从键盘获得输入的字符

String str;

//从键盘读入数据

//System.in代表键盘输入,执行该语句将获得一个   InputStream对象

//构造器 InputStreamReader(InputStream in)可知,InputStreamReader依

附于  InputStream

//执行 new InputStreamReader(System.in)之后,将获得一个关联到键盘

的转换流,但是该流没有缓冲区,每读取一个键盘数据就要启动转换器进行转换,

效率不高。

//为提高转换效率,在   InputStreamReader外面套一个    BufferedReader

缓冲流,每次读取的键盘数据都放在缓冲区,然后再一次性全部转换。

//这样理解对吗??

br = new BufferedReader(new InputStreamReader(System.in));

//str = br.readLine()读取从键盘上输入的数据

while (null != (str = br.readLine()))//一直从键盘上读取输入的数据,直

到输入 exit,结束循环

  

 

 

{

if(str.equalsIgnoreCase("exit"))//判断输入的内容是否等于  exit

break;

/*

步骤 2:使用  RandomAccessFile流把从键盘上输入的数据写

到硬盘某个文件上

用 RandomAccessFile流把数据追加到文件上,使得

文件上原来的数据不被覆盖

*/

//以读、写方式打开一个  RandomAccessFile流对象,关联到硬盘

上的文件

raf

=

new

RandomAccessFile("D:\\\\FengKuang_Java_LiGang\\\\15\\\\15-7\\\\每次从键盘上输入的内

容","rw");

//此处将文件记录指针移到该流关联到的文件的最后

raf.seek(raf.length());

//创建一个 Calendar对象

Calendar c = Calendar.getInstance();

//c.getTime()获得表示当前时间的 Date对象

//toString()返回当前时间的字符串表示

//获得当前的时间

String strTime = c.getTime().toString();

//把当前的时间写入文件中,即记录从键盘上输入数据的时间

raf.write(strTime.getBytes());

raf.write(": ".getBytes());

//把从键盘输入的数据追加到文件末尾

raf.write(str.getBytes());

//写入换行符

raf.write("\\r\\n".getBytes());

/*

步骤 3:使用   BufferedReader读取硬盘上的文件,并把该文

件的内容输出

*/

//创建 BufferedReader缓冲流,关联到硬盘上的文件

  

 

 

br2

=

new

BufferedReader(new

FileReader("D:\\\\FengKuang_Java_LiGang\\\\15\\\\15-7\\\\每次从键盘上输入的内容"));

String str2;

System.out.println("------文件中内容如下---------");

//使用循环方式读取文件内容

while (null != (str2 = br2.readLine()))

{

System.out.println(str2);

}

System.out.println("------文件中内容如上---------");

}

br.close();

raf.close();

br2.close();

}

}

  2016-03-29

以上是关于RandomAccessFile流总结的主要内容,如果未能解决你的问题,请参考以下文章

Java学习总结—内存流,打印流,对象流,RandomAccessFile,装饰者设计模式

第十周课程总结

第十周课程总结

java IO流 RandomAccessFile的使用

[javaSE] IO流(RandomAccessFile)

IO流 RandomAccessFile