4

I get "IOException: Stream Closed" when I run this program. The text contains many lines of data. Program should read each line, do necessary function and write the output to a new file. I am confused as to which writer should be closed first and where.

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();
        }
    }
}

The exception is as follows:

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)
3
  • what's the value of name when the exception is thrown ? doest the url really exists with this name ? what's the response ? Commented Oct 5, 2015 at 8:13
  • Did you mean to put an empty statement after while ((inputLine = in.readLine()) != null)? Right now you have effectively while ((inputLine = in.readLine()) != null) {in.close();} Commented Oct 5, 2015 at 8:15
  • I had closed it before I could write another. Thanks to Jens, It is fixed. Thanks guys Commented Oct 5, 2015 at 8:21

2 Answers 2

7

You close the input stream in your loop:

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

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

You should close the stream outside of the loop:

while ((inputLine = in.readLine()) != null) // error
{
   //dosomething
   // System.out.println(inputLine);
}
in.close();  
Sign up to request clarification or add additional context in comments.

Comments

3

You should put a function call in the while loop, like:

  1. a System.out.println("Hi, I'm a row!"); or
  2. uncomment System.out.println(inputLine); or
  3. put a semicolon at the end of the while statement

in order to let it to execute properly.

The code as it is written executes (comments omitted):

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

so the first cycle of the loop executes correctly and runs in.close(). Then the second cycle the call inputLine = in.readLine() fails because the stream is closed and then the exception is thrown.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.