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

[Java核心API]IO流--随机访问文件RandomAccessFile

2016-08-14 15:01 519 查看

1.随机访问文件基础知识

package day06file;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* java.io.RandomAccessFile 该类是基于指针形式读取文件数据的
*/
public class RandomAccesFileDemo {
public static void main(String[] args) throws IOException {
/**
* RandomAccessFile的两种创建模式 r:只读模式,仅对文件数据进行读取模式 rw:读写模式,可以对文件数据进行读写操作
* RandomAccessFile的第一参数可以传入字符串(文件路径),也可以传入file对象
*/
//      写入文件
RandomAccessFile raf = new RandomAccessFile("raf.dat", "rw");
// void write(int d)该方法向文件中写入1个字节,写的是当前int值对应的2进制的“低8位”
raf.write(1);
System.out.println("写入完毕");
raf.close();

//      读取文件数据
// int read()读取一个字节,并将该字节以十进制形式返回,若返回值为-1,则表示读取到文件末尾
RandomAccessFile r = new RandomAccessFile("raf.dat", "r");
int d = r.read();
System.out.println(d);
}
}
/*
* 运行结果: 写入完毕 1
*/


2.随机访问文件指针

package day06fileraf;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RAFPointer {
public static void main(String[] args) throws IOException {
/**RandomAccessFile提供了方便读写基本列型数据的相关方法*/
/**文件指针操作
* long getFilePointer()该方法可以获取当前raf的指针位置。
* 刚创建的raf指针默认在文件的第一个字节位置上,以下标形式表示位置,即:0
* raf总是基于指针当前位置进行读写字节,无论进行的是读还是写,进行后指针都会自动向后移动。*/
RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
long pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:0
/*向文件中写入一个int最大值
* 01111111 11111111 11111111 11111111
*                      vvvvvvvv void write(int a)写出的是二进制的“低8位”*/
int imax = Integer.MAX_VALUE;
raf.write(imax>>>24);//1字节,8byte
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:1

raf.write(imax>>>16);//1字节,8byte
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:2

raf.write(imax>>>8);//1字节,8byte
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:3

raf.write(imax);//1字节,8byte
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:4

/*void writeInt(int a)连续写出4个字节,将“int值对应的二进制”全部写出
* void wirte(int a)写出的是“二进制”*/
raf.writeInt(imax);//int 4字节
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:8
//写入long
raf.writeLong(1234556L);//long 8字节
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:16
//写入double
raf.writeDouble(123.123);//double 8字节
pos = raf.getFilePointer();
System.out.println("pos:"+pos);//pos:24
//最终查看raf.dat是24个字节

/*读取int值
* 若读取时发现是文件末尾,则抛出EOFException      End Of Exception文件末尾异常*/
int b = raf.read();
System.out.println(b);//-1

//      b  = raf.readInt();//EOFException End Of Exception文
bdd0
件末尾

/*void seek(long pos)
* 该方法可以将当前raf的指针移动到指定位置处*/
//将指针 移动到文件的第一个字节处
raf.seek(0);

/*
b = raf.read();
System.out.println(b);//127
b = raf.read();
System.out.println(b);//255
b = raf.read();
System.out.println(b);//255
b = raf.read();
System.out.println(b);//255
等价于如下
*/
b = raf.readInt();
System.out.println(b);//imax  int最大值
System.out.println("pos:"+raf.getFilePointer());//4
b = raf.readInt();
System.out.println(b);//imax
System.out.println("pos:"+raf.getFilePointer());//8

long l = raf.readLong();
System.out.println(l);//lmax long最大值
System.out.println("pos:"+raf.getFilePointer());//16

double d = raf.readDouble();
System.out.println(d);//dmax double最大值
System.out.println("pos:"+raf.getFilePointer());//24

//再读一次double
raf.seek(16);
d = raf.readDouble();
System.out.println(d);
System.out.println("pos:"+raf.getFilePointer());//24

System.out.println("写入完毕");
raf.close();
}
}


3.使用随机访问文件实现复制文件

package day06file;
import java.io.IOException;
import java.io.RandomAccessFile;
/** 使用RandomAccessFile实现复制文件
* */
public class RandomAccessFileCopy {
public static void main(String[] args) throws IOException {
//      按照字节的方式进行复制
RandomAccessFile src = new RandomAccessFile("raf.dat", "r");// 源文件
RandomAccessFile des = new RandomAccessFile("raf_1.dat", "rw");// 目标文件
int len = -1;
while ((len = src.read()) != -1) {// 按字节读取
des.write(len);// 按字节写入
}
System.out.println("按照单字节方式复制完毕");
src.close();
des.close();

//      按照字节数组的方式进行复制
RandomAccessFile src1 = new RandomAccessFile("raf.dat", "r");// 源文件
RandomAccessFile des1 = new RandomAccessFile("raf_2.dat", "rw");// 目标文件
int ln = -1;
byte[] buf = new byte[1024*10];
while((ln=src1.read(buf))!=-1){
des1.write(buf, 0, ln);
}
System.out.println("按照字节数组方式复制完毕");
src1.close();
des1.close();
}
}


4.简述RandomAccessFile类的read方法和write方法使用int类型存储byte数据的方式和原因

1)RandomAccessFile提供了一个可以从文件中读取字节的方法:
int read()
该方法会从文件中读取一个byte(8位) 填充到int的低八位, 高24位为0, 返回值范围正数: 0~255, 如果返回-1表示读取到了文件末尾! 每次读取后自动移动文件指针, 准备下次读取。
2)RandomAccessFile提供了一个可以向文件中写出字节的方法:
void write(int d)
该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出。
3)使用int类型存储byte数据,这是因为,RandomAccessFile类的read方法,能读到的数据有257个数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io流 api