代码之家  ›  专栏  ›  技术社区  ›  achAmháin

无法读取任何包含特定字符的文件

  •  1
  • achAmháin  · 技术社区  · 8 年前

    TL;博士

    为什么在文件中读取 – 未找到 任何 上的数据 Notepad ?

    问题:

    到目前为止,我一直在使用纯ol' 便条簿 (6.1版)在此处读/写测试/回答问题的文本。

    读取文本文件内容并将其打印到控制台的简单代码位:

    Scanner sc = new Scanner(new File("myfile.txt"));
    while (sc.hasNextLine()) {
        String text = sc.nextLine();
        System.out.println(text);
    }
    

    一切都很好,这些行按预期打印。

    那么,如果我把这个放进去 准确的 字符: – ,则不会读取任何文件,也不会将任何内容打印到控制台。

    我当然可以用 Notepad++ 或其他(更好的)文本编辑器,并且没有问题,文本(包括短划线字符)将按预期打印。

    我也可以指定 UTF-8 ,使用 便条簿 ,它会很好地工作:

    File fileDir = new File("myfile.txt");
    BufferedReader in = new BufferedReader(
            new InputStreamReader(
                   new FileInputStream(fileDir), "UTF8"));
    String str;
    while ((str = in.readLine()) != null) {
           System.out.println(str);
    }
    

    在我的原件上 便条簿 文件,如果我复制并粘贴文本(包括 – )进入 记事本++ 并将这两个文件与 WinMerge ,它告诉我 便条簿 – ,但在 记事本++ ,它是 – .

    问题:

    为什么,当这 – 在中的文本文件中使用 便条簿 ,它是这样写的 ,基本上告诉我 hasNextLine() 是假的吗?它是否至少应该在包含该特定字符的行之前读取输入?

    复制步骤:

    • 在Windows 7上,右键单击并创建新的文本文档。
    • 在文件中放入任何文本(没有任何特殊字符)
    • 将此字符放入文件中的任意位置: –
    • 运行上面的第一段代码

    输出: BUILD SUCCESSFUL (total time: 1 second) ,即不打印 文本的。

    PS:

    我知道我问了一个类似的问题(嗯,结果是一样的) question 昨天,但不幸的是,我似乎没有很好地解释自己,或者一些观众没有完全阅读这个问题。不管怎样,我想我在这里解释得更好了。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Ashish Mathew    8 年前

    问题似乎在于编码的不同。您必须以与文件写入时相同的编码进行读取。

    您的系统记事本可能使用 Windows-1252 (或Cp-1252)编码。这种编码在128到159个字符之间存在问题。破折号位于该范围之间。该范围在等效ISO 8859-1中不存在,仅在Cp1252编码中存在。

    enter image description here

    Eclipse在读取记事本文件时,假设该文件的编码为ISO-8859-1(等效)。但ISO-8859-1中不存在此特征,因此存在问题。如果您想从Java中读取数据,则必须指定Cp1252,并获得输出。

    这也是当记事本中的文件是用UTF-8编写的时,使用UTF-8的代码能够正常工作的原因。

        2
  •  0
  •   Joop Eggen    8 年前

    缓冲读取器读取的内容超过当前行,可能是文本到有问题的字节。 Charset.CharsetDecoder.onMalformedInput 然后上场,有一些限制性的事情发生了,这通常是我没有预料到的。

    你使用特殊的JDK吗?你擦地毯下面的例外吗?就像一个包装上述代码的lambda。(添加可丢弃的捕捉)

    是您的platfom编码吗 -Dfile.encoding=ISO-8859-1 而不是 Cp1252 .