Java, как скопировать часть файла

1

Я должен прочитать файл и в зависимости от содержимого последних строк, я должен скопировать большую часть его содержимого в новый файл. К сожалению, я не нашел способ скопировать первые n строк или символов файла в java.
Единственный способ, которым я нашел, - это копирование файла с помощью nio FileChannels, где я могу указать длину в байтах. Тем не менее, поэтому мне нужно знать, сколько байтов, которые я прочитал, необходимо в исходном файле.

Кто-нибудь знает решение одной из этих проблем?

  • 0
    скопируйте первые n строк или символов файла , пожалуйста, подтвердите еще раз, какие строки или символы необходимы?
  • 0
    Вы можете использовать BufferedReader и читать N строк, которые вы будете записывать в файл X. Затем повторяйте этот процесс, пока вы не разбили свой файл на несколько файлов.
Показать ещё 3 комментария
Теги:
file-io

2 ответа

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
}

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 символов/строк из файла.

  • 0
    Используя сканер, я также читал и записывал файл построчно, что было бы довольно медленно.
1

Вы должны использовать 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

  • 0
    спасибо, но, как уже упоминалось выше, это будет не так быстро, как использование таких способов, как nio.path или FileChannel, что важно в моем случае
  • 1
    @ user3479074 извините, вы не можете. Вам просто нужно работать с тем, что у вас есть. Кроме того, чтобы проверить, дает ли это требуемую производительность, сначала нужно ее протестировать, измерить результаты и сравнить с вашими временными показателями, и вы не опубликовали ничего, связанного с этим, чтобы мы могли провести сравнение.
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню