随机访问流RandomAccessFile
RandomAccessFile
特点: 既可以读也可以写,而且可以操作多种类型数据。
构造方法
构造方法 | 介绍 |
---|---|
RandomAccessFile(File file, String mode) | 创建从中读取和向其中写入(可选)的随机访问流,该文件由 file 参数指定 |
RandomAccessFile(String name, String mode) | 创建从中读取和向其中写入(可选)的随机访问流,该文件具有指定名称 |
其中:mode参数可从四个指定的值中选一个:
"r"
:表示以只读方式打开文件,所以只能读不能写,调用任何write
方法都将抛出异常IOException
。
"rw"
:可读可写的方式打开文件。如果该文件尚不存在,则尝试创建该文件。
"rws"
:打开以便读取和写入,对于"rw"
,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd"
:打开以便读取和写入,对于"rw"
,还要求对文件内容的每个更新都同步写入到底层存储设备。
常使用
"rw"
,特点: 既可以读也可以写,而且可以操作多种类型数据。
使用示范
1.只读属性的代码如下:
//运行方法,代码1和2注释一个运行另一个来测试结果
public static void main(String[] args) throws IOException{
//由于构造方法中使用的mode 属性值为"r" 所以只读不可写
//代码1
RandomAccessFile raf = new RandomAccessFile("D:\\Demo.java", "r");
int total = -1;
byte[] bs = new byte[500];
while((total = raf.read(bs))!=-1) {
System.out.print(new String(bs, 0, total));
}
raf.close();
//上面代码的读没有问题,可以自己试试看
//但是如果你写会报错 比如:
//代码2
raf.write(97);
raf.close();
}
2.可读可写属性的代码如下:
//先运行main1演示写,再运行main2演示读
public static void main1(String[] args) throws IOException{
//由于构造方法中使用的mode 属性值为"rw" 所以可读可写
RandomAccessFile raf = new RandomAccessFile("D:\\Demo.java", "rw");
raf.write(97); //'a'正常显示,后面会多出来乱码
raf.write("我是呵呵".getBytes()); //显示没问题 GBK格式
raf.writeBoolean(true); //乱码
raf.writeByte(97); //没问题
raf.writeChar(98); //'b'正常显示,但是前面有乱码
raf.writeBytes("你们好吗???"); //乱码
//按照UTF-8格式写字符串
raf.writeUTF("我是UTF-8文字吗?"); //没问题 UTF-8格式
raf.close();
}
public static void main2(String[] args) throws IOException{
//由于构造方法中使用的mode 属性值为"rw" 所以可读可写
RandomAccessFile raf = new RandomAccessFile("D:\\Demo.java", "rw");
//读一行:例子中读出来都是乱码 编码码格式不知道
System.out.println(raf.readLine());
//读字节数组
byte[] bs = new byte[100];
int total = raf.read(bs);
//用UTF-8读 所以只有UTF-8格式的能读到 GBK的读不到
//例子中:"我是呵呵"读不到,"我是UTF-8文字吗?"可以读到
System.out.println(new String(bs, 0, total, "UTF-8"));
raf.close();
}