Java IOException - 流已关闭

4

当我运行这个程序时,出现了"IOException: Stream Closed"的错误。文本包含许多数据行。程序应该读取每一行数据,执行必要的功能,并将输出写入新文件。我不确定应该先关闭哪个writer以及在什么地方进行关闭。

import java.net.*; 
import java.io.*;

public class URLReader {
    public static void main(String[] args) throws Exception {
        BufferedReader br = null;
        try {
            // change this value
            FileInputStream fis = new FileInputStream("C:\\Users\\Rao\\Desktop\\test.txt");
            br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) {
                processLine(sCurrentLine); //error
            }
        } finally {
            if (br != null)
                br.close();
        }
    }

    public static void processLine(String line) throws IOException {
        String prename = line.substring(22);
        int siz= prename.indexOf(":");
        String name = prename.substring(0, siz);

        URL oracle = new URL("http://ip-api.com/json/"+name);
        BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) // error
            // System.out.println(inputLine);
            in.close();  
        String baby = (line + "\t" + inputLine); 

        try {
            FileWriter writer = new FileWriter("C:\\Users\\Rao\\Desktop\\output.txt", true);
            writer.write(baby);
            writer.write("\r\n");   // write new line
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

异常信息如下:
Exception in thread "main" java.io.IOException: Stream closed
    at java.io.BufferedReader.ensureOpen(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at URLReader.processLine(URLReader.java:31)
    at URLReader.main(URLReader.java:13)

抛出异常时,name的值是多少?这个名字对应的URL真的存在吗?返回的响应是什么? - vincent
你是不是想在 while ((inputLine = in.readLine()) != null) 后放一个空语句?现在你的代码实际上是这样的 while ((inputLine = in.readLine()) != null) {in.close();} - user253751
在我写下另一个之前,我已经将它关闭了。感谢 Jens,现在它已经被修复了。谢谢大家。 - Scitech
2个回答

7

你在循环中关闭了输入流:

while ((inputLine = in.readLine()) != null) // error

               // System.out.println(inputLine);
in.close();  

你应该在循环外关闭流:
while ((inputLine = in.readLine()) != null) // error
{
   //dosomething
   // System.out.println(inputLine);
}
in.close();  

3

你应该在while循环中放置一个函数调用,例如:

  1. System.out.println("Hi, I'm a row!");或者
  2. 取消注释System.out.println(inputLine);或者
  3. 在while声明的末尾放置一个分号

以便让它正确地执行。

代码如下(省略了注释):

...
   while ((inputLine = in.readLine()) != null)
     in.close();  
...

因此,循环的第一轮正确执行并运行in.close()。然后,第二轮调用inputLine = in.readLine()失败,因为流已关闭,然后抛出异常。


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