Я должен прочитать файл и в зависимости от содержимого последних строк, я должен скопировать большую часть его содержимого в новый файл. К сожалению, я не нашел способ скопировать первые n строк или символов файла в java.
Единственный способ, которым я нашел, - это копирование файла с помощью nio FileChannels, где я могу указать длину в байтах. Тем не менее, поэтому мне нужно знать, сколько байтов, которые я прочитал, необходимо в исходном файле.
Кто-нибудь знает решение одной из этих проблем?
Попробуй это:
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
}
OR, для 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 символов/строк из файла.
Вы должны использовать BufferedReader
и читать N строк, которые вы будете записывать в файлX. Затем повторите этот процесс, пока вы не разделите файл на несколько файлов.
Вот базовый пример:
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
BufferedReader
и читать N строк, которые вы будете записывать в файл X. Затем повторяйте этот процесс, пока вы не разбили свой файл на несколько файлов.