Java如何复制文件的一部分

时间:2014-08-06 19:47:58

标签: java file-io

我必须阅读一个文件,根据最后几行的内容,我必须将其大部分内容复制到一个新文件中。不幸的是,我没有找到一种方法来复制java中文件的前n行或字符 我找到的唯一方法是使用nio FileChannels复制文件,我可以在其中指定长度(以字节为单位)。但是,因此我需要知道我在源文件中读取的内容需要多少字节。

是否有人知道其中一个问题的解决方案?

2 个答案:

答案 0 :(得分:1)

您应该使用BufferedReader并读取N行,您将写入fileX。然后重做此过程,直到您将文件拆分为多个文件。

这是一个基本的例子:

BufferedReader bw = null;
try (BufferedReader br = new BufferedReader(new FileReader(new File("<path_to_input_file>")))) {
    String line = "";
    StringBuilder sb = new StringBuilder();
    int count = 0;
    bw = new BufferedWriter(new FileWriter(new File("<path_to_output_file>")));
    while ( (line = br.readLine()) != null) {
        sb.append(line)
           .append(System.getProperty("line.separator"));
        if (count++ == 1000) {
            //flush and close current content into the current new file
            bw.write(sb.toString());
            bw.flush();
            bw.close();
            //start a new file
            bw = new BufferedWriter(new FileWriter(new File("<path_to_new_output_file>")));
            //re initialize the counter
            count = 0;
            //re initialize the String content
            sb = new StringBuilder();
        }
    }
    if (bw != null && sb.length() > 0) {
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }
} catch (Exception e) {
    e.printStacktrace(System.out);
}

由于您将性能作为关键质量属性,因此请使用BufferedReader而不是Scanner。以下是有关效果比较的说明:Scanner vs. BufferedReader

答案 1 :(得分:1)

试试这个:

Scanner scanner = new Scanner(yourFileObject); // initialise scanner

然后

for (int i = 0; i < amountOfLines; i++) {
    String line = scanner.nextLine(); // get line excluding \n at the end
    // handle here
}

或者,对于 n 字符,而不是行:

Pattern charPattern = Pattern.compile(".")
// java.util.regex.Pattern with any char allowed
for (int i = 0; i < amountOfChars; i++) {
    char next = scanner.next(charPattern).toCharArray()[0];
    // handle here
}

在我看来,这是迄今为止从文件中获取第一个 n 字符/行的最佳和最简单的方法。