我必须阅读一个文件,根据最后几行的内容,我必须将其大部分内容复制到一个新文件中。不幸的是,我没有找到一种方法来复制java中文件的前n行或字符 我找到的唯一方法是使用nio FileChannels复制文件,我可以在其中指定长度(以字节为单位)。但是,因此我需要知道我在源文件中读取的内容需要多少字节。
是否有人知道其中一个问题的解决方案?
答案 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 字符/行的最佳和最简单的方法。