Java文件替换行

use*_*812 6 java

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

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

// read line out of first file
line = line.replace(prefix, "");
// write line into second file
Run Code Online (Sandbox Code Playgroud)

问题是我没有足够的空间.

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

Tor*_*ben 8

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

您必须跟踪您正在阅读的位置以及您要写入的位置.最初两者都在开始.然后你读N个字节(一行),缩短它,寻找N个字节并写M个字节(缩短的行).然后你寻找前向(N - M)字节,回到下一行开始的位置.然后你一遍又一遍地这样做.最后用setLength(long)截断多余.

您也可以批量执行(如读取4kb,处理,写入,重复)以提高效率.

该过程在所有语言中都是相同的.有些人通过在API后面隐藏搜索来更容易.

当然,你必须绝对确保你的程序完美无缺,因为没有办法撤消这个过程.

此外,RandomAccessFile有点受限,因为它无法告诉您文件在给定时刻的位置.因此,您必须在"解码字符串"和"编码字节"之间进行转换.如果您的文件是UTF-8,则字符串中的给定字符可以占用文件中的一个字节.所以你不能只做seek(string.length()).您必须使用seek(string.getBytes(encoding).length)并考虑可能的换行符转换(Windows使用两个字符进行换行,Unix只使用一个).但是如果你有ASCII,ISO-Latin-1或类似的普通字符编码,并且知道文件有哪些换行符,那么问题应该非常简单.

当我编辑我的答案以匹配所有可能的极端情况时,我认为最好使用BufferedReader读取文件并更正字符编码,并打开RandomAccessFile进行写入.如果您的操作系统支持将文件打开两次.这样您就可以从BufferedReader获得完整的Unicode支持,并且您不必跟踪读取和写入位置.您必须使用RandomAccessFile进行写入,因为对文件使用Writer可能只是截断它(尽管没有尝试过).

像这样的东西.它适用于琐碎的例子,但它没有错误检查,我绝对不保证.首先在较小的文件上测试它.

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();
}
Run Code Online (Sandbox Code Playgroud)