web-dev-qa-db-ja.com

Java IOException-ストリームが閉じられました

このプログラムを実行すると、"IOException:Stream Closed"が表示されます。テキストには多くのデータ行が含まれています。プログラムは各行を読み取り、必要な機能を実行し、出力を新しいファイルに書き込む必要があります。どの作家を最初に、どこで閉鎖すべきかについて私は混乱しています。

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)
4
Scitech

ループ内の入力ストリームを閉じます。

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();  
6
Jens

次のように、関数呼び出しを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()が実行されます。次に、2番目のサイクルでは、ストリームが閉じられて例外がスローされるため、呼び出しinputLine = in.readLine()が失敗します。

3
morels