首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java文件替换行

问Java文件替换行
EN

Stack Overflow用户
提问于 2014-01-15 09:22:55
回答 4查看 1.8K关注 0票数 6

我有一个250 GB的大.txt文件,我的硬盘上只剩下50 GB的空间。这个.txt文件中的每一行都有一个长前缀,我想删除这个前缀以使该文件更小。

首先,我想逐行读取,将其更改并写入另一个文件。

代码语言:javascript
复制
// read line out of first file
line = line.replace(prefix, "");
// write line into second file

问题是我没有足够的空间去做这件事。

那么,如何从我的文件中删除所有前缀呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-15 09:42:02

检查RandomAccessFile:http://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html

您必须跟踪您正在阅读的位置和您正在写作的位置。最初,两者都处于起步阶段。然后读取N个字节(一行),缩短它,寻找N个字节,并写入M字节(缩短行)。然后,您将寻找前向(N )字节,以回到下一行开始的位置。然后你一遍又一遍地做这件事。最后用setLength(long)截断多余的部分。

您也可以分批完成(比如读取4kb、进程、写入、重复),以提高效率。

这一过程在所有语言中都是相同的。有些则通过隐藏在API后面来回查找使其变得更容易。

当然,您必须确保您的程序完美无缺地工作,因为没有办法撤消这个过程。

此外,RandomAccessFile也有一定的局限性,因为它不能告诉您文件在给定时刻的位置。因此,您必须在“解码字符串”和“编码字节”之间进行转换。如果您的文件在UTF-8中,字符串中的给定字符可以占用文件中的一个或多个字节。因此,您不能只是寻求(string.length())。您必须使用查找(string.getBytes(编码).length)和可能的换行因子(Windows使用两个字符作为换行符,Unix只使用一个字符)。但是,如果您有ASCII,ISO-拉丁文-1或类似的琐碎字符编码,并且知道该文件的分行符是什么,那么问题应该非常简单。

当我编辑我的答案以匹配所有可能的角落情况时,我认为最好使用BufferedReader读取文件并纠正字符编码,并打开一个RandomAccessFile进行写入。如果您的操作系统支持打开文件两次。这样,您就可以从BufferedReader获得完整的Unicode支持,而yuou就不必跟踪读写位置。您必须使用RandomAccessFile编写,因为对文件使用Writer可能只会截断它(不过还没有试过)。

就像这样。它适用于琐碎的例子,但它没有错误检查,我绝对没有保证。先在一个较小的文件上测试它。

代码语言:javascript
复制
public static void main(String[] args) throws IOException {
    File f = new File(args[0]);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            new FileInputStream(f), "UTF-8")); // Use correct encoding here.
    RandomAccessFile writer = new RandomAccessFile(f, "rw");

    String line = null;
    long totalWritten = 0;
    while ((line = reader.readLine()) != null) {
        line = line.trim() + "\n"; // Remove your prefix here.

        byte[] b = line.getBytes("UTF-8");
        writer.write(b);
        totalWritten += b.length;
    }

    reader.close();

    writer.setLength(totalWritten);
    writer.close();
}
票数 9
EN

Stack Overflow用户

发布于 2014-01-15 09:42:04

您可以使用RandomAccessFile。它允许您覆盖文件的部分内容。而且,由于javadoc中没有提到的复制或缓存机制,这应该在不需要额外磁盘空间的情况下工作。

这样你就可以用空格覆盖不需要的部分了。

票数 0
EN

Stack Overflow用户

发布于 2021-12-13 12:40:13

将250 GB文件分成5个文件,每个文件50 GB。然后处理每个文件,然后删除它。这样,您将始终有50 GB在您的机器上,您也将能够处理250 GB的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21133391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档