社区,感谢您在以下问题上的帮助。
我一直在编写一个小型Java应用程序,就涉及MIME消息部分的散列而言,它允许我生成没有重复的测试数据。要求是:
- 通过主文件夹位置浏览二进制文件,其中 包含MIME格式的电子邮件。
- 将文件复制到外出位置
- 打开文件,通过添加标签来创建唯一文件(通过哈希/重复数据删除)并添加修改内容来修饰内容 内容
- 将文件添加到zip文件->关闭zip文件
- 转到下一个bin文件。 根据需要重复。
在第3点上,BufferedReader
在每个输入文件中都相同的一组特定行上崩溃了(?)。我不能粘贴它,因为它包含敏感数据,但是如果删除它,文件输出就可以了。
我在FileInputStream上尝试了带有UTF-8和US_ASCII的StandardCharsets,但是没有任何乐趣。 UTF-16可以正常工作,但是正则表达式匹配器由于编码而无法找到模式,因此我无法在主题行中添加标签。
能否请您提出任何解决编码(???)问题的方法,但是仍然保留有问题的文本块?下面第3点的代码:
public void createAUniqueEmailMsg(File fileIn, int i) throws IOException {
final String TAG = "_TEST_";
List<String> contents = new ArrayList<>();
// Patterns for MimeMessage parts
final String patternAtt = "Content-Disposition: attachment";
final Pattern attachmentPattern = Pattern.compile(patternAtt);
final String patternTo = "To: ";
final Pattern toPattern = Pattern.compile(patternTo);
final String patternFrom = "From: ";
final Pattern fromPattern = Pattern.compile(patternFrom);
final String patternMsgId = "Message-ID: ";
final Pattern msgIdPattern = Pattern.compile(patternMsgId);
final String patternSubject = "Subject: ";
final Pattern subjectPattern = Pattern.compile(patternSubject);
final String patternContents = "Content-Transfer-Encoding: ";
final Pattern contentsPattern = Pattern.compile(patternContents);
Matcher matcher = subjectPattern.matcher("\\D");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileIn)));
try {
String line;
while ((line = br.readLine()) != null) {
matcher.reset(line);
if (matcher.find() == true) {
String oldLine = line;
String newLine = line + TAG + i;
// Replace contents of the line with line + tag + iteration
line.replaceAll(oldLine, newLine);
contents.add(newLine);
} else {
// Add all read lines to contents.
contents.add(line);
}
}
} catch (Exception e) {
e.getMessage();
}
br.close();
logger.error("Debugging: Contents:" + contents);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileIn)));
for (String s : contents) {
bw.write(s);
bw.newLine();
}
logger.error("Contents for file: " + fileIn.getName() + " have been written.");
bw.flush();
bw.close();
}