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

RandomAccessFile相关(读写文件) --本文的正确性有待您验证。

2016-04-10 00:00 330 查看
摘要: 写出一个字节 void write(int d);读取一个字节int read();将字符串转换成对应的字节byte[] getBytes();将字节写入到文件中void write(byte[] data);读取给定字节数组长度的字节量int read(byte[] data);获取当前RandomAccessFile指针位置long getFilePointer();移动指针到指定位置void seek(long pos);以及复制文件等方法。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
* java.io.RandomAccessFile
* 该类是专门用于读写文件数据的类.
* 其提供了很多方便的方法来进行读写操作.
* 其读写是基于指针进行的,总是在指针当前位置读写.
*
* @author Romanceling
*
*/
public class RandomAccessFileTest{
public static void main(String[] args) throws IOException {
/*
* RandomAccessFile有两种创建模式:
* "r":只读模式,仅对文件数据做读取操作
* "rw":读写模式,可以对文件数据读写
*/
RandomAccessFile raf = new RandomAccessFile("test.dat","rw");
/*
* void write(int d)
* 一次写出一个字节,写出的是该int值对应的2进制中的"低八位"
* vvvvvvvv
* 00000000 00000000 00000000 00000001
* 00000000 00000000 00000001 00000000
*/
raf.write(1);

/*
* int read()
* 读取一个字节,并以int形式返回.
* 若返回的int值为-1.则表示读取到文件末尾.
*
* 00000000 00000000 00000000 00000001
*/
int d = raf.read();
System.out.println(d);

String str = "Romanceling";
/*
* byte[] getBytes()
* 以当前系统默认字符集将字符串转换成对应的字节
* windows:GBK linux:UTF-8
*/
//byte[] data = str.getBytes();
byte[] data = str.getBytes("utf-8");
/*
* void write(byte[] data)
* 一次性将给定的字节数组中所有字节写入到文件中
*/
raf.write(data);

/*
* int read(byte[] data)
* 一次性尝试读取给定字节数组长度的字节量,并且将读取的字节顺序的存入到这个数组中
* 返回值为实际读取到的字节量
*/
byte[] data = new byte[100];
int len = raf.read(data);
System.out.println("读取到了:"+len+"个字节");
//将字节数组指定部分按照指定字符集转换为字符串
String str = new String(data,0,len,"UTF-8");
System.out.println(str);

/*
* long getFilePointer()
* 获取当前RandomAccessFile指针位置
*/
long pos = raf.getFilePointer();
System.out.println("pos:"+pos);

int imax = Integer.MAX_VALUE;
/*
* vvvvvvvv
* 01111111 11111111 11111111 11111111
*/
raf.write(imax>>>24);
raf.write(imax>>>16);
raf.write(imax>>>8);
raf.write(imax);

System.out.println("pos:"+raf.getFilePointer());
/*
* 将给定的int值一次性写出
*/
raf.writeInt(imax);
System.out.println("pos:"+raf.getFilePointer());

raf.writeLong(123L);
System.out.println("pos:"+raf.getFilePointer());

raf.writeDouble(123.123);
System.out.println("pos:"+raf.getFilePointer());

/*
* void seek(long pos)
* 移动指针到指定位置
*/
//将指针移动到文件第一个字节处
System.out.println("移动指针到文件开始处");
raf.seek(0);
System.out.println("pos:"+raf.getFilePointer());

/*
* int readInt()
* 连续读取4个字节,并转换为int返回
* 如果在读取int值的过程中发现读取到了
* 文件末尾,则抛出EOFException即End Of File
*/
int i = raf.readInt();
System.out.println("i:"+i);
System.out.println("pos:"+raf.getFilePointer());

raf.seek(8);
long l = raf.readLong();
System.out.println("L:"+l);
System.out.println("pos:"+raf.getFilePointer());

double d = raf.readDouble();
System.out.println("d:"+d);
System.out.println("pos:"+raf.getFilePointer());
raf.close();

/**
* 复制文件
*
*/

RandomAccessFile src = new RandomAccessFile( "music.mp3","r" );
RandomAccessFile desc = new RandomAccessFile("muisc_copy.mp3","rw");
int d = -1;
while((d = src.read())!=-1){
desc.write(d);
}
System.out.println("复制完毕!");

/**
* 高效复制文件的方法
* 若想提高读写效率,需要提高读写数据量,来减少读写次数实现。
*/

int len = -1;
//10k缓冲
byte[] data = new byte[1024*10];
long start = System.currentTimeMillis();
while((len = src.read(data))!=-1){
/*
* void write(
* byte[]data,int offert,int len)
* 将当前数组中从offset处开始连续len个字节写出
*/
desc.write(data,0,len);
}
long end = System.currentTimeMillis();
System.out.println("复制完毕!耗时:"+(end-start)+"ms");

src.close();
desc.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java RandomAccessFile