1.java.io.RandomAccessFile:该类设计用来专门读写文件数据。其基于指针进行读写,即:总是在指针当前位置读或写字节。RAF有两种常用创建模式:"r":只读模式,"rw":读写模式。
public class RandomAccessFileDemo {
public static void main(String[] args) throws IOException {
/*
* RAF常用的构造方法:
* RandomAccessFile(String path,String mode)
* RandomAccessFile(File file,String mode)
* mode:操作模式,只读或读写
*/
RandomAccessFile raf
= new RandomAccessFile(
"./raf.dat","rw"
);
/*
* void write(int d)
* 写出一个字节,将给定的int值对应的2进
* 制的“低八位”写入文件
* vvvvvvvv
* 00000000 00000000 00000001 00000001
*
* 11111111 11111111 11111111 11111111
*/
raf.write(1);
System.out.println("写出完毕!");
raf.close();
}
}
2.读取一个字节。
public class ReadDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf
= new RandomAccessFile(
"./raf.dat","r"
);
/*
* int read()
* 读取1个字节,并以int形式返回。
* 若返回值为-1.则表示读取到了文件末尾。
* vvvvvvvv
* 00000000 00000000 00000000 00000001
*/
int d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
raf.close();
}
}
3.复制文件。
public class CopyDemo {
public static void main(String[] args) throws IOException {
/*
* 复制当前目录中的img.png
*/
RandomAccessFile src
= new RandomAccessFile(
"./music.mp3","r"
);
RandomAccessFile desc
= new RandomAccessFile(
"./music_cp.mp3","rw"
);
int d = -1;//记录每次读取的字节数据
long start = System.currentTimeMillis();
while((d = src.read())!=-1){
desc.write(d);
}
long end = System.currentTimeMillis();
System.out.println(
"复制完毕!耗时:"+(end-start)+"ms");
src.close();
desc.close();
}
}
4.提高每次读写的数据量,减少实际读写的次数,可以提高读写效率对于硬盘(磁盘)而言,随机读写效率差是缺点。但是硬盘的块读写效率还是可以保证的。随机读写:单字节读写。块读写:一组一组字节读写。
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
RandomAccessFile src
= new RandomAccessFile(
"./DG.exe","r"
);
RandomAccessFile desc
= new RandomAccessFile(
"./DG_CP1.exe","rw"
);
/*
* int read(byte[] data)
* 一次性读取给定的字节数组长度的字节量
* 并存入到该数组中,返回值为实际读取到
* 的字节量。若返回值为-1,则是文件末尾
*
* void write(byte[] data)
* 一次性将给定的字节数组中所有字节写出
*
* void write(byte[] data,int index,int len)
* 将给定的字节数组从下标index处开始的连续len
* 个字节一次性写出
*
* 1 byte = 8位2进制
* 1 kb = 1024 byte
* 1 mb = 1024 kb
* 1 gb = 1024 mb
* 1 tb = 1024 gb
*
*/
//10 kb
byte[] buf = new byte[1024*10];
int len = -1;//表示每次实际读取到的字节量
long start = System.currentTimeMillis();
while((len = src.read(buf))!=-1){
// desc.write(buf);
desc.write(buf,0,len);
}
long end = System.currentTimeMillis();
System.out.println("复制完毕!耗时:"+(end-start)+"ms");
src.close();
desc.close();
}
}
5.读写基本类型数据,以及RAF指针的操作。
public class RandomAccessFileDemo2 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf
= new RandomAccessFile(
"raf.dat","rw"
);
//获取指针位置
long pos = raf.getFilePointer();
System.out.println("pos:"+pos);
//向文件中写入int最大值
int max = Integer.MAX_VALUE;
/*
* vvvvvvvv
* 01111111 11111111 11111111 11111111
* max>>>24
* 00000000 00000000 00000000 01111111
*/
raf.write(max>>>24);
System.out.println("pos:"+raf.getFilePointer());
raf.write(max>>>16);
raf.write(max>>>8);
raf.write(max);
System.out.println("pos:"+raf.getFilePointer());
/*
* RAF提供了方便我们写出基本类型的相关方法
*
*/
//一次性将给定的int值4字节全部写出
raf.writeInt(max);
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)
* 移动指针到指定位置。
*/
raf.seek(0);
System.out.println("pos:"+raf.getFilePointer());
//读取 EOF end of file
int d = raf.readInt();
System.out.println(d);
System.out.println("pos:"+raf.getFilePointer());
//读取long
raf.seek(8);
long l = raf.readLong();
System.out.println("long:"+l);
System.out.println("pos:"+raf.getFilePointer());
double dou = raf.readDouble();
System.out.println("double:"+dou);
System.out.println("写出完毕!");
raf.close();
}
}
6.读取字符串。
public class ReadStringDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf
= new RandomAccessFile(
"raf.txt","r"
);
byte[] data = new byte[(int)raf.length()];
raf.read(data);
/*
* String提供了一组重载的构造方法
* 可以将给定的字节数组按照指定字符集还原为字符串
*/
String str = new String(data,"GBK");
System.out.println(str);
raf.close();
}
}
7.写出字符串操作。
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
/*
* 在相对路径中"./"可以不写,不写默认也是
* 在当前目录中
*/
RandomAccessFile raf
= new RandomAccessFile(
"raf.txt","rw"
);
/*
* String提供的方法:
* byte[] getBytes()
* 将当前字符串按照系统默认字符集转换为
* 一组字节。
*
* byte[] getBytes(String csn)
* 将当前字符串按照指定字符集转换为
* 一组字节。推荐使用这种方式转换字符串
* 因为按照系统默认字符集转换会导致跨平
* 台出现乱码问题
*
*
* GBK:国标编码,中文占2字节
* UTF-8:万国码,对unicode进行编码,变长编码集
* 英文1字节,中文3字节
* ISO8859-1:欧洲编码集,不支持中文。
*/
String str = "让我再看你一遍,从南到北。";
byte[] data = str.getBytes("GBK");
raf.write(data);
raf.write(
"像是北五环路,蒙住的双眼。".getBytes("GBK")
);
System.out.println("写出完毕!");
raf.close();
}
}
8.