Как прочитать или заменить сразу несколько строк файла?

В настоящее время я пишу программу шифрования, которая шифрует текстовые документы с помощью 64-битного шифрования. Как это работает, так это то, что он берет строку и шифрует строку. В настоящее время я ищу способ, чтобы программа сохраняла все содержимое файла в строке, шифровала строку, а затем перезаписывала файл зашифрованной строкой. Однако, используя

while((bufferedReader.readLine()) != null) {
...
}

он читает и шифрует только первую строку, а остальная часть остается нетронутой.

однако, используя:

            List<String> lines = Files.readAllLines(Paths.get(selectedFile.toString()),
                Charset.defaultCharset());
        for (String line : lines) {
        ...
        }

зашифрована только последняя строка. Честно говоря, я уже не знаю, что делать, потому что у меня заканчиваются идеи.

Вот мой текущий код (который также добавляется только к файлу, так как я пробовал что-то новое):

    public static void Encrypt() throws Exception {

    try {

        FileWriter fw = new FileWriter(selectedFile.getAbsoluteFile(), true);
        BufferedWriter bw = new BufferedWriter(fw);

        List<String> lines = Files.readAllLines(Paths.get(selectedFile.toString()),
                Charset.defaultCharset());
        for (String line : lines) {
            System.out.println(line);
            System.out.println(AESencrp.encrypt(line));
            bw.write(AESencrp.encrypt(line));
        }

        bw.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

person None None    schedule 22.06.2013    source источник


Ответы (3)


BufferedReader#readLine вернет строку текста, прочитанную из ридера. В вашем примере вы игнорируете возвращаемое значение.

Вместо этого вы должны делать что-то вроде...

String text = null;
while((text = bufferedReader.readLine()) != null) {
    // Process the text variable
}
person MadProgrammer    schedule 22.06.2013
comment
Это была одна из первых вещей, которые я попробовал, но я не могу найти способ заставить средство записи файлов заменить только всю строку, которую он читает в данный момент. Например, FileWriter либо добавит и просто добавит шифрование, либо зашифрует только первую строку, прежде чем FileWriter полностью удалит остальную часть файла. Вот почему я надеялся, что есть способ одновременно прочитать весь документ и сохранить его в строке. - person None None; 22.06.2013
comment
Вам нужно записать во временный файл, после того, как конкурировали и потоки были закрыты, вы должны удалить старый файл и переименовать новый на его месте. Очень сложно читать и писать в файл одновременно - person MadProgrammer; 22.06.2013

Я не думаю, что шифрование построчно - хорошая идея. я бы сделал так

Cipher cipher = ...
Path path = Paths.get(file);
File tmp = File.createTempFile("tmp", "");
try (CipherOutputStream cout = new CipherOutputStream(new FileOutputStream(tmp), cipher)) {
    Files.copy(path, cout);
}
Files.move(tmp.toPath(), path, StandardCopyOption.REPLACE_EXISTING);

и читать зашифрованный текст, как это

Scanner sc = new Scanner(new CipherInputStream(new FileInputStream(file), cipher));
while(sc.hasNextLine()) {
    ...
person Evgeniy Dorofeev    schedule 22.06.2013

Попробуйте следующее:

public static void Encrypt() throws Exception {
    try {
        Path path = Paths.get(selectedFile.toURI());
        Charset charset = Charset.defaultCharset();

        // Read file
        List<String> lines = Files.readAllLines(path, charset);

        // Encrypt line
        lines.set(0, AESencrp.encrypt(lines.get(0)));

        // Write file
        Files.write(path, lines, charset);

    } catch (IOException e) {
        e.printStackTrace();
    }
}
person Paul Vargas    schedule 22.06.2013