您的位置:首页 > 编程语言 > Java开发

Java中的随机访问文件流RandomAccessFile

2013-08-06 14:16 302 查看
RandomAccessFile(随机访问文件流),也是一种文件的读写IO流,他实现了DataInputStream和DataOutputStream两个接口,因此他可以根据自己的方法实现对文件的读与写双重操作。

一:RandomAccessFile的特殊之处
RandomAccessFile提供了一种类似于文件指针的东西,他可以随着你对文件的读或者写操作来进行指针的移动,从而实现对文件的随机读取。具体的获取及相关操作就要用到接下来的几种常用方法了。
二:RandomAccessFile的常用方法
1:构造方法

RandomAccessFile 对象名称 = new RandomAccessFile(file,mode); 创建从中读取和向其中写入的随机访问文件流
◆file参数:进行具体操作所对应的文件
◆mode参数:指打开文件的具体访问模式,常用的有如下两种,其他可以参见帮助文档
“r”:以只读的方式打来文件(即对文件只能进行读操作)
"rw":以读和写的双重方式打开文件(即对文件可以进行读与写双重操作)

2:常用方法

(1)public long getFilePointer() throws IOException 获取当前文件指针相对于文件开头的偏移量
(2)public void seek(long pos) throws IOException 设置当前文件指针相对于文件开头的偏移量
(3)public long length() throws IOException 返回当前文件的长度
(4)基于各种类型的读操作,如readInt(),readChar()等

(5)基于各种类型的写操作,如writeInt(int v),writeChar(char ch)等

(6)public final String readLine() throws IOException 从文件中读一行操作
(7)public final String readUTF() throws IOException 从文件中读一个字符串,且该字符串已经用UTF8进行了编码
(8)public int skipBytes(int n) throws IOException 设置文件指针跳过的字节数,返回的为实际跳过的字节数,如果参数为负值,则不跳过任何字节
三:对方法整体运用的实例

public class Test {
public static void main(String[] args) throws Exception {
//创建操作的文件对象
File file = new File("d:"+File.separator+"a.txt");
//对指定的文件,以读写双重方式,创建随机文件访问流
RandomAccessFile raf = new RandomAccessFile(file,"rw");
//默认的文件指针指向文件开头位置
System.out.println("文件指针位置1:"+raf.getFilePointer());

String trs = "abcdef";
raf.write(trs.getBytes());//写入六个字符

//写入六个字符后,文件指针指向第七个位置6
System.out.println("文件指针位置2:"+raf.getFilePointer());

//1:绝对定位
raf.seek(0);//将光标强制的移动到文件的开始位置0

//2:相对定位
raf.skipBytes(5);//相对于当前位置跳过5个字节,如果为负值,不跳过任何字节

System.out.println("文件指针位置3:"+raf.getFilePointer());
//读操作进行之后,指针向后移
char i = (char)raf.read();

System.out.println("文件指针位置4:"+raf.getFilePointer());

System.out.println(i);
}
}
结果:

文件指针位置1:0
文件指针位置2:6
文件指针位置3:5
文件指针位置4:6
f
四:随机文件访问流对BMP格式图片的反色处理

小知识:BMP格式的图片相对而言比较简单,前54个字节保存文件头信息,从54位以后一个像素用三个字节表示RGB。

分析:一个Byte位表示可以一种颜色,如果原来颜色的RGB值为i,那么粉色处理位置颜色为255-i。对图片的反色处理,可以理解为从54位开始读,在读到文件末尾之前,读一个反色处理一个,但这时应注意文件指针的指向位置。何时到达文件末尾?当当前文件指针位置大于文件长度减1时,到达文件尾。

具体实现如下:

public class TestFanse {
public static void main(String[] args) throws Exception {
//创建图片文件
File file = new File("d:"+File.separator+"splash.bmp");
//创建随机文件访问流
RandomAccessFile raf = new RandomAccessFile(file,"rw");
//跳过前54位
raf.skipBytes(54);

while(true){
//从当前位置开始读,文件指针下移
int i = raf.read();
//让文件指针回退到刚才读取的文件处
raf.seek(raf.getFilePointer()-1);
//进行反色处理
raf.write(255-i);
//判断是否读到文件尾
if(raf.getFilePointer()>=file.length()-1){
break;
}
}
//输出当前文件指针的位置
System.out.println(raf.getFilePointer());
}
}
测试之前:在测试之前应该在D盘根目录下提供一个bmp格式的图片




测试之后:




从而达到了BMP格式图片的反色处理。

加油。。。。



本文出自 “辛德瑞拉” 博客,请务必保留此出处http://cinderella7.blog.51cto.com/7607653/1265189
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: