网站首页 > 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字节码 - ByteBuddy原理与使用
- 下一篇: 拒绝接口裸奔!开放API接口签名验证
猜你喜欢
- 2024-12-01 Java 加密解密和数字签名
- 2024-12-01 java小白学习-模拟拼手气红包
- 2024-12-01 Java试题分享
- 2024-12-01 使用java随机生成有个性的用户名,LOL地名+水浒传,合计2808个
- 2024-12-01 拒绝接口裸奔!开放API接口签名验证
- 2024-12-01 Java字节码 - ByteBuddy原理与使用
- 2024-12-01 JAVA语言基础的经典案例:猜字母游戏
- 2024-12-01 如何用Java实现验证码?
- 2024-12-01 Java菜谱(一):常见字符串问题处理方案
- 2024-12-01 java 生成4位短信验证码方法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)