java中有没有 读取大文本文件(500MB以上),指定行数的某一行数据的类库? 有的话请给出教程,谢谢~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中有没有 读取大文本文件(500MB以上),指定行数的某一行数据的类库? 有的话请给出教程,谢谢~相关的知识,希望对你有一定的参考价值。

如题,能够解决问题的话追加10分。

解决这种问题,
简单说,设那个大文件为big.txt
写一个程序生成一个big.idx数据文件,记录big.txt每一行的结束位置+1,每个位置用long类型存储。
比如得到数据内容(非文本):
[10][22][34][84] ....[2345312].....[50000000]
扫描一遍,生成这500MB的长度文件,比如有10万行,这个big.idx文件就有800KB左右。
就根据big.idx可以查找指定行数了,比如查第1234行
已知一个long占8个字节,打开
第1234行的起始位置的存储位置p=(1234-2)*8=9856
第1234行的长度len的位置lp=(1234-1)*8=9864
寻道big.idx的p处,在p处读取一个long为pos
寻道big.idx的lp处,在p处读取一个long为npos
pos中就记录big.txt中第1234行的起始位置
该行长度len=npos-pos;
打开big.txt,查找pos位置,读len个字节,转换成字符串,
就读出了指定的1234行
把这个不大的big.idx的内容整理到内存中间,读取速度更快。

引经据典说,以上属于数据库基础的ISAM方法。
参考技术A 有啊,我写过,要的话找我追问

我只能用百度hi,已经加你了,3Q

追答

我刚升级百度空间了,已经没有HI功能了

Java - 读取 BZ2 文件并即时解压缩/解析

【中文标题】Java - 读取 BZ2 文件并即时解压缩/解析【英文标题】:Java - Read BZ2 file and uncompress/parse on the fly 【发布时间】:2011-06-17 14:38:05 【问题描述】:

我有一个相当大的 BZ2 文件,其中包含多个文本文件。我是否可以使用 Java 解压缩 BZ2 文件中的某些文件并即时解压缩/解析数据?假设一个 300mb 的 BZ2 文件包含 1GB 的文本。理想情况下,我希望我的 java 程序读取 1 mb 的 BZ2 文件,即时解压缩,执行操作并继续读取 BZ2 文件以获取更多数据。这可能吗?

谢谢

【问题讨论】:

请注意,bzip2/bz2 文件是压缩的单个文件。它们不是可以包含多个文件(或目录)的档案,例如 zip 或其他格式。 【参考方案1】:

来自 apache 的 commons-compress 库非常好。这是他们的示例页面: http://commons.apache.org/proper/commons-compress/examples.html

这是最新的 maven sn-p:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.10</version>
</dependency>

这是我的 util 方法:

public static BufferedReader getBufferedReaderForCompressedFile(String fileIn) throws FileNotFoundException, CompressorException 
    FileInputStream fin = new FileInputStream(fileIn);
    BufferedInputStream bis = new BufferedInputStream(fin);
    CompressorInputStream input = new CompressorStreamFactory().createCompressorInputStream(bis);
    BufferedReader br2 = new BufferedReader(new InputStreamReader(input));
    return br2;

【讨论】:

注意:可接受的格式有:gzip、bzip2、xz、lzma、Pack200、DEFLATE 和 Z。如链接所示,自动分配正确的格式【参考方案2】:

Ant 项目包含一个bzip2 库。其中有一个org.apache.tools.bzip2.CBZip2InputStream 类。您可以使用此类即时解压缩 bzip2 文件 - 它只是扩展了标准 Java InputStream 类。

【讨论】:

这个库无法识别我的 bzip2 格式。必须使用 commons-compress。【参考方案3】:

您可以使用来自 Apache commons-compress 的 org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream

InputStream inputStream = new BZip2CompressorInputStream(new FileInputStream(xmlBz2File), true) // true should be used for big files, as I understand

org.apache.commons.compress.utils.IOUtils:

    int pos = 0;
    int step = 1024 * 32;
    byte[] buffer = new byte[step];
    int actualLength = 1;
    while (actualLength > 0) 
        actualLength = IOUtils.readFully(inputStream, buffer, pos, step);
        pos += actualLength;
        String str = new String(buffer, 0, actualLength, StandardCharsets.UTF_8);
        // something what you want to do
    

但可能很难处理反向压力(消费者可能比生产者更快,反之亦然)。所以我尝试将 Akka Streams 与 BZip2CompressorInputStream 一起使用。

【讨论】:

以上是关于java中有没有 读取大文本文件(500MB以上),指定行数的某一行数据的类库? 有的话请给出教程,谢谢~的主要内容,如果未能解决你的问题,请参考以下文章

C# - 将大 (150MB) 文本文件读入富文本框

JAVA 大文件上传解决方案(500M以上)

Java - 读取 BZ2 文件并即时解压缩/解析

读取大文本文件VB6中的行数

如何在 Java 中处理大数据?

在java中读取csv文件并写入新文件