如何一次读取或替换文件的多行?

时间:2013-06-22 00:01:41

标签: java file filewriter bufferedwriter

我目前正在编写一个加密程序,使用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();
    }
}

3 个答案:

答案 0 :(得分:2)

BufferedReader#readLine将返回从阅读器读取的文本行。在你的例子中,你忽略了返回值。

相反,你应该做类似的事情......

String text = null;
while((text = bufferedReader.readLine()) != null) {
    // Process the text variable
}

答案 1 :(得分:1)

我不认为逐行加密是个好主意。我会这样做

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()) {
    ...

答案 2 :(得分:0)

尝试下一个:

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();
    }
}