正确显示 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 并使用适当的字节顺序。
我目前正在尝试读取一个目录中的多个文件 (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 并使用适当的字节顺序。