从UTF-8文件读取时,字符数字不为真

时间:2015-03-04 20:43:16

标签: java utf-8 filestream chars

所以我使用扫描仪来读取文件。但是我不明白,如果文件是UTF-8文件,并且在迭代文件时读取的当前行包含数字,则方法Character.isDigit(line.charAt(0))返回false。但是,如果文件不是UTF-8文件,则该方法返回true。

下载一些代码

File theFile = new File(pathToFile);
Scanner fileContent = new Scanner(new FileInputStream(theFile), "UTF-8");
while(fileContent.hasNextLine())
{
    String line = fileContent.nextLine();
    if(Character.isDigit(line.charAt(0)))
    {
         //When the file being read from is NOT a UTF-8 file, we get down here
    }

当使用调试器并查看line字符串时,我可以看到在两种情况下(UTF-8文件与否),字符串似乎保持相同,一个数字。为什么会这样?

1 个答案:

答案 0 :(得分:2)

通过交换评论最终发现,您的文件包含BOM。对于UTF-8文件,通常不建议这样做,因为Java不期望它并将其视为数据。

所以你有两种选择:

  1. 如果您控制该文件,请在没有BOM的情况下重现该文件

  2. 如果没有,则检查文件是否存在BOM并将其删除,然后再继续执行其他操作。

  3. 这是一些要启动的代码。它倾向于跳过而不是删除BOM。随意修改,如你所愿。这是几年前我写的一些测试工具:

    private static InputStream filterBOMifExists(InputStream inputStream) throws IOException {
            PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3);
            byte[] bom = new byte[3];
            if (pushbackInputStream.read(bom) != -1) {
                if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) {
                    pushbackInputStream.unread(bom);
                }
            }
            return pushbackInputStream;
        }