【问题标题】:BufferedReader is not parsing ascii control characters when using readline使用 readline 时,BufferedReader 不解析 ascii 控制字符
【发布时间】:2017-10-02 11:40:52
【问题描述】:

我正在尝试从文本文件中拆分一些带有 ascii 控制字符的字符串,最终得到以下输出:

Record1
Record2
Record3
Record4

我的文本文件在记事本++中如下所示:

但是当使用BufferedReader 从文本文件中获取行时,它不会从文件中捕获控制字符。我的代码如下所示:

File file = new File("Records.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");

BufferedReader bufferedReader = new BufferedReader(isr);

String text = bufferedReader.readLine();

System.out.println(text);

我的 sysout 的结果如下所示:

Record1Record2Record3Record4

我应该使用 ISO-8859-1 而不是 UTF-8 吗?

【问题讨论】:

  • 您可以使用ISO-8859-1 进行尝试。字符是什么?
  • 我实际上尝试使用 ISO-8859-1 仍然有相同的结果。如果我没记错的话,这些字符是 ascii 控制代码。 cs.tut.fi/~jkorpela/chars/c0.html GS 是 ctl-] 是记事本++
  • 从我的谷歌搜索它应该是一个单位分隔符 (ctrl ^_) char 31。它不是一个可见的字符。当你想用换行符替换它时,用这样的替换它
  • 但目标不是以任何方式修改文件。把那些字符解析成Java真的不可能吗?
  • 您确实阅读了它们,但它们没有换行符,因此您的输出将始终为 1 行。只有换行和回车开始新的一行。你也不修改文件。你读它,在内存中修改它,然后写它

标签: java ascii bufferedreader control-characters


【解决方案1】:

您可以使用美国字符作为分隔符分别读取每条记录:

Scanner scanner = new Scanner(new File("Records.txt")).useDelimiter("\u001F");
while (scanner.hasNext())
    System.out.println(scanner.next());

输出:

Record1
Record2
Record3
Record4

【讨论】:

    【解决方案2】:

    旁注:System.out.print .. 当应用于带有控制字符的“原始”数据时,尤其是在终端(cmd 窗口)上显示时,这些东西并不是强制可靠的。

    【讨论】:

      【解决方案3】:
      String s = "test" + (char) 31 + "test2";
      String c = String.valueOf((char) 31);
      System.out.println(Arrays.asList(s.split(c)));
      

      假设 31 是正确的字符(单位分隔符),此代码将在每次出现时拆分,因此它应该满足您的需求

      【讨论】:

        【解决方案4】:

        使用单位分隔符的字符值给了我一个提示。这就是我从头到尾做的事情

            File file = new File("Records.txt");
            FileInputStream fis = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1");
        
            BufferedReader bufferedReader = new BufferedReader(isr);
        
            String text = bufferedReader.readLine();
        
            Character delim = '\037';
        
            String[] records = text.split(delim.toString());
        
            for (String string : records) {
                System.out.println(string);
            }
        

        得到了我的预期输出:

        Record1
        Record2
        Record3
        Record4
        

        【讨论】:

          猜你喜欢
          • 2015-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 2016-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多