• ベストアンサー

「javaに関して」エラーが解決できません。java.io.IOException: Bad file descriptor

インターネットを通して、たくさんのファイルを保存した場合、下記のようなエラーが出ます。 何か、解決手段はないでしょうか? ネットや本をいろいろ見たのですがまったくわかりませんでした。わかる方、ぜひとも、よろしくお願いいたします。 また、こういったエラーが出た場合、自分の力で解く方法を教えていただければ幸いです。 ーーーーエラーーーーーー java.io.IOException: Bad file descriptor at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at sun.nio.cs.StreamDecoder$ConverterSD.implRead(Unknown Source) at sun.nio.cs.StreamDecoder.read(Unknown Source) at java.io.InputStreamReader.read(Unknown Source) at java.io.BufferedReader.fill(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at test.main(test.java:14) Exception in thread "main"

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

テストしていないので、ソースコードを見ただけの見当で言います。 *is.close()の位置がおかしい。 URLの記述されているファイルから、一行ごとにURLを取得する 処理だと思うけれど、これでは一行処理したらファイルを close()してしまう。 *fr.open()とclose()の位置がおかしい。 同じファイルに書き込むなら、最初に1回オープンして、 最後にクローズすればいいはず。 *while((readString=in.readLine())!=null)の所で、 読み込んだ行が1行、無駄に捨てられているような気がする。 *その次のfor(;;)の役割がよくわからない。 ファイル読み込みを行っているのであれば、 whileかforかのどちらかで良いのでは? (なお、直前のwhileは次のfor文だけをループしている。 break;があれば、内側のfor(;;)だけを抜けて、また外側の while((readString=in.readLine())!=null)を回ることになる) まちがっている指摘もあるかもしれません。 そちらで確かめて下さい。

mizuki_ff
質問者

お礼

回答いただきありがとうございます。 ご指摘いただいたところを、もう一度書き直したところ、なんだかうまくいったみたいです。本当にありがとうございます!! 一応、作成したものも載せておきます。 import java.io.*; import java.net.*; class test { public static void main(String[] args) throws IOException { String readString = null; InputStream is = new FileInputStream("UrlInfo.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); OutputStream os = new FileOutputStream("ファイル.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); for(;;) { String h = br.readLine(); if( h == null) { break; } URL url = new URL(h); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } fr.write(i + "\n"); } in.close(); } is.close(); fr.close(); } }

その他の回答 (3)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.4

問題点はNo.3の方が指摘されたとおりです。質問の例外が発生するのは、UrlInfo.txtから2行目を読もうとした時点でストリームが閉じられているためです。補足のコードを私の好みも加味しつつ修正したので参考にしてください。 import java.io.*; import java.net.*; import java.util.*; class test {   public static void main(String[] args) {          try {       ArrayList urlList = new ArrayList();              BufferedReader br1 = null;       try {         InputStream is = new FileInputStream("UrlInfo.txt");         br1 = new BufferedReader(new InputStreamReader(is));                  String readString;         while((readString = br1.readLine()) != null) {           urlList.add(readString);         }       }       finally {         br1.close();       }              for(int i = 0; i < urlList.size(); i++) {                  BufferedReader br = null;         BufferedWriter bw = null;         try {           URL url = new URL((String)urlList.get(i));           br = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect"));                      OutputStream os = new FileOutputStream("file" + i + ".txt", true);           bw = new BufferedWriter(new OutputStreamWriter(os));                      String readString;           while((readString = br.readLine()) != null) {             bw.write(readString);           }         }         finally {           bw.close();           br.close();         }       }              System.out.println("comlpleted");     }     catch(IOException ex) {       System.out.println(ex.getMessage());     }   } }

mizuki_ff
質問者

お礼

わざわざ、コードまで記述いただき、ありがとうございます!! 私には、一回見ただけでは理解できていませんが、ちゃんとエラー処理もしてあり研究の価値ありです。 本当にありがとうございます!!

回答No.2

ごめんなさい。 私には無理でした・・・

mizuki_ff
質問者

お礼

回答いただきありがとうございました。

回答No.1

ソースを教えてください。

mizuki_ff
質問者

補足

下記となります。よろしくお願いいたします。 ーーーーUrlInfo.txtーーー ものすごく、たくさんの、urlが記述してあります。 ーーーーコードーーーーー import java.io.*; import java.net.*; class test { public static void main(String[] args) throws IOException { URL url = null; BufferedReader in = null; String readString = null; InputStream is = new FileInputStream("UrlInfo.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); for(;;) { String h = br.readLine(); if( h == null) { break; } url = new URL(h); in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); while((readString=in.readLine())!=null) for (;;) { String i = in.readLine(); if(i == null) { break; } OutputStream os = new FileOutputStream("ファイル.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); fr.write(i); fr.close(); } in.close(); is.close(); } } }

関連するQ&A