2015-06-01 124 views
0

我想读取文件中的一条线,在喷口,然后将其发送到螺栓,但我不断收到流关闭错误。我错了吗?或者这里有什么问题?流关闭错误 - 风暴

public class InputSpout extends BaseRichSpout { 
    private SpoutOutputCollector collector; 
    public void 
    declareOutputFields(OutputFieldsDeclarer declarer) { 
     declarer.declare(new Fields("logfile")); 
    } 
    private FileReader fileReader; 
    private boolean completed = false; 
    private TopologyContext context; 
    @Override 
    public void open(Map config, TopologyContext context, SpoutOutputCollector collector) { 
     try { 
      this.context = context; 
      this.fileReader = new FileReader(("logfile.txt").toString()); 
     } catch (FileNotFoundException e) { 
      throw new RuntimeException("Error reading file " 
        + ("logfile")); 
     } 
     this.collector = collector; 
    } 
    public void nextTuple() { 


     if (completed) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 

      } 
     } 
     String str; 
     BufferedReader reader = new BufferedReader(fileReader); 
     str = null; 
     try { 
      str = reader.readLine(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     try { 
      while (str != null) { 
       this.collector.emit(new Values(str)); 
       str = reader.readLine(); 
      } 

     } catch (Exception e) { 
      throw new RuntimeException("Error reading typle", e); 
     } finally { 
      completed = true; 
     } 
     try { 
      reader.close(); 
      fileReader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

这是我收到的错误:

产生java.io.IOException:流在sun.nio.cs.StreamDecoder.ensureOpen(StreamDecoder.java:46) 关闭 在阳光下在java.io.BufferedReader.fill(BufferedReader.java:154) 在Java中.nio.cs.StreamDecoder.read(StreamDecoder.java:147) (java.io.InputStreamReader.read(InputStreamReader.java:184) .io.BufferedReader.readLine(BufferedReader.java:317) at java.io.BufferedReader.readLine(B在backtype.storm.daemon.executor $ fn__4654 $ fn__4669 $ fn__4698.invoke(executor.clj:565) 位于backtype.storm处的myStorm.InputSpout.nextTuple(InputSpout.java:52) 。 UTIL $ async_loop $ fn__458.invoke(util.clj:463) 在clojure.lang.AFn.run(AFn.java:24) 在java.lang.Thread.run(Thread.java:745)

+0

要开始,你需要尝试关闭'BufferedReader'。 – Andrew

回答

1

您正在关闭fileReader所使用的InputStream,因为nextTuple使其不能用于后续呼叫。没有必要关闭这个Reader - 只需关闭一个BufferedReader当所有的数据已被读取。

+0

即你也应该使用一个'BufferedReader'。否则,你会丢失数据,因为它提前读取。 – EJP