正确显示 Java 文件中的文本

Correctly displaying text from a file in Java

我目前正在尝试读取一个目录中的多个文件 (UTF-8) 并将该文本文件中的每个元素存储到一个数组中。

我能够将文本打印到控制台,但是它显示了一些我似乎无法摆脱的有趣字符(参见图片 - 右侧显示的应该是什么样子)。

目前,我有一个方法可以构建一个包含该目录中所有文件名的数组,然后使用 for 循环将这些文件名中的每一个发送到一个读取方法,该方法将其放入一个字符串中。

下面的方法将这些文件名写入一个数组。

 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;

下面的 for 循环然后将这些文件名发送到读取方法。

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();
}

最后,我该如何解决这个输出问题,以及如何将已读取的每个文件存储到一个单独的数组中,以便我可以在其他地方使用?谢谢!

将现有的库用于常见的东西要容易得多(而且通常更好)。来自 apache commons-io 的 FileUtils 提供了开箱即用的功能,将您的文件读取代码减少到一行

String thisString = FileUtils.readFileToString("Models/" + modelFilePath, StandardCharsets.UTF_8);

...或您的文件使用的任何字符集...

我同意 Johnny Mopp 的观点,您的文件是用 UTF-16 编码的,而不是 UTF-8。输出开头的两个 �� 看起来像 byte order mark (BOM)。在 UTF-16 中,每个字符都用两个字节编码。由于您的文本仅包含 ASCII 范围内的字符,这意味着每个第一个字节始终为 0x00。这就是您看到所有这些 的原因:它们对应于不可打印的字符 0x00。我什至会说,由于 �� 之后的两个字符按此顺​​序是 a,因此您的文件使用的是大端 UTF-16。

使用 StandardCharsets.UTF_16 而不是 UTF-8。它还会考虑 BOM 并使用适当的字节顺序。