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