- ベストアンサー
「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"
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
テストしていないので、ソースコードを見ただけの見当で言います。 *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)を回ることになる) まちがっている指摘もあるかもしれません。 そちらで確かめて下さい。
その他の回答 (3)
- gimmick
- ベストアンサー率49% (134/270)
問題点は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()); } } }
お礼
わざわざ、コードまで記述いただき、ありがとうございます!! 私には、一回見ただけでは理解できていませんが、ちゃんとエラー処理もしてあり研究の価値ありです。 本当にありがとうございます!!
- chitose_houjo
- ベストアンサー率20% (5/24)
ごめんなさい。 私には無理でした・・・
お礼
回答いただきありがとうございました。
- chitose_houjo
- ベストアンサー率20% (5/24)
ソースを教えてください。
補足
下記となります。よろしくお願いいたします。 ーーーー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(); } } }
お礼
回答いただきありがとうございます。 ご指摘いただいたところを、もう一度書き直したところ、なんだかうまくいったみたいです。本当にありがとうございます!! 一応、作成したものも載せておきます。 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(); } }