• ベストアンサー

「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"

  • Java
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • BufferedReaderでのエラー

    Javaプログラムを作成しています. 標準入力で入力された文字列を表示し,exitが入力されるまで繰り返すプログラムです. エラーが出ますが,対策方法がわかりません. ソースコード,実行結果,エラーは以下の通りです. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test { /** * @param args */ public static void main(String[] args) { System.out.println("Program starts."); while (true) { String input = null; input = getInputLine(); System.out.println("echo:" + input); if (input.equals("exit")) { break; } } System.out.println("Program exits."); } private static String getInputLine() { String input = null; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); input = br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } return input; } } Program starts. test echo:test echo:null java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145) at java.io.BufferedInputStream.read(BufferedInputStream.java:308) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at kadai1.Test.getInputLine(Test.java:34) at kadai1.Test.main(Test.java:18) Exception in thread "main" java.lang.NullPointerException at kadai1.Test.main(Test.java:21)

    • ベストアンサー
    • Java
  • Javaにてシリアル通信を行っております。

    やりたいことは、 電話がかかってきた際にアロハPC1(ナンバーディスプレイ)から 着信番号を受信して、 番号に該当する会員情報(DBから)をWEB画面に表示したいのです。 SerialDebugというソフトを使って、情報は取得できていると思います。 下記のような感じでいろいろ出てきます。 [TEXT] こ0ア3アイアイク090ア6ア5クキ00 [CHAR] _sp _sp 0 _sp 3 _sp _sp 0 _sp _sp 0 9 0 _sp 5 _sp 9 _sp _sp 5 5 _sp _sp _sp _sp _sp _sp _sp _sp _sp _sp [DEC] 130 177 48 177 51 177 178 48 178 184 48 57 48 177 53 57 57 184 183 53 53 160 160 160 160 160 160 160 160 160 3 [HEX] 82 B1 30 B1 33 B1 B2 30 B2 B8 30 39 30 B1 35 B1 39 B8 B7 35 35 A0 A0 A0 A0 A0 A0 A0 A0 A0 03 この時点で、このわけの分からないデータ(信号?)をどうすれば着信番号になるのかさっぱりです。 [HEX]の " 30 39 30 B1 35 B1 39 B8 B7 35 35 " から 09015198755 というテストに使っている携帯番号が取れるのが分かります。 (ここに書いてある番号は適当です。) とりあえず、このデータはどういう風に解析して正確な着信番号にすればいいのでしょうか? また、これをJavaのRXTXライブラリを使用して取得したいと考えていて、 下記、サンプルソースを真似して実行してみました。 http://www.javainthebox.net/JavaForFA/08-09CommAPI/No.08/samples/samples.zip の中の./src/DumbTerminal.java すると、イベント処理ルーチンのデータの読み込みのときにエラーが発生してしまいます。 java.io.IOException: Underlying input stream returned zero bytes at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) at sun.nio.cs.StreamDecoder.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 SerialTest.serialEvent(SerialTest.java:67) at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732) at gnu.io.RXTXPort.eventLoop(Native Method) at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575) こんな感じです。 これは何が原因なのでしょうか? 少ない情報で申し訳ありませんが、 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaのエラーについて

    javaを使って、ファイルの場所が書いてある、テキストファイルからファイルを読み取って解析するコードを書いたのですが、何行か作業をすると、エラーがでます。 ファイル名に半角カナや顔文字の類が入っているためエラーが起こっていると思います。 ただ、残念ながら、ファイル名を変更することができないため、読めるファイルだけでも読みたいのですが、下記のエラーがでて前に進めません。なんとか、エラーをスキップして作業を進めたいのですが、よい方法はないでしょうか?よろしくお願いいたします。 エラーメッセージ Exception in thread "main"java.io.FileNotFoundException :c:\ファイル名.txt( ファイル名、ディレクトリ名、またはボリューjム ラベルの構文が間違っています。) at java.io.FileInputSteam.open(Nativa Method) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at Test.main(Test.java:17) 17行目と18行目のコードです InputStream is = new FileInputStream(link); BufferedReader br = new BufferedReader(new InputStreamReader(is, "JISAutoDetect")); linkというところに、C:\ファイル名.txtを読み込ませています。しかしながら、多分、この「ファイル名」が半角やら、顔文字やらでうまく読み込めていないと思います。

    • ベストアンサー
    • Java
  • System.inをClose()すると例外が発生する。

    こんにちは、tokopokoといいます。 ■次のプログラムを実行すると、エラーになります。 なぜエラーになるのか、ご存知の方はいらっしゃいませんか。 import java.io.*; class TestInput { public static void main(String[] args) { System.out.println("first = \"" + getInputValue("first?") + "\""); System.out.println("second = \"" + getInputValue("second?") + "\""); } public static String getInputValue(String message) { String returnString = ""; System.out.print(message); BufferedReader input = null; try { input = new BufferedReader(new InputStreamReader(System.in)); returnString = input.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } return returnString; } } ■実行例 D:\>javac TestInput.java D:\>java TestInput first?100 first = "100" second?java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145 ) at java.io.BufferedInputStream.read(BufferedInputStream.java:308) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at TestInput.getInputValue(TestInput.java:14) at TestInput.main(TestInput.java:5) second = "" ■私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.6.0_03"

    • ベストアンサー
    • Java
  • eclipse起動時のエラー

    こんにちは。 初めて投稿させて頂きます。 マナー違反等ございましたら失礼致します。 eclipseを使用し、androidアプリの開発を行っております。 本日、eclipseを起動しようとしたところエラーとなり起動できなくなってしまいました。 eclipseからエラーログを確認しろとダイアログが表示されましたので 確認したところ以下のログ内容が記載されておりました。 ●ログ内容 !SESSION 2012-11-27 12:08:42.127 ----------------------------------------------- eclipse.buildId=M20110210-1200 java.version=1.7.0_05 java.vendor=Oracle Corporation BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=ja_JP Framework arguments: -product org.eclipse.epp.package.jee.product Command-line arguments: -os win32 -ws win32 -arch x86 -product org.eclipse.epp.package.jee.product -clean !ENTRY org.eclipse.core.resources 2 10035 2012-11-27 12:09:20.965 !MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes. !ENTRY org.eclipse.osgi 4 0 2012-11-27 12:10:02.024 !MESSAGE アプリケーション・エラー !STACK 1 java.lang.StackOverflowError at sun.nio.cs.ext.DoubleByte$Decoder.decodeArrayLoop(Unknown Source) at sun.nio.cs.ext.DoubleByte$Decoder.decodeLoop(Unknown Source) at java.nio.charset.CharsetDecoder.decode(Unknown Source) at java.lang.StringCoding$StringDecoder.decode(Unknown Source) at java.lang.StringCoding.decode(Unknown Source) at java.lang.String.<init>(Unknown Source) at java.lang.String.<init>(Unknown Source) at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(Unknown Source) at java.io.BufferedOutputStream.flushBuffer(Unknown Source) at java.io.BufferedOutputStream.write(Unknown Source) at java.io.PrintStream.write(Unknown Source) at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source) at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source) at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source) at java.io.OutputStreamWriter.flushBuffer(Unknown Source) at java.io.PrintStream.write(Unknown Source) at java.io.PrintStream.print(Unknown Source) at java.io.PrintStream.println(Unknown Source) at java.beans.Statement$1.exceptionThrown(Unknown Source) at com.sun.beans.decoder.DocumentHandler.handleException(Unknown Source) at com.sun.beans.decoder.DocumentHandler.parse(Unknown Source) at java.beans.XMLDecoder.parsingComplete(Unknown Source) at java.beans.XMLDecoder.readObject(Unknown Source) at zigen.plugin.db.core.XMLManager.load(XMLManager.java:39) at zigen.plugin.db.core.XMLManager.load(XMLManager.java:51) at zigen.plugin.db.core.XMLManager.load(XMLManager.java:57) at zigen.plugin.db.core.XMLManager.load(XMLManager.java:57)     ↑以降、約1000行にわたり記載あり google等でエラー内容を調べてみたのですが、主たるエラーと思われる 「java.lang.StackOverflowError」が原因でeclipseが起動できないという内容が あまり見受けられず、解決するに正直困っております。 是非皆様のお知恵をお借りしたく、宜しくお願い致します。 ●環境 OS:Windows7 eclipse:3.6 Helios JDK:1.7 JRE:1.7 CPU:Core i3 HDD:120GB MEMEORY:2GB

  • Javaでのエラーについて

    Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '.' at java.util.Formatter.checkText(Unknown Source) at java.util.Formatter.parse(Unknown Source) at java.util.Formatter.format(Unknown Source) at java.io.PrintStream.format(Unknown Source) at java.io.PrintStream.printf(Unknown Source) at ShininginSpace.main(ShininginSpace.java:33) と出てきたのですが、これはどういう意味ですか?

    • ベストアンサー
    • Java
  • javaでRMI関係の質問です。

    クライアントアプリケーションからサーバAPIを使う際に以下のエラーがでます。 eclipse+javaで開発中です。 Exception in thread "main" java.lang.NoClassDefFoundError: gnu/trove/THashSet at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Unknown Source) at java.lang.Class.getDeclaredField(Unknown Source) at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source) at java.io.ObjectStreamClass.access$700(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.io.ObjectStreamClass.<init>(Unknown Source) at java.io.ObjectStreamClass.lookup(Unknown Source) at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) at java.rmi.Naming.lookup(Unknown Source) at se.pricer.apidemo.APIDemo.<init>(APIDemo.java:26) at se.pricer.apidemo.APIDemo.main(APIDemo.java:83) Caused by: java.lang.ClassNotFoundException: gnu.trove.THashSet at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at sun.misc.Launcher$ExtClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 19 more 通信のURLは合っています。 「gnu/trove/THashSet」のエラーの意味を教えて下さい。 レジストリーのバインドがうまく出来ていないと思われます。 サーバのモジュールも実行構成ー>引数タブー>VM引数でcodebasの指定方法もいまいちわかりません。 初投稿なので変な質問ですが誰か力を貸して下さい。

    • ベストアンサー
    • Java
  • JAVAでエラーがでる。

    JAVA初心者なのですが、下のプログラムは数値を入力して、それを表示させるという簡単なプログラムなのですが、実行すると、 String str = br.readLine(); のbr.readLine();の部分に赤い波線が出て、 「処理されない例外の型 IOException at B.main(B.java:11)」 というエラーが出てしまってこまっています。 参考書のとうりに入力しているのになぜでしょうか? タブやスペースが使えないので見にくくなってしまってすみません。 どなたかJAVAに詳しい方 教えてください。 import java.io.*; public class B { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); System.out.println(num + "が入力されまた。"); } }

    • ベストアンサー
    • Java
  • 赤色の X イメージが表示され、アプレットが実行されない

    HP上でAppletを起動させたところ、アプレットが存在するはずの位置に赤色の X イメージが表示され、アプレットが実行されません。Javaのコンソールを表示すると以下のようになります。パーミッションはすべてのユーザに読み込み許可を与えているのですが...。 予想としては、 FileReader f = new FileReader("penguin.obj"); この箇所が間違っている気がするのですが、解決方法をどなたか教えてください。 java.security.AccessControlException: access denied (java.io.FilePermission penguin.obj read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader.<init>(Unknown Source) at Drawmap.init(Drawmap.java:22) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

    • ベストアンサー
    • Java
  • javaアプリケーションでのエラー対処方法

    javaアプリケーションで次のようなエラーが出ます。 どのように対処すればよろしいでしょうか? 入れなければならないソフト等もあればご教示ください。 よろしくお願いいたします。 Exception in thread "main" java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/locks/Lock at UpdateFileCreator.main(Unknown Source) Caused by: java.lang.ClassNotFoundException: edu.emory.mathcs.backport.java.util.concurrent.locks.Lock at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more

専門家に質問してみよう