ObjectInputStreamとStreamCorruptedExceptionについて

このQ&Aのポイント
  • ObjectInputStreamとStreamCorruptedExceptionについての質問です。
  • ソースコードをコンパイルして実行すると、StreamCorruptedExceptionが発生します。
  • StreamCorruptedExceptionは、読み込まれた制御情報が内部整合検査に違反した場合にスローされます。正しい実行方法を教えてください。
回答を見る
  • ベストアンサー

ObjectInputStreamとStreamCorruptedExceptionについて

このようなソースがあり ------------------------------------------------- import java.io.File; import java.io.FileInputStream; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.BufferedInputStream; import java.io.Serializable; import java.io.ByteArrayInputStream; public class TTT{ public static void main( String[] args ){ try{ FileInputStream fis = new FileInputStream( "C:\\aa\\ddd.txt" ); //FileInputStream fis = new FileInputStream( "C:\\aa\\aa.jpg" ); ObjectInputStream ois = new ObjectInputStream( fis ); }catch( Exception w ){ w.printStackTrace(); } } } ------------------------------------------------- これをコンパイルをかけて実行すると java.io.StreamCorruptedException: invalid stream header at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:737) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253) at TTT.main(TTT.java:24) となってしまいます。 読み込むファイルをコメント部分の画像ファイルに 変えてみても同様です。 StreamCorruptedExceptionの内容はJAVAのAPIドキュメントでは読み込まれた制御情報が、内部整合検査に違反した場合にスローされると説明がありますがこれはどういう意味でしょうか? また正しく実行させるにはどのようにすればいいのでしょうか? よろしくお願いします。

  • Java
  • 回答数7
  • ありがとう数3

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

  • ベストアンサー
  • koki_m
  • ベストアンサー率83% (45/54)
回答No.4

こんばんは。 普通にバイナリデータを送りたいだけであれば、クライアント側はファイル読み込みにFileInputStream、ソケットへの出力にOutputStreamを、サーバ側はファイル書出しにFileOutputStream、ソケットからの入力にInputStreamを使うのが一番シンプルだと思います。 ※下のサンプルを実行すると作業フォルダに、test.dataとserved_test.dataというファイルを作成します(既存の場合は上書き) - - - - - - - - - - - - - - - - - - - - [クライアント] import java.io.*; import java.net.*; class TestClient { public static void main(String[] args) { if(!new File("test.data").exists()) { TestClient.makeTestData(); } try { FileInputStream fis = new FileInputStream("test.data"); Socket s = new Socket("localhost", 10000); OutputStream os = s.getOutputStream(); byte b = -1; while((b = (byte)fis.read()) != -1) { os.write(b); c++; } os.close(); s.close(); fis.close(); } catch(ConnectException ce) { System.out.println("リモートアドレス/ポート上で待機しているプロセスがありません"); } catch(Exception e) { e.printStackTrace(); } } public static void makeTestData() { byte[] testData = new byte[1024 * 8]; for(int i = 0; i < testData.length; i++) { testData[i] = 0x01; } try { FileOutputStream fos = new FileOutputStream("test.data"); fos.write(testData); fos.flush(); fos.close(); } catch(Exception e) { e.printStackTrace(); } } } - - - - - - - - - - - - - - - - - - - - [サーバ] import java.io.*; import java.net.*; class TestServer { public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream("served_test.data"); ServerSocket ss = new ServerSocket(10000); System.out.println("受付開始"); InputStream is = ss.accept().getInputStream(); byte b = -1; while((b = (byte)is.read()) != -1) { fos.write(b); } System.out.println("受付終了"); is.close(); ss.close(); fos.close(); } catch(Exception e) { e.printStackTrace(); } } } - - - - - - - - - - - - - - - - - - - - > ObjectOutputStream clientOut = new ObjectOutputStream(soket.getOutputStream()); > BufferedOutputStream clientBuf = new BufferedOutputStream(clientOut, 1024); このコードだとclientOutはObjectOutputStreamのオブジェクトとしては使われていません。 ストリームへの書出しを担当しているのはBufferedOutputStreamのオブジェクトです。 No.3の方も書いているように、ObjectInputStream、ObjectOutputStreamは「直列化」(シリアライゼーション)データを扱うものです。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/ObjectInputStream.html > クライアントからの切断もサーバー側で感知させる クライアント側でファイル末尾まで正常に出力が完了したら、完了通知のコード(数値や文字列)を送る。完了通知のコードが届かない場合は、サーバ側でクライアントから切断されたと判断する。という方法が考えられます。

参考URL:
http://www.hellohiro.com/socket.htm
administratorrr
質問者

補足

UKY様、koki_m様 大変ご丁寧な回答ありがとうございました。m(_ _)m おかげさまで何とか無事に送受信ができました。 ですがもう少しお聞きしてよろしいでしょうか? 実はサーバー側の仕組みなのですが、下記(1)(2)のスレッドが用意されています。 ----------------------------------------------------------------------------------  (1)クライアントから接続を受けるスレッド(1ポート毎に用意)     ⇒接続を受けた後、(2)のスレッドに処理を完全に渡す      (socket.accept().getInputStream()によるInputStreamを渡す)      (2)へ処理を渡した後、また別のクライアントからの接続待ちを行う。  (2)クライアントからのデータ受信を行うスレッド(1クライアント毎に用意)     ⇒(1)から引き継いだInputStreamにより、データの受信を行う。      受信後は、データをByteデータに加工し、また別のスレッドに渡す。      その後、再度同じクライアントからのデータ受信待ちを行う。      (1度接続されてからは切断されるまで、ひたすらデータを受けつづける) ---------------------------------------------------------------------------------- ですので1回のデータ送信後にすぐSocketをCloseするということができません。 ひたすらSocketは開いたままなのですが、1回分の送信データのみを確実にByteデータにして 保持したいのです。そしてクライアントからの切断も判断させたいのです。 何度もご質問して申し訳ありませんが、何卒ご回答宜しくお願いいたします。

その他の回答 (6)

  • koki_m
  • ベストアンサー率83% (45/54)
回答No.7

>> UKYさん 間違いの指摘ありがとうございます。 完全に基本部分を忘れてました(笑) intの255=(3バイト省略) 11111111はbyteでは-1ですよね。 おかげ様でこれからは間違えないように書けます。 for文で書いた方が変数宣言もできてスマートですね。 こちらも参考にさせて頂きます。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.6

>> koki_mさん while((b = (byte)fis.read()) != -1) { os.write(b); } これはまずいですよ。先に byte にキャストして比較すると読み込んだバイトデータとして 0xff が入っていたときにそこで処理が終わってしまいます。 必ず int のまま比較して、後で byte にキャストしないと。 for (int b; (b = fis.read()) != -1; ) { os.write((byte) b); }

  • koki_m
  • ベストアンサー率83% (45/54)
回答No.5

すいません。No.4の訂正です。 [クライアント]の while((b = (byte)fis.read()) != -1) { os.write(b); c++; } は、 while((b = (byte)fis.read()) != -1) { os.write(b); } です。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

基本的には、バイナリデータを読み取るだけなら FileInputStream だけでできます。というか、InputStream と名の付くものはすべてバイナリデータを読み取る機能を備えています。 問題は、読み取ったデータをどのように扱いたいかということです。 例えばテキストファイルを読み込む場合、単純にバイナリデータとして読み取っただけでは意味がなく、それを文字列に変換してやらなければいけません。そのためには InputStream に InputStreamReader を「かます」とか、読み取ったデータをデコーダに掛けるなどといったことをします。 あるいは JPEG 形式の画像ファイルを読み込む場合、読み込んだデータを画像処理プログラムに渡すなどといったことをするでしょう。 ObjectInputStream は、「直列化」という特殊な方法で作られたバイナリデータをオブジェクトに復元するために使います。つまり、そういう特殊な形式のデータしか読み込むことができません。

administratorrr
質問者

補足

みなさま色々アドバイス頂き、ありがとうございます。 今やろうとしている事は、Socket通信でクライアントからサーバーへバイナリデータ(約8K)を送信させようとしています。 送信する1回のバイナリデータのサイズは不確定で、多数のクライアントから1つのサーバーに大量のデータが送信されることが 予想されています。 そこで色々調べていたのですが、どうやら『JAVAのSocket通信で、1回の送信で送れる最大バイト数は1024byte』らしいとの事でした。 そのため、送受信ともに1024バイトずつ処理を実行させようと考えました。 ソースを以下に提示します。 /* ----------------------- クライアント側 ("Test.data"ファイルはObjectOutputStreamクラスを使用して作成しています)-----------------------*/ //バイナリデータファイルの読み込み BufferedInputStream bis = new BufferedInputStream(new FileInputStream("Test.data")); ByteArrayOutputStream bOut = new ByteArrayOutputStream(); int i; while((i = bis.read()) != -1){ bOut.write(i); } byte[] bData = bOut.toByteArray(); //出力ストリームを取得 ObjectOutputStream clientOut = new ObjectOutputStream(soket.getOutputStream()); BufferedOutputStream clientBuf = new BufferedOutputStream(clientOut, 1024); //データ長を送信 int length = bData.length; int offset = 0; while(length > 1024){ clientBuf.write(bData, offset, 1024); offset += 1024; length2 -= 1024; } if (length > 0 ) { clientBuf.write(bData, offset, length); } clientBuf.flush(); clientBuf.close(); /* ----------------------- サーバー側 --------------------------------------------------------------------------------------------------*/ //入力ストリームを取得 ObjectInputStream serverIn = new ObjectInputStream(socket.getInputStream()); BufferedInputStream serverBuf = new BufferedInputStream(serverIn); ByteArrayOutputStream bOut = new ByteArrayOutputStream(); //データ長を受信 byte[] bufByte = new byte[1024]; int length = serverIn.readInt(); while (length > 1024) { serverBuf.read(bufByte, 0, 1024); bOut.write(bufByte, 0, 1024); length -= 1024; } if (length > 0) { serverBuf.read(bufByte, 0, length); bOut.write(bufByte, 0, length); } byte[] bData = bOut.toByteArray(); String message = new String (bData); if(message == null){ //クライアントからの切断!? } 上記のようにしているのですが、サーバー側のObjectInputStreamでreadInt()メソッドをコールした際に 戻り値が負の整数となってしまいます。 また同時にクライアントからの切断もサーバー側で感知させるようにもしたいです。 この他の手法でもまったく構いませんので、何かよい解決方法をご教授頂きたいと思います。 よろしくお願いいたします。m(_ _)m

  • koki_m
  • ベストアンサー率83% (45/54)
回答No.2

こんばんは。 > 内部整合検査に違反した場合にスローされる おそらく読込もうとしたファイルが、オブジェクトをバイナリで書き出したファイルではない。ということだと思います。 指定ファイル(C:\\aa\\ddd.txt)がObjectOutputStreamで書き出したバイナリデータであれば上記例外は出ないようです。 - - - - - - - - - - - - - - - - - - - - - import java.io.*; public class Test { public static void main( String[] args ){ try{ String testString = "This is a test."; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\aa\\ddd.txt")); oos.writeObject(testString); oos.close(); FileInputStream fis = new FileInputStream( "C:\\aa\\ddd.txt" ); //FileInputStream fis = new FileInputStream( "C:\\aa\\aa.jpg" ); ObjectInputStream ois = new ObjectInputStream( fis ); String returnString = (String)ois.readObject(); System.out.println(returnString); ois.close(); fis.close(); } catch(Exception w){ w.printStackTrace(); } } } - - - - - - - - - - - - - - - - - - - - > 正しく実行させるにはどのようにすればいいのでしょうか? 何が正しい実行なのかがちょっと分からないですが、ソースコードから2通り推測できます。 ・書き出したオブジェクトを読み込みたい  →上記のように書き出したオブジェクトファイルを指定してください。 (ファイル名は.txtのままですが、oos.writeObject(testString);でオブジェクトファイルとなります) ・テキストや画像を読み込みたいが、間違ってObjectInputStreamを使おうとしていた  →テキストファイルはBufferedReader等、画像はDataInputStream等を使用します。

administratorrr
質問者

お礼

詳しい回答ありがとうございます。 バイナリデータを読み込むというのが目的でした。 でObjectInputStreamクラスを使用したのですがそもそも 使い方が間違っているのでしょうか?

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

何だかとんちんかんなことをしているような……。 ObjectInputStream はどのような機能を持ったクラスでどのようにして使うかを知らずに、出任せでプログラムを書いていませんか? とりあえず、このソースを読んだだけでは何をするためのプログラムを作ろうとしているのかよくわからないので、説明をお願いします。

administratorrr
質問者

補足

回答ありがとうございます FileInputStreamクラスと ObjectInputStreamクラスを使用して バイナリファイルデータの読み込みをしたいと思っています。 読み込むデータのサイズは8Kで、Socketにてクライアントからデータの送信をさせようとしています。

関連するQ&A

  • javaのObjectOutputStreamのエラーが消えません

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.txt")); oos.writeObject(text); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("text.txt")); text = (LinkedList<String>)ois.readObject(); 最後の分のois.readObject()のなぜかClassNotFoundExceptionになってしまって先に進めないです。 これではあまり意味がないんですが、わかる方がいらっしゃいましたら教えてください

  • Javaのシリアライズについて質問です。

    Javaのシリアライズについて質問です。 以下の二つのコードで実行すると、ちゃんとシリアライズされたデータが生成されるのですが このコードでは実行するたびにデータが上書きされてしまいます。 これを実行するたびに新しいデータを最後尾に追加するような形にしたいのですがどのようにすればいいのでしょうか? よろしくお願いします。 ------------------------------------------------------------------------------- import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.FileInputStream; import java.io.ObjectInputStream; public class Main { public static void main(String[] args) { Data data = new Data(); data.setName("testtesttest"); try { FileOutputStream outFile = new FileOutputStream("data.txt"); ObjectOutputStream out = new ObjectOutputStream(outFile); out.writeObject(data); out.close(); outFile.close(); } catch(Exception ex) { ex.printStackTrace(); } } } ----------------------------------------------------------------------------------- import java.io.Serializable; public class Data implements Serializable { private String name = ""; public void setName( String NameData ) { name = NameData; } } -----------------------------------------------------------------------------------

    • ベストアンサー
    • Java
  • 固定長データのbyteスキップについて

    バイナリ入出力でご質問がございます。 下記の例のように各レコードにある 先頭5byte付与されたデータを スキップ(破棄)して 各レコード10byteずつ読み込みたいのですが なにかサンプルデータもしくは アドバイス頂けないでしょうか? どうぞよろしくお願い致します。 例 1レコード 10byte (先頭5byte付与) LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 ↓ 1234567890 1234567890 1234567890 1234567890 1234567890 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • レコード長からのbyteスキップ設定について

    QNo.8229324から あらたに新規でご質問させて頂きます。 1レコードごとに10byteあったとします。 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 レコード長からスキップ設定を35byteと設定したとします。 40byteごとに頭の付与された5byteをスキップさせたいのですが なにかサンプル及びアドバイス頂けますでしょうか? 仕様案 (1)まずはレコード先端の5byteをスキップ (2)次は35byteを超えた時点で5byteスキップを繰り返し。 どうぞ宜しくお願い致します。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • パッケージ管理に変更されたデータObjectのリカバリー方法

    今までパッケージ管理されていなかったデータオブジェクトをパッケージ管理するよう変更したのですが、クラス名が変更されたことにより旧データオブジェクトの復旧が行えなくなりました。 前データ) class Data implements Serializable { public Data(){} } (1)オブジェクトストリームとしてExport。 Data target = new Data(); java.io.FileOutputStream ostream = new java.io.FileOutputStream("C:\\test.data"); java.io.ObjectOutputStream p = new java.io.ObjectOutputStream(ostream); p.writeObject(target); p.flush(); ostream.close(); (2)Dataオブジェクトをパッケージ管理に変更 新データ) package com.corp.etc class Data implements Serializable { public Data(){} } (3)(1)でExportしたデータをImport java.io.FileInputStream istream = new java.io.FileInputStream("C:\\test.data"); java.io.ObjectInputStream p = new java.io.ObjectInputStream(istream); Object obj = p.readObject(); istream.close(); Data data = (Data)obj; (3)の実行結果) java.lang.ClassNotFoundException: Data クラス名が変わったので、当たり前の動きとは思うのですが、旧データを今までと同じようにインスタンス化するために何か良い方法はありませんでしょうか?

  • オブジェクトのシリアル化について

    serializableを使ってオブジェクトの入出力を2つのファイルで行ないたいのですが、出力の部分が分からなくて困っています。どなたか教えてください。プログラムは下のように書いてみました。 シリアル化のプログラム import java.io.*; public class serialin implements Serializable { public static void main(String[] args) throws Exception { //シリアル化して書き出す FileOutputStream fs = new FileOutputStream("output"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject("Hello"); os.close(); } } ------------------------------------------------- 復元のプログラム import java.io.*; public class serialout { public static void main(String[] args) throws Exception { //シリアル化ストリームを読み込んでオブジェクトを復元 FileInputStream fs = new FileInputStream("output"); ObjectInputStream os = new ObjectInputStream(fs); } }

    • ベストアンサー
    • Java
  • この問題の解説をお願いします。

    次のコードの実行結果は? ------------------------------------------------------------------------------ 01 : import java.io.*; 02 : 03 : public class CodeWalkSeven { 04 :   public static void main(String[] args) { 05 :     Car c = new Car("Nissan", 1500, "blue"); 06 : 07 :     System.out.println("before:" + c.make + " " + c.weight); 08 : 09 :     try { 10 :       FileOutputStream fs = new FileOutputStream("Car.ser"); 11 :       ObjectOutputStream os = new ObjectOutputStream(fs); 12 :       os.writeObject(c); 13 :       os.close(); 14 :     } catch (Exception e) { 15 :       e.printStackTrace(); 16 :     } 17 : 18 :     try { 19 :       FileInputStream fis = new FileInputStream("Car.ser"); 20 :       ObjectInputStream ois = new ObjectInputStream(fis); 21 :       c = (Car) ois.readObject(); 22 :       ois.close(); 23 :     } catch (Exception e) { 24 :       e.printStackTrace(); 25 :     } 26 : 27 :     System.out.println("after:" + c.make + " " + c.weight); 28 : 29 :   } 30 : } 31 : 32 : class NonLiving { 33 : 34 : } 35 : 36 : class Vehicle extends NonLiving { 37 :     String make = "Lexus"; 38 :     String color = "Brown"; 39 : } 40 : 41 : class Car extends Vehicle implements Serializable { 42 : 43 :   protected int weight = 1000; 44 : 45 :   Car(String n, int w, String c) { 46 :     color = c; 47 :     make = n; 48 :     weight = w; 49 :   } 50 : } ------------------------------------------------------------------------------ 実行結果 before:Nissan 1500 after:Lexus 1500 上記問題の解説でよくわからないとこがありますので、質問しました。 解説では、「書き込む前にCarオブジェクトに"Nissan"をセットしているが、Vehicleのコンストラクタにより初期化され、変数makeには初期値の"Lexus"がセットされる。」となっています。 私はコンストラクタはインスタンス化した際に実行される認識ですが、 この解説の記述ですと、21行目のCarクラスへのキャスト処理時にVehicleのコンストラクタが実行されているように受け取りました。 コンストラクタはキャスト時にも実行されるものなのでしょうか? もしそうであるならば、Javaの仕様書等に記載がある場合は、そのソースも教えていただけないでしょうか? 解説を読んでも納得いかずもやもやしています。 どなたかご回答お願いします。

    • ベストアンサー
    • Java
  • InputStream.skipメソッドについて

    下記のソースコードで import java.io.IOException; import java.io.FileInputStream; public class skip2 { public static void main(String[] args) throws IOException { FileInputStream fis = null; int i=0; char c; try{ fis = new FileInputStream("ファイル"); fis.skip(4); //ファイルへの読み書き/////////////////////////////////////////// while((i=fis.read())!=-1) { ///////////////////////////////////////////////////////////////// c = (char)i; System.out.print(c); } }catch(Exception ex){ // if any error occurs ex.printStackTrace(); }finally{ // releases all system resources from the streams if(fis!=null) fis.close(); } } } 123456789012345678901234567890という データがあった場合 fis.skip(4);で 結果が 56789012345678901234567890になります。 先頭4byteをスキップさせた後に 4byte読み込んで何かしらの処理を行い 4byteスキップを繰り返したいのですが やり方が分かりません。 理想は 出力前 123456789012345678901234567890 出力後 56783456123490 として、読み込んだ部分の処理を後で考える  としたいのですがどなたかお手数ですがアドバイス宜しくお願い致します。

    • ベストアンサー
    • Java
  • ストリームの問題について【至急】

    import java.io.*; public class FileStreamDemo { public static void main(String[] args){ try{ byte[] buffer=new byte[1024]; FileInputStream fileInputStream= new FileInputStream(new File(args[0])); FileOutputStream fileOutputStream= new FileOutputStream(new File(args[1])); System.out.println("コピーファイル: "+fileInputStream.available()+"バイト"); while(true){ if(fileInputStream.available()<1024){ int remain=-1; while((remain=fileInputStream.read())!=-1){ fileOutputStream.write(remain); } break; } else{ fileInputStream.read(buffer); fileOutputStream.write(buffer); } } fileInputStream.close(); fileOutputStream.close(); System.out.println("コピー完了"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println( "using:java FileStreamDemo src des"); e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } } JAVAの入門者です。 JAVAの教科書に書いてあるように、上のプログラムを書きましたけど… コンパイルすると、エラーメッセージが出て来ます。 エラー中身は下記のとおりです。 【using:java FileStreamDemo src des java.lang.ArrayIndexOutOfBoundsException: 0 at FileStreamDemo.main(FileStreamDemo.java:8) 】 どうすればいいのか悩んでいます。 誰か、助けていただけないのでしょうか?どこか間違ってるか、教えてください。 よろしく、お願いします。

  • exceptionの最大表示数は決められますか?

    きちんと例外をcatchしてないためか、 Java実行時にエラーがでるとかなり大量に出ます。 ただ、実際にエラーが発生した時に見たいエラーは、 以下のようにDOSプロンプトに出力される一番上のエラーだけの場合が殆どです。そこで思ったのですが、Exceptionが発生した所だけとかExceptionの表示数を指定するような事は可能でしょうか? java.io.FileNotFoundException: sc.xml (指定されたファイルが見つかりま at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:103) at java.io.FileInputStream.<init>(FileInputStream.java:66)