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,装饰者设计模式