Java攻城狮的入门课程Java学习笔记程序员

(三)RandomAccessFile基本操作

2017-03-04  本文已影响297人  黒猫

1、了解RandomAccessFile

RandomAccessFile是Java提供的可以对文件内容进行访问的类,既可以对文件内容进行读取操作,也可以写入新的内容,并且RandomAccessFile支持随机访问文件,即访问文件内容的任意位置, 常应用于断点续传。


2、RandomAccessFile操作文件内容的基本流程

1. 了解Java的文件模式
Java在硬盘上的文件是以byte byte byte ……形式储存的,是数据的集合。

2. 访问要操作的文件
访问文件有两种可选模式:读写模式(“rw”)、只读模式(“r”);

RandomAccessFile raf = new RandomAccessFile(file,"rw");
//可指定访问模式

当为读写模式时,如果文件不存在会自动创建,但在只读模式下不会,必须要求文件事先存在。
同时还存在有文件指针这一概念,在访问文件时,指针在文件内容的起始位置,即 pointer = 0;
3. 写入操作

raf.write(int b);
//只写一个字节,即后8位,同时指针指向下一位置,准备再次写入

4. 读取操作

int b = raf.read();
//读一个字节

5. 及时关闭

文件读写完成后一定要关闭,否则可能会出现意想不到的错误。
                     ——来自Oracle官方说明


3、使用RandomAccessFile

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;


public class RafDemo {
public static void main(String[] args)throws IOException {
    
//创建目录
File demo = new File("demo");
if(!demo.exists()){
    demo.mkdir();
}

//创建文件
File file = new File(demo,"raf.dat");
if(!file.exists()){
    file.createNewFile();
}

//指定访问文件的方式
RandomAccessFile raf = new RandomAccessFile(file,"rw");
//查看打开文件时的指针位置
System.out.println(raf.getFilePointer());


//写入操作
/*
 * char类型是16位
 * 所以实际上'A'、'B'都各自只写了一个字节,即后8位
 */
raf.write('A');
raf.write('B');
//此时指针位置应指向2
System.out.println(raf.getFilePointer());

//Java内最大整数
int i = 0x7fffffff;
/*
 * int类型是32位,0x7fffffff转为二进制是
 * 01111111 11111111 11111111 11111111
 * 如果要使用write方法将i写入文件
 * 则需要写4次
 */
raf.write(i>>>24);
raf.write(i>>>16);
raf.write(i>>>8);
raf.write(i);
//此时指针位置应指向6
System.out.println(raf.getFilePointer());

/*
 * 当然RadomAccessFile提供了直接写入int的方法writeInt()
 * 上面分步骤写入的方法只是writeInt()在底层执行的操作
 */
raf.writeInt(i);

String s = "书";
byte[] gbk = s.getBytes("gbk");
raf.write(gbk);
/*
 * 查看当前文件长度
 * 中文占2个字节
 * 前面两次输入i占用8个字节
 * 开始的字符'A'、'B'都各自只写了一个字节
 * 因此长度为12
 */
System.out.println(raf.length());


//读取操作
/*
 * 执行前必须把文件指针移到头部
 * 一次性读取需要移动到起始位置,即0
 */
raf.seek(0);

/*
 * 一次性读取
 * 开辟一个字节数组,长度为raf.length(),返回值是long型
 * 把文件中的内容全部读取到该字节数组中
 */
byte[] buf = new byte[(int)raf.length()];
raf.read(buf);
System.out.println(Arrays.toString(buf));
//[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -54, -23]

 //转换成字符串输出
String s1 = new String(buf);
System.out.println(s1);
//AB�???�???书

//以十六进制输出
for (byte b : buf) {
    System.out.print(Integer.toHexString(b&0xff)+" ");
}
//41 42 7f ff ff ff 7f ff ff ff ca e9 


//及时关闭
raf.close();
    }

}

版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作!             ↓↓↓
上一篇下一篇

猜你喜欢

热点阅读