- PR -

JDK1.1.8 InputStream.read()の不都合

1
投稿者投稿内容
タカギ
会議室デビュー日: 2001/10/15
投稿数: 3
投稿日時: 2001-10-15 21:17
JDK1.1.8で
InputStream.read(byte[],int,int)
での読み込みがおかしいという現象にあった方いませんでしょうか。
PersonalJAVAな実装での開発をしているのですが、不都合の発生条件などが絞れずに困っております。
シンプルなテストでは発生しないのでソースが長めになりますが、以下のようにヘッダーをあれこれ読み込んだあとに read(byte[],int,int) で画像ファイルを読み込もうとしたところ、
36行の呼び出しが、ループの途中で例外の発行も無く読みこぼしたりしてしまいます。
JDK1.3.1では発生しません。
38-40行のコメントアウトのように、引数なしのread()にすると正常に読み込めているようなのですが、正しい処置なのか不安です。
sunのサイトのバグレポートや各ウェブサイトを探して具体的な原因を探しているところなのですが、どうにも行き詰まった感がありまして、投稿してみた次第です。

やっていることは、readとskipでbmpを読み込んでバイト配列をprintしてるだけですが
intent os の ElateAppletViewerと
WindowsのJDK1.1.8のアプレットビュアと
WindowsのJDK1.3.1のアプレットビュアで
それぞれ出力結果が異なってしまいます。1.3.1では期待どおりの結果です。

1 import java.io.InputStream;
2 import java.io.IOException;
3 import java.applet.Applet;
4
5 public class Test5_s extends Applet {
7 public void init() {
9 int width = 128;
10 int height = 128;
11 byte[] image = new byte[128 * 128];
13 try {
14 InputStream istream = getClass().getResourceAsStream( "/hogehoge.bmp" );//128x128,8bit無圧縮なwindowsBMPファイル
15
16 istream.skip( 2 + 4+2+2 );
19 int b0 = istream.read();
20 int b1 = istream.read();
21 int b2 = istream.read();
22 int b3 = istream.read();
25 istream.skip( 4+4+4 + 2 + 2+4 + 4+4+4 + 4+4);
30 for( int i=0; i< 4*256; i++ )
31 istream.read();
32 // 実際はここまで(1078byte)にヘッダの読み込みをしています
33 for ( int y = 0; y < height; y++ ) {
34 int offset = height - y - 1;
35
36 istream.read( image, offset * width, width );
37
38 //for( int x = 0; x < height; x++ ){
39 // image[(offset*width)+ x] = (byte)istream.read();
40 //}
41 }
42 }
43 catch ( Exception e ) { e.printStackTrace(); }
44
45 System.out.println( "P2 128 128 256" ); // PGM HEADER
46 for( int i=0; i< image.length; i++ ){
47 System.out.println( image[i] & 0xff );
48 }
50 }
52 }

よろしくお願いいたします。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-10-16 00:05
お久しぶりです。今日やっと、大学のレポートの方が一段落したのでゆっくりと掲示板を見ることができるようになりました。学期末が近いので宿題がたてこんじゃうんです。

本題ですが、sunのバグデータベースを見るとInputStreamのread(byte[],int,int)はかなり問題があるみたいです。挙動不審な動きがあると色々とバグレポートが来ていました。APIドキュメントでも1.1.xから1.2以上になったとたんにコメントがかなり増えています。1.1.xよりも1.3以上を使った方が安定していると思います。

コメントではread()を使えば大丈夫だとありました。でもどうでしょうね。どこで見たか忘れてしまったのですが、read()はあまり使わないほうがいいって聞きました。(すみません。もしかしたら根も葉もないガセネタかもしれません)

1.3系のJavaを使ったほうがいいかもしれませんね。
タカギ
会議室デビュー日: 2001/10/15
投稿数: 3
投稿日時: 2001-10-17 22:58
実際に不安定でどうもバグも多そうというところまでわかっていたのですが、やはり、具体的なバグの情報や安全な回避方法はみつかりませんでした。
PersonalJAVAな実装ではInputStream周りの不都合は仕方ないということでしょうか。
うーん、PersonalJAVAってもう使ってる人いないのかなぁ・・・
1

スキルアップ/キャリアアップ(JOB@IT)