当前位置: 首页 > 面试题库 >

读取文件时找不到零宽度无间隔

龙星辰
2023-03-14
问题内容

尝试解析从文件中获取的JSON字符串时遇到问题。我的问题是,读入时零宽度不间断空格字符(Unicode
0xfeff)在字符串的开头,我无法摆脱它。我不想使用正则表达式,因为可能会有其他隐藏字符具有不同的unicode。

这是我所拥有的:

StringBuilder content = new StringBuilder();
    try {
        BufferedReader br = new BufferedReader(new FileReader("src/test/resources/getStuff.json"));
        String currentLine;
        while((currentLine = br.readLine()) != null) {
            content.append(currentLine);
        }
        br.close();
    } catch(Exception e) {
        Assert.fail();
    }

这是JSON文件的开始(复制粘贴整个内容太长,但是我已经确认它是有效的):

{"result":{"data":{"request":{"year":null,"timestamp":1413398641246,...

到目前为止,这是我尝试过的方法:

  • 将JSON文件复制到notepad ++并显示所有字符
  • 文件复制到notepad ++并转换为不带BOM的UFT-8和ISO 8859-1
  • 在其他文本编辑器(例如sublime)中打开JSON文件并另存为UFT-8
  • 将JSON文件复制为txt文件,并在其中读取
  • 尝试使用扫描仪而不是BufferedReader
  • 在IntelliJ中,我尝试了视图->活动编辑器->显示空白

如何在不以零宽度不间断空格开头的字符串开头读取此文件?


问题答案:

0xEF 0xBB 0xBF是UTF-8
BOM,0xFE 0xFF是UTF-16BE
BOM和0xFF 0xFE是UTF-16LE
BOM。如果0xFEFF在字符串的开头存在,则表示您已创建带有BOM的UTF编码文本文件。UTF-16
BOM可以原样显示0xFEFF,而UTF-8
BOM只会显示0xFEFFBOM本身已从UTF-8解码为UTF-16(这意味着读者可以检测到BOM,但不会跳过)。
。实际上,众所周知Java不处理UTF-8 BOM(请参见Bug
JDK-4508058和JDK-6378911)。

如果您阅读该FileReader
文档,它将显示:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。

您需要使用一种识别字符集的阅读器来读取文件内容,最好是一种能够为您阅读BOM并根据需要在内部进行调整的阅读器。但更糟糕的情况是,您可以自己打开文件,读取前几个字节以检测是否存在BOM表,然后使用适当的字符集构造读取器以读取文件的其余部分。这是一个使用此功能的示例org.apache.commons.io.input.BOMInputStream

String defaultEncoding = "UTF-8";
InputStream inputStream = new FileInputStream(someFileWithPossibleUtf8Bom);
try {
    BOMInputStream bOMInputStream = new BOMInputStream(inputStream);
    ByteOrderMark bom = bOMInputStream.getBOM();
    String charsetName = bom == null ? defaultEncoding : bom.getCharsetName();
    InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bOMInputStream), charsetName);
    //use reader
} finally {
    inputStream.close();
}


 类似资料:
  • 问题内容: 我有两个过程,其中一个正在写(附加)到文件,另一个正在从文件读取。这两个进程正在同时运行,但无法通信。另一个读取器进程可能在写入器进程完成之前开始。 这种方法有效,但read()通常返回已读取零字节且无错误的信息。它们的零长度读取与非零长度读取之比很高,效率很低。 有没有办法解决?这是在POSIX文件系统上。 问题答案: 没有通信通道,就无法保证在读取正在写入的文件时,防止零字节读取甚

  • 现在,我只是尝试读取与Java类存储在同一目录中的文件内容,并访问其长度。但是,每当传递正确的文件名以创建新的对象时,其长度返回为零。我假设这是因为由于某种原因找不到该文件。 我的文件结构如下: 我尝试用,其中等于。

  • 我收到一个错误,这个读取while循环。即使我用打印所有内容,它也会显示count tt==0。这意味着,while循环甚至不工作? 尝试捕获输入。 这是我有问题的代码。 这是我正在阅读的文本文件

  • 问题内容: 我正在使用Java在Linux EXTREME VPS上存储图像 当我将其存储在服务器路径上时 使用以下代码读取路径 当我使用上面的代码阅读时,我得到以下异常 如何解决这个问题呢? 还有其他从Linux服务器读取文件的方法吗? 问题答案: 我认为问题在于您使用的文件路径错误。 您说您正在Linux服务器上读取文件,似乎您正在尝试在Windows计算机上读取文件。由此推断,您已将Linu

  • 我试图从一个名为poll.txt的文件中获取数据集,然后使用相关数据。 poll.txt内容: 源代码,选举票.java: 但是,当我运行程序时,在给出异常之前,只使用了其中一行: 我试着在“scanner.nextLine();”语句中移动,但没有用。如果我不要求nextLine,这个程序运行良好,但我显然需要它,而且我似乎不知道出了什么问题。

  • 问题内容: 我提出了一个错误: 我想在网上阅读HTML文件 问题答案: 您的URI不是URI。没有协议组件。它需要http://或您打算使用的其他协议。