随机访问流
- 随机访问流, 有两个构造函数
- 其构造函数参数, 第一个是file对象或者String对象, 第二个参数则是model, 比如 “r”, “rw” 等
- 该流作用: 可用于多线程通过固定偏移量, 进行读写大文件, 提升性能.
示例代码
package com.iotest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 注:
* 1. 代码背景
* 1: 给一个文件, 然后通过RandomAccessFile流, 分段读取.
* 2. 难点: 需要处理好 每组开始偏移量, 每组标准记录数, 每组实际记录数, 文件大小, 以及节点流读取长度 之间的关系.
*/
public class RandomAccessIOTest {
/**
* {@link java.io.RandomAccessFile} 分段读取数据
* 思路:
* 1. 将文件大小分组, 每组100个长度单位.
* 2. 使用随机访问流进行读取.
* @param startIndex: 开始读取个数
* @param bzSize: 每组标准读取数量
* @param groupSize 组个数
* @param actualSize 实际个数
*/
public static void main(String[] args) throws IOException {
File tgFile = new File("./src/main/java/com/iotest/RandomAccessIOTest.java");
long len = tgFile.length();
long startIndex = 0; // 开始读取个数
int bzSize = 200; // 每组标准读取数量
int groupSize = (int) Math.ceil(len * 1.0 / bzSize); // 组个数
long actualSize = bzSize > len ? (int) len : bzSize; // 实际个数
for (int i = 0; i < groupSize; i++) {
startIndex = i*bzSize;
if (i == groupSize-1) {
actualSize = (int) len;
}else {
len -= actualSize;
}
System.out.println("i: " + i +" ;startIndex: " + startIndex + " ;actualSize: " + actualSize);
test(tgFile, startIndex, actualSize);
}
}
public static void test(File file, long startIndex, long actualSize) throws IOException {
RandomAccessFile rdf = new RandomAccessFile(file, "r");
int len = 0;
byte[] bytearr = new byte[1024];
rdf.seek(startIndex);
while ((len = rdf.read(bytearr)) != -1) {
if (actualSize > len) {
actualSize -= len;
System.out.println(new String(bytearr, 0, len));
} else {
System.out.println(new String(bytearr, 0, (int)actualSize));
break;
}
}
rdf.close();
System.out.println("-------------------------------------------");
}
}
打印信息如下
D:\Java\java_tool\JDK\jdk1.8\bin\java.exe "-javaagent:D:\person\install\IntelliJ IDEA 2018.2.5\lib\idea_rt.jar=4636:D:\person\install\IntelliJ IDEA 2018.2.5\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\java_tool\JDK\jdk1.8\jre\lib\charsets.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\deploy.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\cldrdata.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\dnsns.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\jaccess.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\jfxrt.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\localedata.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\nashorn.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\servlet-api.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\sunec.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\ext\zipfs.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\javaws.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\jce.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\jfr.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\jfxswt.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\jsse.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\management-agent.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\plugin.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\resources.jar;D:\Java\java_tool\JDK\jdk1.8\jre\lib\rt.jar;D:\new~dir\project-student\study\springboot\spring-boot-thread\target\classes;D:\Java\maven353\repos\org\springframework\boot\spring-boot-starter-web\2.1.2.RELEASE\spring-boot-starter-web-2.1.2.RELEASE.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot-starter\2.1.2.RELEASE\spring-boot-starter-2.1.2.RELEASE.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot-starter-logging\2.1.2.RELEASE\spring-boot-starter-logging-2.1.2.RELEASE.jar;D:\Java\maven353\repos\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\Java\maven353\repos\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\Java\maven353\repos\org\apache\logging\log4j\log4j-to-slf4j\2.11.1\log4j-to-slf4j-2.11.1.jar;D:\Java\maven353\repos\org\apache\logging\log4j\log4j-api\2.11.1\log4j-api-2.11.1.jar;D:\Java\maven353\repos\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\Java\maven353\repos\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\Java\maven353\repos\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot-starter-json\2.1.2.RELEASE\spring-boot-starter-json-2.1.2.RELEASE.jar;D:\Java\maven353\repos\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;D:\Java\maven353\repos\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\Java\maven353\repos\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;D:\Java\maven353\repos\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.8\jackson-datatype-jdk8-2.9.8.jar;D:\Java\maven353\repos\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.8\jackson-datatype-jsr310-2.9.8.jar;D:\Java\maven353\repos\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.8\jackson-module-parameter-names-2.9.8.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot-starter-tomcat\2.1.2.RELEASE\spring-boot-starter-tomcat-2.1.2.RELEASE.jar;D:\Java\maven353\repos\org\apache\tomcat\embed\tomcat-embed-core\9.0.14\tomcat-embed-core-9.0.14.jar;D:\Java\maven353\repos\org\apache\tomcat\embed\tomcat-embed-el\9.0.14\tomcat-embed-el-9.0.14.jar;D:\Java\maven353\repos\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.14\tomcat-embed-websocket-9.0.14.jar;D:\Java\maven353\repos\org\hibernate\validator\hibernate-validator\6.0.14.Final\hibernate-validator-6.0.14.Final.jar;D:\Java\maven353\repos\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\Java\maven353\repos\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;D:\Java\maven353\repos\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;D:\Java\maven353\repos\org\springframework\spring-web\5.1.4.RELEASE\spring-web-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\spring-beans\5.1.4.RELEASE\spring-beans-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\spring-webmvc\5.1.4.RELEASE\spring-webmvc-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\spring-aop\5.1.4.RELEASE\spring-aop-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\spring-context\5.1.4.RELEASE\spring-context-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\spring-expression\5.1.4.RELEASE\spring-expression-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot-devtools\2.1.2.RELEASE\spring-boot-devtools-2.1.2.RELEASE.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot\2.1.2.RELEASE\spring-boot-2.1.2.RELEASE.jar;D:\Java\maven353\repos\org\springframework\boot\spring-boot-autoconfigure\2.1.2.RELEASE\spring-boot-autoconfigure-2.1.2.RELEASE.jar;D:\Java\maven353\repos\org\projectlombok\lombok\1.18.4\lombok-1.18.4.jar;D:\Java\maven353\repos\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\Java\maven353\repos\org\springframework\spring-core\5.1.4.RELEASE\spring-core-5.1.4.RELEASE.jar;D:\Java\maven353\repos\org\springframework\spring-jcl\5.1.4.RELEASE\spring-jcl-5.1.4.RELEASE.jar com.iotest.RandomAccessIOTest
i: 0 ;startIndex: 0 ;actualSize: 200
package com.iotest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessIOTest {
/**
-------------------------------------------
i: 1 ;startIndex: 200 ;actualSize: 200
* {@link java.io.RandomAccessFile} 分段读取数据
* 思路:
* 1. 将文件大小分组, 每组100个长度单位.
* 2. 使用随机访问流进行读取.
* @param start
-------------------------------------------
i: 2 ;startIndex: 400 ;actualSize: 200
Index: 开始读取个数
* @param bzSize: 每组标准读取数量
* @param groupSize 组个数
* @param actualSize 实际个数
*/
public static void main(String[] args)
-------------------------------------------
i: 3 ;startIndex: 600 ;actualSize: 200
throws IOException {
File tgFile = new File("./src/main/java/com/iotest/RandomAccessIOTest.java");
long len = tgFile.length();
long startIndex = 0; // 开始读取个数
-------------------------------------------
i: 4 ;startIndex: 800 ;actualSize: 200
int bzSize = 200; // 每组标准读取数量
int groupSize = (int) Math.ceil(len * 1.0 / bzSize); // 组个数
long actualSize = bzSize > len ? (int) len : bzSize; // 实际�
-------------------------------------------
i: 5 ;startIndex: 1000 ;actualSize: 200
��数
for (int i = 0; i < groupSize; i++) {
startIndex = i*bzSize;
if (i == groupSize-1) {
actualSize = (int) len;
}else {
-------------------------------------------
i: 6 ;startIndex: 1200 ;actualSize: 200
len -= actualSize;
}
System.out.println("i: " + i +" ;startIndex: " + startIndex + " ;actualSize: " + actualSize);
test(tgFile, startIndex, actualSize);
-------------------------------------------
i: 7 ;startIndex: 1400 ;actualSize: 200
}
}
public static void test(File file, long startIndex, long actualSize) throws IOException {
RandomAccessFile rdf = new RandomAccessFile(file, "r");
int len = 0;
-------------------------------------------
i: 8 ;startIndex: 1600 ;actualSize: 200
byte[] bytearr = new byte[1024];
rdf.seek(startIndex);
while ((len = rdf.read(bytearr)) != -1) {
if (actualSize > len) {
actualSize -= len;
-------------------------------------------
i: 9 ;startIndex: 1800 ;actualSize: 200
System.out.println(new String(bytearr, 0, len));
} else {
System.out.println(new String(bytearr, 0, (int)actualSize));
break;
}
-------------------------------------------
i: 10 ;startIndex: 2000 ;actualSize: 121
}
rdf.close();
System.out.println("-------------------------------------------");
}
}
-------------------------------------------
Process finished with exit code 0