字符串以空字符串("")开头

5

我的程序正在读取一个文本文件,并根据文本执行操作。但是文本的第一行有问题。显然它以""开头。这破坏了我的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

为什么会发生这种情况,我该如何解决?我希望它能认识到该行以 "!" 开头而不是 ""。


1
charAt(0) 不能返回“空字符串”或任何字符串。您从 System.out.println((int)thisLine.charAt(0)) 得到什么? - JimmyB
2
为什么不直接在调试中检查第一个字符呢? - deathangel908
3
65279是一个零宽度空格字符,因此它看起来就像是一个空字符串。请参见https://dev59.com/a2kw5IYBdhLWcg3wus_K。 - Buurman
@Buurman 你是对的。现在开头有一个 ? - WVrock
@Buurman,notepad.exe 没有显示任何内容。 - WVrock
显示剩余2条评论
5个回答

4
将我和其他人的评论汇总成一个答案以供后人参考,你的字符串可能包含不可打印的控制字符。尝试使用 System.out.println((int)thisLine.charAt(0)) 打印它们的数值代码,或者使用 my_string.replaceAll("\\p{C}", "?") 将控制字符替换为“?”。 System.out.println((int)thisLine.charAt(0)) 为您打印了 65279,这将是零宽度空格的 Unicode 代码点,虽然不是不可打印的,但在输出时实际上是看不到的。(请参阅 为什么我的 HTML 中出现 ?)。
要么从文件中删除额外的空白字符,要么从字符串中删除所有控制字符(my_string.replaceAll("\\p{C}", "")),或者在读取之前使用 @arvind 的答案修剪字符串(thisLine = thisLine.trim();),以便字符串开头或结尾没有任何空格。
编辑:记事本不会显示大多数“特殊”字符。如果您想编辑文件,请尝试使用十六进制编辑器或更高级的记事本版本,例如 Notepad++。

我正在寻找一种编程方式来删除它们。裁剪并没有起作用。 - WVrock
它起作用了,谢谢。但是那个字符从哪里来的?我是通过编程写的文本。 - WVrock
你可能在复制字符串时无意间复制了特殊字符,即使像String s = "abcdef";这样创建字符串,如果你从别处复制了abcdef部分,可能会复制进一个不可见的特殊字符。 - Buurman
1
652790xFEFF,它恰好是 UTF-16 编码文件的字节顺序标记。因此,如果有人选择在 UTF-16 中写入带有 BOM 的文件,则第一个 Unicode 字符看起来像那个“不可见的空格”,这至少表明您在读取文件时使用了正确的字节序。 - JimmyB

2

在操作之前尝试截断空白字符:

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

1

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

但是,请记住,startsWith(String arg)如果传递的参数是“”(空字符串),则返回true。

source: Javadocs


0

如果你正在循环读取行,请按以下方式操作:

忽略第一行,如果它是空的:

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

它不是空的,它是 ! 使用 ! 添加注释。以 ! 开头的行不会被读取。 - WVrock
好的,那么只需要修剪就可以了。我会相应地更新我的答案。 - Raman Shrivastava

0
使用以下代码可以确保查看行的第一个字符以及行的长度:
System.out.println(thisLine 
    + " -- First char : (" + ((int)thisLine.charAt(0))
    + ") - Line length: " +  thisLine.length());

它是 65279,记事本不会显示任何内容。 - WVrock
在这种情况下,最好的解决方案可能是在处理之前始终修剪(如@Arvind已经提到)读取的行。 - dosw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接