前言:
此刻小伙伴们对“java实现随机抽题”大约比较关心,朋友们都需要学习一些“java实现随机抽题”的相关资讯。那么小编也在网摘上收集了一些对于“java实现随机抽题””的相关知识,希望你们能喜欢,同学们快快来学习一下吧!/**
* 测试随机访问流RandomAccessFile
* 对文件进行读写操作,不属于字节流/字符流,不同于字节/字符流的顺序读取,随机访问流可以通过指针对任意位置进行读写
*/
public class TestRandomAccessFile {
public static void main(String[] args) {
try(RandomAccessFile raf = new RandomAccessFile("iostream/testRandom.txt","rw")) {
//构造器传参(filename,mode)如果文件路径的某一级路径不存在会抛异常,如果上级路径存在但文件不存在会生成文件,文件存在时读取文件,不会覆盖成空文件。mode分为r只能读和rw可以读写两种权限
for (int i = 0;i<8;i++){
raf.writeInt((i+1)*10);
//随机访问流也可以存储基础数据类型,当不指定指针时默认从index=0开始,写入10-80八个int值
//随机访问流写入基础数据类型时使用自身的方法实现,没有通过数据流完成
}
//随机访问流没有flush()方法
raf.seek(4);
//.seek(long pos)调整指针,pos即position,pos每一位是一个字节byte
System.out.println(raf.readInt());
//结果为20,int类型需要占用4个字节,第一个int的10的pos从0-3,第二个int的20的pos从4-7,所以将指针移动到4进行.readInt()向后读取4个字节返回int的20
for (int i = 0;i<8;i+=2){
//隔一个数读一个数
raf.seek(i*4);
//i的值为0 4 8 12 16 20 24 28 对应每个int的第一个byte位,+=2时只为0 8 16 24
System.out.print(raf.readInt()+",");
//结果为10,30,50,70,
}
System.out.println();
raf.seek(8);
raf.writeInt(33);
//.write方法会从指针位置往后写入,如果有原始数据会覆盖,不会将数据后移
raf.seek(0);
for (int i = 0;i<8;i++){
System.out.print(raf.readInt()+",");
}
//结果为10,20,33,40,50,60,70,80, 30被覆盖为33
//System.out.print(raf.readInt()); 如果已经读完,再次调用.readInt()方法会抛java.io.EOFException
System.out.println(raf.read());
//在读完的情况下调用.read()会返回-1
System.out.println(raf.getFilePointer());
//.getFilePointer()返回指针当前位置,结果32
System.out.println(raf.length());
//.length()返回文件长度/大小/字节数,结果32
//文件内写入了8个int,每个int占4字节,所以文件大小为32字节,pos从0-31,执行了8次readInt()所以指针位置32到达文件末尾
raf.seek(8);
int insertInt = 30;
int temp;
long pos;
while ((pos = raf.getFilePointer()) < raf.length()){
temp = raf.readInt();
raf.seek(pos);
raf.writeInt(insertInt);
insertInt=temp;
}
raf.writeInt(insertInt);
raf.seek(0);
while (raf.getFilePointer()<raf.length()){
System.out.print(raf.readInt()+",");
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
标签: #java实现随机抽题