RandomAccessFile
- 该类是用来专门读写文件数据。其基于指针进行读写,即总是在指针当前位置读或写字节。
- 两种常用创建模式:
~ “r”:只读模式
~ “rw”:读写模式 - 构造方法:
~RandomAccessFile(File file, String mode):
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。
~RandomAccessFile(String name, String mode) :
创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
方法:
~close() :
关闭此随机访问文件流并释放与该流关联的所有系统资源。
~read():
从此文件中读取一个数据字节。
RandomAccessFile raf = new RandomAccessFile("./raf.dat","rw");
/*
* void write(int d)
* 写出一个字节,将给定的int值对应的二进制的"低八位"写入文件
* vvvvvvvv
* 00000000 00000000 00000000 00000001
*/
raf.write(-1);
raf.write(2);
raf.write(3);
raf.write(4);
System.out.println("执行完毕");
raf.close();
- write(int d);void
写出一个字节,将给定的int 值对应的2进制的“低八位”写入文件
RandomAccessFile raf = new RandomAccessFile("./raf.dat", "r");
/*
* int read()
* 读取一个字节,并以int形式返回
* 若返回值为-1,则表示读取到了文件末尾
*
*
* raf.write(-1);
* -1的二进制:
* 11111111 11111111 11111111 11111111
* 取低八位11111111
* 因为返回值是int,所以int的1111111是255
*/
int d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);//文件末尾
- Demo:复制文件
RandomAccessFile raf = new RandomAccessFile("./star3.jpg", "r");
RandomAccessFile desc = new RandomAccessFile("./star3_cp.jpg", "rw");
/*RandomAccessFile raf = new RandomAccessFile("./1.wav", "r");
RandomAccessFile desc = new RandomAccessFile("./1_cp.wav", "rw");*/
int d = -1;//记录每次读取的字节数据
long start = System.currentTimeMillis();
while( (d=raf.read())!=-1 ) {
desc.write(d);
}
long end = System.currentTimeMillis();
System.out.println(start-end);
System.out.println("copy success");
raf.close();
desc.close();
- int read(byte [] data);
一次性读取给定的字节数组长度的字节量,并存入到该数组中,返回实际读取到的字节量,若返回-1,则是文件末尾
- void write(byte[] data)
一次性将给定的字节数组中所有字节输出
- void write(byte[] data,int index,int len)
将给定的字节数组从下标index处开始的连续len个字节一次性输出
public static void main(String[] args) throws IOException {
/*
* int read(byte [] data);
* 一次性读取给定的字节数组长度的字节量,并存入到该数组中,返回实际读取到的字节量,若返回-1,则是文件末尾
*
*
* void write(byte[] data)
* 一次性将给定的字节数组中所有字节输出
*
* void write(byte[] data,int index,int len)
* 将给定的字节数组从下标index处开始的连续len个字节一次性输出
*
* 1byte = 8位2进制
* 1kb = 1024byte
* 1mb = 1024kb
* 1gb = 1024mb
* 1tb = 1024gb
*/
RandomAccessFile src = new RandomAccessFile("./h6.jpg", "rw");
RandomAccessFile desc = new RandomAccessFile("/h6_cp.jpg","rw");
byte [] buf = new byte[1024*10];
int len= 0;
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");
}
- byte[] getBytes(String csn);
将当前字符串按照指定字符集转换为一组字节,推荐使用这种方式转换字符串,因为按照系统默认字符集转换会导致跨平台出现乱码问题
package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 写出字符串操作
* @author liuyanyan
*
*/
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
/*
* 在相对路径中“./”可以不写,不写默认也是在当前目录中
*
*
* byte[] getBytes(String csn);
* 将当前字符串按照指定字符集转换为一组字节,推荐使用这种方式转换字符串,因为按照系统默认字符集转换会导致跨平台出现乱码问题
* GBK:国际编码,中文占两个字节
* UTF-8:无国码,对Unicode进行编码,边长编码集,英文一个字节,中文3个字节
* ISO8859-1:欧洲编码集,不支持中文
*/
RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
String str= "我先共耦合农女噢女偶扭矩处女男";
byte [] buf = str.getBytes("utf-8");
raf.write(buf);
raf.write("解耦翁军偶军和军军军军军军军".getBytes("utf-8"));
System.out.println("写出完毕");
raf.close();
}
}
package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 读取字符串
* @author liuyanyan
*
*/
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 str = new String(data,"utf-8");
System.out.println(str);
raf.close();
}
}
- void writeInt(int i);
按四个字节将int值写入该文件,先写高字节;
- void writeLong(long l);
按八个个字节将long值写入该文件,先写高字节;
- void writeDouble(Double d)
按八个字节将Double值写入该文件,先写高字节;
- void seek(long pos);
移动指针到指定位置
- int readInt();
package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 读写基本数据类型,以及RAF指针的操作,
*
* @author liuyanyan
*
*/
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"+raf.getFilePointer());
/*
* 01111111 11111111 11111111 11111111
*
* max>>>24
* 00000000 00000000 00000000 01111111
* max>>>16
* 00000000 00000000 01111111 11111111
* max>>>8
* 00000000 01111111 11111111 11111111
*
*/
//向文件中写入int 最大值
int max= Integer.MAX_VALUE;
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值写入
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());
System.out.println("写入完毕");
/*
* seek(long pos);void
* 移动指针到指定位置
*/
raf.seek(0);
// System.out.println("pos"+raf.getFilePointer());
//读取EOF end of file
/*
*
*/
int d = raf.readInt();
System.out.println("int:"+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
double bou = raf.readDouble();
System.out.println("double:"+bou);
System.out.println("pos"+raf.getFilePointer());
raf.seek(0);
l = raf.readLong();
System.out.println(l);
System.out.println("pos"+raf.getFilePointer());
raf.close();
}
}
- 简易记事本
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
/**
* 练习:
* 完成一个简易记事本工具
* 程序启动后,用户在控制台输入每一行字符串都写入到文件note.txt中,当用户输入"exit"时,程序退出
* @author liuyanyan
*
*/
public class NoteDemo {
public static void main(String[] args) throws IOException {
System.out.println("请输入字符串(输入exit退出程序)");
Scanner scn = new Scanner(System.in);
RandomAccessFile raf = new RandomAccessFile("node.txt","rw");
String str;
while(true) {
str = scn.nextLine();
if("exit".equals(str)) {
break;
}
byte [] buf = str.getBytes("utf-8");
raf.write(buf);
/*byte [] data = new byte[(int)raf.length()];
raf.read(data);
String str1 = new String(data,"utf-8");
System.out.println(str1);
raf.close();*/
}
}
}