【问题标题】:java program to conditionally read lines from filejava程序有条件地从文件中读取行
【发布时间】:2016-06-23 13:41:54
【问题描述】:

我是 Java 编码新手。我将这段代码放在一起读取以下文本文件中“开始”和“结束”标记之间的所有行。

开始

你好

如何

在做什么?

结束

我的程序如下......

package test;

import java.io.*;

public class ReadSecurities {
public static int countLines(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

      try {
        FileInputStream in = new FileInputStream("U:\\Read101.txt");
        FileOutputStream out = new FileOutputStream("U:\\write101.txt");
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
      BufferedReader br = new BufferedReader(new InputStreamReader(in));

        for (int i=1; i<=countLines("U:\\Read101.txt"); i++) {
            String line=br.readLine();
                 while (line.contains("Start")) {
                    for (int j=i; j<=countLines("U:\\Read101.txt"); j++) {
                        String line2=br.readLine();
                        System.out.println(line2);
                        if(line2.contains("End")) break; 
                    else {
                             bw.write(line2);
                             bw.newLine();
                    }
                        bw.close();
                    } break;
                 }
               }
            br.close();
      }
      catch (Exception e) { }
      finally { }
      }
}

程序只读取前两行“hi hello”,就好像 if 条件不存在一样。我觉得这个错误很基本,但请纠正我。

【问题讨论】:

  • 不要完全放弃它。调用 br.readLine 直到它返回 null。
  • 循环完全没有意义。而且永远不要这样做:catch (Exception e) { }!调试时你会错过让你发疯的异常!更邪恶:当他们使用你的东西时,让你的开发人员发疯......
  • 你好@Berger,我尝试将它存储在一个变量中并使用它......仍然是相同的结果。这是我使用的代码code BufferedReader br = new BufferedReader(new InputStreamReader(in)); int sizeofile=countLines("U:\\Read101.txt"); for (int i=1; i
  • 您好 Fildor,该文件在结束标记之后也有内容。我只想阅读开始和结束之间的行。
  • 你可以早点休息。关键是:不要计算行数。您可以使用 2 个 while 循环(甚至更少)来执行此操作。 1. 阅读直到你读到“开始”(或到达 EOF) 2. 然后在那个副本之后直到你读到“结束”(或 EOF)

标签: java fileparsing


【解决方案1】:
String line;

do{ line = br.readLine(); }
while( null != line && !line.equals("Start"));

if ( line.equals("Start") ) { // in case of EOF before "Start" we have to skip the rest!
    do{ 
        line = br.readLine(); 
        if ( line.equals("End") ) break;
        // TODO write to other file
    }while(null != line )
}

应该就这么简单。为简洁起见,我省略了资源的创建/销毁和适当的异常处理。

但请至少记录异常

编辑:

如果开始之前遇到EOF,则必须跳过复制步骤!

【讨论】:

  • @MohanVS 注意我的编辑!我突然想到,如果文件应该 包含“Start”元素,则在第一个循环中到达 EOF 会导致第二个循环出现异常。所以你必须检查一下!
【解决方案2】:

您在代码中犯了一个重大错误:您没有正确处理异常。两件事:

  1. 永远不要抓到Exception。要么只捕获一种类型的异常,要么指定要捕获的异常列表。在您的情况下,一个简单的 IOException 就足够了。

  2. 切勿将 catch 块留空。要么抛出一个新异常,返回一个值,要么 - 在你的情况下 - 使用 e.printStackTrace() 打印异常。

当你做这两件事时,你会注意到你的代码抛出了一个IOException,因为你过早地关闭了你的bw-Stream。将bw.close() 向下移动到br.close() 所在的位置。

现在,当您完成此操作后,您的代码几乎可以工作了。唯一的事情是 - 你现在得到一个NullPointerException。这是因为在读取所有条目后您不会更改您的line。解决这个问题的简单方法是从

while(line.equals("Start")) { ...

if(line.equals("Start")) { ...

此外,您的代码中还有一些其他不那么整洁的东西,但我将暂时保留它 - 经验是随着时间而来的。

【讨论】:

    【解决方案3】:

    对于 Java 8:

    List<String> stopWords = Arrays.asList("Start", "End");
    try (BufferedReader reader = new BufferedReader(input))) {
       List<String> lines = reader.lines()
         .map(String::trim)
         .filter(s -> !StringUtils.isEmpty(s) && !stopWords.contains(s))
         .collect(Collectors.toList());
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      相关资源
      最近更新 更多