【问题标题】:startsWith String method does not seem to be working properlystartsWith String 方法似乎无法正常工作
【发布时间】:2013-11-21 00:33:19
【问题描述】:

我有一个 Java 程序,它使用 inputStream 从输入文件读取并使用 outputStream 写入输出文件。该文件具有以井号“#”开头的注释行,还包含空白行。我试图让 Scanner 跳过这些行以获取实际信息。我无法硬编码要跳过的行数,因为输入文件可能会更改。这是我认为可以完成我需要的代码部分:

while (inputStream.hasNextLine()) {
        String line = inputStream.nextLine();
        if (!(line.startsWith("#")) || !(line.isEmpty())) {
            outputStream.println(line);
        }
    }

逻辑有问题吗?我认为使用此代码只会将非空白行或不以井号开头的行写入我的输出文件,而是将整个输入文件写入输出文件,包括注释行和空白行。我的猜测是我不太了解 startsWith 方法如何正常工作。欢迎大家提出建议,感谢阅读!

编辑

这里是 inputStream 的定义:

Scanner inputStream = null;
try {
        inputStream = new Scanner(new FileInputStream(inputFile));
    }
    catch (FileNotFoundException e) {
        System.out.println("File TripPlanner4_Vehicles.txt was not found");
        System.out.println("or could not be opened.");
        System.exit(0);
    }

这里也是输入文件的开头,它是一个文本文件:

# Ignore blank lines and comment lines (begins with pound sign '#')

# The vertical bar '|' is used as the field delimiter within each vehicle record

# Table of Vehicle Records
#   Column headings:
#     Type|Make|Model|Feature(s)|Engine Size (liters)|# Cyl|Fuel Type|Tank Size     (gallons)|City MPG|Hwy MPG|Towing?

Car|Chevrolet|Camaro||3.60|6|Unleaded|5.0|19|30|
Car|Chevrolet|Cruze||1.80|4|Unleaded|4.0|22|35|
Car|Chevrolet|Sonic||1.80|4|Unleaded|4.0|25|35|

编辑 2

我想出了一种方法来完成我所需要的,尽管这可能只适用于我正在使用的输入文件:

while (inputStream.hasNextLine()) {
        String line = inputStream.useDelimiter("|").nextLine();
        if (!line.contains("#") && (line.length() > 1)) { 
            outputStream.println(line);
        }
    }

这种方法确实会跳过其中包含“#”的行或空白行,但是如果一行在该行的任何位置包含“#”,它将被跳过。我的输入文件只把这些放在行的开头并且没有在其他地方使用,所以它适用于我的情况。如果有人有更动态的解决方案,欢迎分享。希望这可以帮助其他有类似情况的人。感谢所有回复并花时间提供帮助的人!

【问题讨论】:

  • 在您假设 .startsWith("#") 不起作用之前,我建议您独立测试它,而不是在 if 语句中进行测试...
  • 尝试大声朗读 if 语句,如“如果此行以 # 开头或该行不为空”,您可以看到问题出在哪里。
  • 我读到,当使用 String ("") 实现 starsWith 方法时会返回 true,所以从技术上讲,每一行都以这个空字符串开头,我将如何跳过这个空字符串?跨度>

标签: java string startswith


【解决方案1】:
while (inputStream.hasNextLine()) {
        String line = inputStream.nextLine();
        if (!(line.startsWith("#")) && !(line.isEmpty())) {
            outputStream.println(line);
        }
}

错误的运算符。更清楚:

while (inputStream.hasNextLine()) {
        String line = inputStream.nextLine();
        if (!(line.startsWith("#") || line.isEmpty())) {
            outputStream.println(line);
        }
}

这读起来好像是英文的,不会让你犯任何可能的错误。

【讨论】:

  • 这种方法仍然是将整个输入文件打印到输出文件中。您是否见过其他方法可以做到这一点,可能使用 String 类中的不同方法?
  • @user3015501:没有想到。这应该可以工作,你能分享一个工作代码示例吗?
  • 我尝试只实现代码“String line = inputStream.nextLine(); outputStream.println(line.startsWith("#");”并打印为false,所以根据方法,没有行以“#”符号开头。不过我无法解释。
  • @user3015501:请显示您定义输入流的位置。您能否也显示一个示例输入文件?
  • 我添加了我认为会有所帮助的内容,希望它能增加对整个事情的更多洞察力。
【解决方案2】:

使用&& 代替||。您需要不为空且不以 # 开头的行。

【讨论】:

    【解决方案3】:

    如果它不以# 开头,或者如果它不为空,则打印应该有一个AND。

    【讨论】:

      【解决方案4】:

      使用

       boolean startsWith= line.indexOf('#')==1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 2012-05-06
        • 2013-02-17
        • 2017-10-09
        • 2017-08-03
        • 2014-05-02
        • 2011-09-11
        • 2016-02-11
        相关资源
        最近更新 更多