Кодирование Java POI Excel — отладка и производство

Я пишу простую программу, которая должна переводить страницу Excel с иврита на английский.
для этого код считывает содержимое каждой ячейки и сравнивает его с картой, которая получает информацию из простого CSV-файла. Запустив программу из IntelliJ, программа ведет себя отлично и делает то, что должна, однако компилируя ее в банку, программа этого не делает.

//Code for loading the csv contents to a map
private static Map<String,String> getLocalization(String pathToJar) {
    String path = null;
    path = pathToJar + "localization.csv";

    String line = "";
    HashMap<String, String> list = new HashMap<>();
    try {
        BufferedReader br = new BufferedReader(new FileReader(path));
        while ((line = br.readLine()) != null) {
            // use comma as separator
            String[] array = line.split(",");
            list.put(array[0], array[1]);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return list;
}

//Code for loading an Excel file and translating it
private static boolean updateExcel(Map<String,String> translation, String filepath, String pathToJar) {
    String path = pathToJar + "temp\\week.xlsx";

    //Read Excel document first
    FileInputStream input_document = null;
    XSSFWorkbook my_xlsx_workbook = null;
    try {
        input_document = new FileInputStream(new File(path));
        // convert it into a POI object
        my_xlsx_workbook = new XSSFWorkbook(input_document);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Read excel sheet that needs to be updated
    XSSFSheet my_worksheet = null;
    if (my_xlsx_workbook != null) {
        my_worksheet = my_xlsx_workbook.getSheetAt(0);
    }


    for (Row cells : my_worksheet) {
        String name = "";
        String shortCode = "";

        //Get the row object
        Row row = cells;

        //Every row has columns, get the column iterator and iterate over them
        Iterator<Cell> cellIterator = row.cellIterator();

        while (cellIterator.hasNext()) {
            //Get the Cell object
            Cell cell = cellIterator.next();
            //check the cell type and process accordingly
            switch (cell.getCellType()) {
                case STRING:
                    for (Map.Entry<String, String> entry : translation.entrySet()) {
                        if (cell.getStringCellValue().contains(entry.getKey())) {
                            cell.setCellValue(entry.getValue());
                        }
                    }
                    break;
            }

        }
    }
    my_worksheet.autoSizeColumn(1);

    FileOutputStream outFile = null;
    try {
        if (input_document != null) {
            input_document.close();
        }
        File finishedFile = new File(path);
        outFile = new FileOutputStream(finishedFile);
        my_xlsx_workbook.write(outFile);
        outFile.close();

        finishedFile.renameTo(new File(filepath));
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }

    return false;
}

CSV-файл выглядит примерно так:
иврит_слово, английское_слово
иврит_слово, английское_слово
иврит_слово, английское_слово
...


Несколько вещей, которые я проверил:
1. Карта читается из файла (пробовал кодировать в UTF-8)
2. В настройках IntelliJ установлено значение UTF-8

Я считаю, что это проблема кодировки, вывод ключей карты в ячейки Excel показывает набор специальных символов вместо слов.

Если есть какая-либо другая необходимая информация, пожалуйста, сообщите мне, и спасибо заранее.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
168
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FileReader — это старый служебный класс, который использует кодировку платформы по умолчанию. Запустив IntelliJ, вы сказали, что для него установлено значение UTF-8, как и кодировка файла. Вне IntelliJ это зависит от машины. Windows до сих пор не использует UTF-8.

Это можно сделать с помощью Files.lines начиная с Java 8:

try {
    Path p = Paths.get(path);
    Files.lines(p)
        .map(line ->line.split(",\\s*"))
        .filter(array -> array.length >= 2)
        .forEach(array -> list.put(array[0], array[1]));
} catch (IOException e) {
    e.printStackTrace();
}

Files.lines также можно передать кодировку, но новым значением по умолчанию является UTF-8.

Другие вопросы по теме