字符數組構造String寫入文件,讀出後與直接字面量"?"用equals比較返回false,但字符內容看起來相同。
FileWriter默認平台編碼(Windows GBK,Linux UTF-8),寫入的字節序列與讀取時FileReader解碼產生的字符可能不同。s[k] = (char)(s[k] + p[k%m])可能生成非BMP字符、代理對或控制字符,顯示為?但實際碼點不同。char[](UTF-16碼單元),碼點不同即返回false。// 寫入前
System.out.println("str bytes: " + Arrays.toString(str.getBytes("UTF-8")));
// 讀出後
System.out.println("sss bytes: " + Arrays.toString(sss.getBytes("UTF-8")));
// 對比碼點
for (int i = 0; i < Math.min(str.length(), sss.length()); i++) {
if (str.charAt(i) != sss.charAt(i))
System.out.printf("Diff at %d: str=U+%04X, sss=U+%04X%n", i, (int)str.charAt(i), (int)sss.charAt(i));
}
FileWriter fw = new FileWriter(file, StandardCharsets.UTF_8); // Java 11+
// 或
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
Files.readString(Path, StandardCharsets.UTF_8)**(Java 11+)統一讀寫編碼。「寫入讀出內容相同」≠「equals返回true」**。equals比較的是UTF-16碼單元序列,編碼轉換、不可打印字符、字節序標記(BOM)均可能導致碼點差異。調試時**打印字節數組/碼點**而非依賴控制台顯示。