【问题标题】:String starts with an empty String ("")字符串以空字符串 ("") 开头
【发布时间】:2025-11-28 14:35:02
【问题描述】:

我的程序正在读取一个文本文件并根据该文本执行操作。但是文本的第一行是有问题的。显然它以“”开头。这弄乱了我的startsWith() 支票。

为了理解我使用此代码的问题:

   System.out.println(thisLine 
        + " -- First char : (" + thisLine.charAt(0) 
        + ") - starts with ! : " 
        + thisLine.startsWith("!"));

String thisLine 是文本文件的第一行。

它将这个写入控制台: ! use ! to add comments. Lines starting with ! are not read. -- First char : () - starts with ! : false

为什么会发生这种情况,我该如何解决?我希望它意识到该行以“!”开头不是“”

【问题讨论】:

  • charAt(0) 不能返回“空字符串”或任何字符串。你从System.out.println( (int)thisLine.charAt(0) ) 得到什么?
  • 为什么不直接签入调试第一个字符?
  • @HannoBinder 我得到65279
  • 行的第一个字符可能是不可读的控制字符。尝试用“?”替换您的控制字符是字符串 firstLine。 my_string.replaceAll("\\p{C}", "?");
  • 65279 是一个零宽度的空格字符,因此它看起来就像一个空字符串。见*.com/questions/9691771/…

标签: java string text


【解决方案1】:

将我的和其他人的 cmets 收集为后代的一个答案,您的字符串可能包含不可打印的控制字符。试试看

System.out.println( (int)thisLine.charAt(0) )

打印出他们的数字代码或

my_string.replaceAll("\\p{C}", "?");

用'?'替换控制字符。

System.out.println( (int)thisLine.charAt(0) ) 为您打印了65279,这将是零宽度空间的 Unicode 代码点,不是不可打印的,但在输出时实际上是不可见的。 (见Why is  appearing in my HTML?)。

要么从文件中删除多余的空格字符,要么从字符串中删除所有控制字符 (my_string.replaceAll("\\p{C}", "");),或者使用 @arvind 的答案并在读取之前修剪字符串 (thisLine = thisLine.trim();),使其在开头不包含空格或字符串的最后。

编辑:记事本不会显示大多数“特殊”字符。如果要编辑文件,请尝试使用十六进制编辑器或更高级的记事本版本,例如 Notepad++。

【讨论】:

  • 我正在寻找一种编程方式来删除它们。修剪不起作用。
  • 成功了,谢谢。但是这个角色是从哪里来的呢?我以编程方式编写了文本。
  • 当您复制字符串值时,您可能无意中复制粘贴了字符,即。即使您创建了一个类似String s = "abcdef"; 的字符串,如果您从其他地方复制abcdef 部分,您可能会复制一个特殊字符,该字符不会显示在您的IDE 中,但实际上会存在。
  • 652790xFEFF 恰好是 UTF-16 编码文件的 Byte Order Mark。因此,如果有人选择使用 UTF-16 的 BOM 编写文件,则第一个 unicode 字符看起来像那个“不可见的空白”,这至少表明您在读取文件时使用了正确的字节序。
【解决方案2】:

尝试在之前截断空格:

thisLine = thisLine.trim();
System.out.println(thisLine 
        + " -- First char : (" + thisLine.charAt(0) 
        + ") - starts with ! : " 
        + thisLine.startsWith("!"));

【讨论】:

    【解决方案3】:

    同意@Arvind 所说的话。如果字符串有前导空格,它应该可以解决问题。

    但是,请始终记住,如果传递的 arg 是“”(空字符串),startsWith(String arg) 将返回 true

    【讨论】:

      【解决方案4】:

      如果第一行为空,则忽略它..

      如果您正在循环中读取行,请执行以下操作:

      thisLine = thisLine.trim();
      if (thisLine.isEmpty()) {
          continue;
      }
      // Remaining logic here including sysout
      

      【讨论】:

      • 它不是空的它是! use ! to add comments. Lines starting with ! are not read.
      • 好的..那么只需修剪就可以了。相应地更新我的答案
      【解决方案5】:

      使用以下代码可以确定该行的第一个字符是什么以及该行有多长:

      System.out.println(thisLine 
          + " -- First char : (" + ((int)thisLine.charAt(0))
          + ") - Line length: " +  thisLine.length());
      

      【讨论】:

      • 它是65279 记事本没有显示任何内容。
      • 在这种情况下,在处理之前总是修剪()您阅读的行可能是最好的解决方案(就像@Arvind已经提到的那样)