【问题标题】:How to skip certain line from Text file in java?java - 如何从Java中的文本文件中跳过某些行?
【发布时间】:2012-04-04 09:02:48
【问题描述】:

我目前正在学习 Java,我遇到了这个问题,我想加载一个包含大量行的文件(我正在逐行读取文件),而我想做的是跳过某些行(伪代码)。

the line thats starts with (specific word such as "ABC")

我尝试过使用

if(line.startwith("abc"))

但这没有用。我不确定我是否做错了,这就是我在这里寻求帮助的原因,在加载功能的一部分下方:

public String loadfile(.........){

//here goes the variables 

try {

        File data= new File(dataFile);
        if (data.exists()) {
            br = new BufferedReader(new FileReader(dataFile));
            while ((thisLine = br.readLine()) != null) {                        
                if (thisLine.length() > 0) {
                    tmpLine = thisLine.toString();
                    tmpLine2 = tmpLine.split(......);
                    [...]

【问题讨论】:

  • +1 不确定为什么投了反对票。如果有错误的标签,请更正它们...
  • 你说一个特定的词,比如 ABC,在你的 if 语句中你都检查 abc。这些不相等,解决此问题的一种方法是将语句转换为大写。如果案件对您来说无关紧要。
  • 新用户发帖。如果你要投反对票,至少要提供反馈。
  • 我提供了反馈。这篇文章与我 5 分钟前更正的帖子完全相同。那个在我格式化和编辑时被删除了。
  • 没问题...我只是有点困惑,因为我重新格式化,编辑并回答了您的第一个问题,它已被删除,确切地说,我试图点击“发送”,然后它出现了下一秒又来了。我删除了我的 -1

标签: java io out-of-memory


【解决方案1】:

试试

if (line.toUpperCase().startsWith(­"ABC")){
    //skip line
} else {
    //do something
}

这将使用函数toUpperCase()line 转换为所有大写字符,并检查字符串是否以ABC 开头。

如果是true,那么它什么也不做(跳过行)并进入else部分。

您也可以使用startsWithIgnoreCase,这是Apache Commons 提供的功能。它接受两个字符串参数。

public static boolean startsWithIgnoreCase(String str,
                                           String prefix)

这个函数返回布尔值。 并检查字符串是否以指定的前缀开头。

如果字符串以前缀开头,则返回true,不区分大小写。

【讨论】:

  • 这个。不确定他是否只是给了我们快速的伪代码,或者这实际上是他在做什么,但 startwithstartsWith 不同,abcABC 不同
【解决方案2】:

如果情况不重要,请尝试使用 StringUtils.startsWithIgnoreCase(String str, String prefix)Apache Commons

This function return boolean.

See javadoc here

用法:

if (StringUtils.startsWithIgnoreCase(­line, "abc")){
    //skip line
} else {
    //do something
}

【讨论】:

  • 对于 vikiii 发布的“单线”来说似乎有些矫枉过正。
  • 非常正确。我确实认为新手Java程序员尽快学习Apache Commons库很重要,这样他们就不会重写common Utility。
  • 在几次这样做之后,我现在明白你的意思了。
【解决方案3】:

如果您的输入文件很大,您的代码将创建一个OutOfMemoryError。如果不编辑代码,您将无能为力(如果文件变大,添加更多内存将失败)。

我相信您将选定的行存储在内存中。如果文件变得更大(2GB 左右),您将拥有 4GB 的内存。 (String 的旧值和新值)。

你必须使用流来解决这个问题。

创建一个FileOutpuStream,并将选定的行写入该流。

你的方法必须改变。对于较大的输入,您不能返回字符串:

public String loadfile(...){

您可以返回Stream 或文件。

public MyDeletingLineBufferedReader loadFile(...)

【讨论】:

    【解决方案4】:

    您可以使用:

    BufferedReader br = new BufferedReader(new FileReader("file.txt"));
        String lineString;
        try{
        while((lineString = br.readLine()) != null) {
            if (lineString.toUpperCase().startsWith(­"abc")){
                //skip
                } else {
                //do something
                }
            }
         }
    

    org.apache.commons.lang.StringUtils 中的

    static boolean startsWithIgnoreCase(String str, String prefix) 方法,如下所示。

    BufferedReader br = new BufferedReader(new FileReader("file.txt"));
           String lineString;
            try{
                while((lineString = br.readLine()) != null) {
                   if (StringUtils.startsWithIgnoreCase(­lineString, "abc")){
                    //skip
                    } else {
                    //do something
                    }
                  }
               }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多