String.startswith 将 UTF-16 字符串与文字进行比较时失败

String.startswith fails when comparing UTF-16 string to literal

我有一个 Unicode("Windows Notepad Unicode" 或 UTF-16LE)文本文件,我从中读取如下行:

    FileInputStream is = new FileInputStream(cmdFile);
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-16LE"));
    String line = reader.readLine();

现在我需要检查行是否以特定字符序列开头:

if (line.startsWith("[COMMAND]")) ...

但是这个returns错误即使行实际上"starts"这个字符序列。
在检查 startsWith 的源代码时,我可以看到比较是逐个字符进行的。但据我所知,Java 实际上在内部表示使用这种特定编码的字符串,所以为什么比较失败?在这种情况下,正确的比较方法是什么?
想到的一件事是将 String 转换为具有所需编码的字节数组,然后比较两个字节数组,但这似乎是一种相当粗糙的方法,有没有更优雅的方法?

您可以尝试将 line 的字符作为整数单独打印出来,以检查字符串的实际组成方式。在我的应用程序中,我只使用 BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 并且能够正确使用 String 的 split 方法......所以也许 startsWith 也能正常工作。

经过一些研究和使用 String.getBytes() 可以看出问题出在字节顺序标记或 BOM 上。 Android Studio 没有像往常一样在工具提示中将这些额外字符显示为问号,这让我很困惑。