阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第17章: IO操作深入:课时83:RandomAccessFile
程序员文章站
2022-07-04 19:19:10
...
对于文件内容的处理操作主要是通过InputStream(Reader)、OutputStream(Writer)来实现,但是利用这些类实现的内容读取只能够将数据部分部分读取进来,如果说现在有这样一种要求。
现在给了你一个非常庞大的文件,这个文件的内容的大小有20G,如果此时按照传统的IO操作进行读取和分析根本就不可能完成,所以这种情况下在Java.io包里面就有一个RandomAccessFile类,这个类可以实现文件的跳跃式的读取,可以只读中间的部分内容(前提:需要有一个完善的保存形式),数据的保存位数要都确定好。
RandomAccessFile类里面定义有如下的操作方法:
—构造方法:public RandomAccessFile(File file,String mode) throws FileNotFoundException;
——文件的处理模式:r、rw;
范例:实现文件的保存
package cn.mldn.demo;
import java.io.File;
import java.io.RandomAccessFile;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
File file = new File("d:" + File.pathSeparator + "mldn.txt"); // 定义操作文件
RandomAccessFile raf = new RandomAccessFile(file, "rw"); // 读写模式
String names [] = new String [] {"zhangsan","wangwu ","lisi "};
int ages [] = new int [] {30,20,16};
for (int x = 0; x < names.length; x++) {
raf.write(names[x].getBytes()); // 写入字符串
raf.writeInt(ages[x]);
}
raf.close();
}
}
RandomAccessFile最大的特点是在于数据的读取处理上,因为所有的数据是按照固定的长度进行的保存,所以读取的时候就可以进行跳字节读取:
向下跳:public int skipBytes(int n) throws IOException;
向回跳:public void seek(long pos) throws IOException。
范例:读取数据
package cn.mldn.demo;
import java.io.File;
import java.io.RandomAccessFile;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
File file = new File("d:" + File.pathSeparator + "mldn.txt"); // 定义操作文件
RandomAccessFile raf = new RandomAccessFile(file, "rw"); // 读写模式
{ // 读取“李四”的数据,跳过24位
raf.skipBytes(24);
byte [] data = new byte[8];
int len = raf.read(data);
System.out.println("姓名:" + new String(data,0,len).trim() + "、年龄:" + raf.readInt());
}
{ // 读取“王五”的数据,回跳12位
raf.seek(12);
byte [] data = new byte[8];
int len = raf.read(data);
System.out.println("姓名:" + new String(data,0,len).trim() + "、年龄:" + raf.readInt());
}
{ // 读取“张三”的数据,回跳头
raf.seek(0); // 回到顶点
byte [] data = new byte[8];
int len = raf.read(data);
System.out.println("姓名:" + new String(data,0,len).trim() + "、年龄:" + raf.readInt());
}
raf.close();
}
}
整体的使用之中由用户自行定义要读取的位置,而后按照指定的结构进行数据的读取。
推荐阅读
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时101:反射实例化对象
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第24章:反射与简单Java类:课时111:单级属性赋值
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第18章: 输入与输出支持:课时84:打印流
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时102:反射与工厂设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第16章:字节流与字符流:课时75:Writer字符输出流
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第17章: IO操作深入:课时83:RandomAccessFile
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第26章:反射与代理设计模式:课时118:动态代理设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第23章:反射与类操作:课时105:反射调用构造方法(含关系图-重要)
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第17章: IO操作深入:课时82:管道流
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第25章:ClassLoader类加载器:课时115:ClassLoader类加载器简介