gpt4 book ai didi

java - 将文件解密到列表中时被分割的行

转载 作者:行者123 更新时间:2023-12-01 14:44:30 28 4
gpt4 key购买 nike

我试图读取我的加密文件并将其解密的内容放入列表中,但末尾的某些行随机拆分或中途拆分为新行。有什么想法为什么要这样做吗?(在解密方法中)。顺便说一句,缓冲区是 1024(如果有帮助的话)。

public Crypto() {
try {
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(keySpec);
ecipher = Cipher.getInstance("PBEWithMD5AndDES");
dcipher = Cipher.getInstance("PBEWithMD5AndDES");
byte[] salt = new byte[8];
PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
} catch (Exception e) {
}
}

@SuppressWarnings("resource")
public static List<String> decrypt(String file) {
List<String> list = new LinkedList<String>();
try {
InputStream in = new CipherInputStream(new FileInputStream(file), dcipher);
int numRead = 0;
while ((numRead = in.read(buffer)) >= 0) {
list.add(new String(buffer, 0, numRead);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

最佳答案

Stream 上的 read 方法只是将多个 Byte 读入缓冲区。因此,您的代码以大小为 1024 的 block 读取文件,并将读取的每个 block 保存到 List 中。

有多种方法可以逐行读取Stream,我推荐BufferedReader

final List<String> list = new LinkedList<String>();
try {
final BufferedReader reader = new BufferedReader(new InputStreamReader(new CipherInputStream(new FileInputStream(file), dcipher)));
String line;
while ((line = reader.readLine()) != null) {
list.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}

需要注意的一件事让我多次感到困惑,InputStreamReader 会进行从 ByteString 的隐式转换 - 这需要编码。默认情况下,将使用平台编码,这意味着您的代码与平台相关。对于您的原始代码也是如此,因为 new String(byte[]) 也使用默认的平台编码。

我建议始终显式指定编码:

final BufferedReader reader = new BufferedReader(new InputStreamReader(new CipherInputStream(new FileInputStream(file), dcipher), "UTF-8"));

或者对于String构造函数

new String(bytes, "UTF-8")

这同样适用于将 String 写入 File 的任何代码:

try {
try (final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new CipherOutputStream(new FileOutputStream(file), dcipher), "UTF-8"))) {
writer.append(data);
}
} catch (IOException ex) {
e.printStackTrace();
}

这样,您就可以避免在不同操作系统上运行应用程序时出现令人讨厌的意外情况,因为每个系列都使用不同的默认编码(Linux 上的 UTF-8ISO-8859-1 > 在 Windows 上和 MacRoman 在 Mac 上)。

另一个注意事项是,您现在不要关闭 Stream (或 Reader) - 这是必要的,可以在 finally 中完成> 在 java 6 中或使用 java 7 的新 try-with-resources 构造。

try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new CipherInputStream(new FileInputStream(file), dcipher), "UTF-8"))) {
String line;
while ((line = reader.readLine()) != null) {
list.add(line);
}
}

关于java - 将文件解密到列表中时被分割的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15582202/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com