Сбой BufferedReader при чтении двоичного файла - PullRequest
0 голосов
/ 30 июня 2019

Сообщество, я был бы признателен за вашу помощь в следующем вопросе.

Я писал небольшое Java-приложение, которое позволяло бы мне создавать тестовые данные без дубликатов в том, что касается хеширования частей сообщений MIME. Требования:

  1. Цикл по местоположению главной папки с двоичными файлами, которые содержать электронные письма в формате MIME.
  2. скопировать файл в исходящее местоположение
  3. открыть файл, настроить содержимое, добавив тег для создания уникального файла (который пройдет хэширование / дедупликацию) и записать измененный содержание
  4. добавить файл в zip-файл -> закрыть zip-файл
  5. перейти к следующему бин-файлу. Повторите при необходимости.

Я застрял в точке 3 с BufferedReader сбой (?) На определенном наборе строк, которые одинаковы в каждом входном файле. Я не могу вставить его, так как он содержит конфиденциальные данные, но если я удаляю его, файл получает вывод просто отлично.

Я попробовал StandardCharsets с UTF-8 и US_ASCII на FileInputStream, но без радости. UTF-16 работает нормально, но тогда сопоставителю Regex не удается найти шаблон из-за кодировки, и я не могу добавить тег в строку темы.

Не могли бы вы посоветовать какой-либо способ исправить / обойти проблему с кодировкой (???), но при этом сохранить проблемный блок текста? Код для пункта 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();

}
...