Правильное отображение текста из файла в Java - PullRequest
1 голос
/ 03 марта 2020

В настоящее время я пытаюсь прочитать несколько файлов (UTF-8) в каталоге и сохранить каждый элемент в этом текстовом файле в массив.

Я могу вывести текст на консоль, однако в нем показаны некоторые забавные символы, от которых я не могу избавиться (см. Изображение - как должно выглядеть, отображается справа).

В настоящее время у меня есть метод, который создает массив со всеми именами файлов в этом каталоге и затем использует для l oop Я посылаю каждое из этих имен файлов в метод чтения, который помещает его в строку.

Приведенный ниже метод записывает эти имена файлов в массив.

 public static ArrayList<String> readModelFilesInModelDir() {
    File folder = new File("Models/");
    File[] listOfFiles = folder.listFiles();
    String random = "";
    assert listOfFiles != null;
    ArrayList<String> listOfModelFiles = new ArrayList<>();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
            //System.out.println("File " + listOfFiles[i].getName());
            listOfModelFiles.add(listOfFiles[i].getName());
        } else if (listOfFiles[i].isDirectory()) {
            System.out.println("Directory " + listOfFiles[i].getName());
        }
    }
    System.out.println(listOfModelFiles);

    return listOfModelFiles;

Нижеприведенное значение для l oop затем отправляет эти имена файлов на чтение method.

ArrayList<String> modelFiles = readModelFilesInModelDir();
    for (int i = 0; i < modelFiles.size(); i++) {
        String thisString = readModelFileIntoArray(modelFiles.get(i));
        System.out.println(thisString);
    }

Затем метод ниже считывает строку в массив, который выводит то, что показывают изображения.

 public static String readModelFileIntoArray(String modelFilePath) {
    StringBuilder fileHasBeenRead = new StringBuilder();
    try {
        Reader reader = new InputStreamReader(new FileInputStream(("Models/" + modelFilePath)), StandardCharsets.UTF_8);
        String s;
        BufferedReader bufferedReader = new BufferedReader(reader);
        while ((s = bufferedReader.readLine()) != null) {
            fileHasBeenRead.append(s + "\n");
        }
        reader.close();
    } catch (Exception e) {
        System.out.print(e);
    }
    return fileHasBeenRead.toString().trim();
}

Наконец, Как бы я исправить эту проблему вывода, а также сохранить каждый из этих файлов, которые были прочитаны в отдельный массив, который я могу использовать в другом месте? Спасибо!

What is does look likeWhat is should look like

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Я согласен с Джонни Моппом, ваш файл закодирован в UTF-16, а не в UTF-8. Два �� в начале вашего вывода выглядят как знак порядка байтов (BOM) . В UTF-16 каждый символ кодируется двумя байтами. Поскольку ваш текст содержит только символы в диапазоне ASCII, это означает, что каждый первый байт всегда равен 0x00. Вот почему вы видите все эти : они соответствуют непечатному символу 0x00. Я бы даже сказал, что, поскольку два символа, следующие за ��, равны и a в этом порядке, ваш файл использует UTF-16 с прямым порядком байтов.

Вместо UTF-8 используйте StandardCharsets.UTF_16. Он также будет учитывать спецификацию и использовать соответствующий порядок байтов.

1 голос
/ 03 марта 2020

Гораздо проще (и обычно лучше) использовать существующие библиотеки для общих задач. * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * [100] * * * * * * * * * * * * [100] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [000} * * * * * *} * * * * * * * * * * * * * * * * * * * * *} * * * * *} * * *} *}} * *}} *} * * * * ...

...