随机访问流学习小demo

随机访问流

  • 随机访问流, 有两个构造函数
  • 其构造函数参数, 第一个是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

  • 图中乱码问题: 读取固定长度子节格式, 然后汉字是字符, 占用多个子节, 由于被多个组分别读取, 导致汉字乱码问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值