質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.28%

  • Java

    10819questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

DataInputStreamについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 77

SweetSugar

score 6

こんにちは。
いつもお世話になっておりますSweetSugarと申します。

本日はバイナリデータをDataInputStreamクラスを使って読み込む時の考え方について質問があります。

以下に私の書いたコードがあります。
以下のコードはバイナリデータを2byte単位で扱うためのコードです。
以下の様にbyte配列を定義してread()を使うと、次にread()をしても一回目のread()と同じ部分を読み込んでいるように考えられます。
私が行いたい処理は、「2byte読み込んだら次の2byteを読み込む」という処理を逐次行いたいというものです。

byte配列を定義しているのはバイトオーダーをリトルエンディアンで扱いたいためです。ですが、リトルエンディアンの処理も頭を悩ませています。

お忙しいところ申し訳ございませんが、
1. 「2byte読み込んだら次の2byteを読み込む」ための処理のコード
2. 読み込んだbyteデータをリトルエンディアンで扱うための方法

をご教授いただきたく思います。

よろしくお願いいたします。

public void TestMethod( File file ) {
    InputStream input_stream             = null;
    BufferedInputStream buffer_stream    = null;
    DataInputStream data_input_stream    = null;

        try {
            input_stream        = new FileInputStream( file );
            buffer_stream       = new BufferedInputStream( input_stream );
            data_input_stream   = new DataInputStream( buffer_stream )

            //1回目の読み取り*************************************************************************************        
            //2byteを読み込むためにサイズが2のbyte配列を定義
            byte[] b_first = new byte[ 2 ];

            int read_first = data_input_stream.read( b_first );

            if( read_first != 2 ) {
                throw new IOException( "When you read byte data, IOException Error occured." );
            }

            //debug code
            System.out.printf( "%04X", read_first );
            System.out.println("");


            //2回めの読み取り*************************************************************************************            
            //2byteを読み込むためにサイズが2のbyte配列を定義
            byte[] b_second = new byte[ 2 ];

            int read_second = data_input_stream.read( b_second );

            if( read_second != 2 ) {
                throw new IOException( "When you read byte data, IOException Error occured." );
            }

            //debug code
            System.out.printf( "%04X", read_second );
            System.out.println("");

            //*************************************************************************************
            input_stream.close();
            buffer_stream.close();
            data_input_stream.close();

        } catch( FileNotFoundException e ) {

            System.out.println( "File Reading Error" );
            System.out.println( e );

        } catch( IOException e ) {

            System.out.println( "IOException" );
            System.out.println( e );

        } finally {

        }
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

「2byte読み込んだら次の2byteを読み込む」ための処理のコード

readメソッドを使ったときに読み込まれたデータが格納されるのは引数に指定したbyte配列であるb_firstの方であり、戻り値はreadメソッドで読み込めたバイト数が返ります。その取り扱いを勘違いしているだけでは。

  ×   System.out.printf( "%04X", read_first );
  ○   System.out.printf( "%02X%02X", b_first[1], b_first[0] );

2回目のreadでは、b_secondには次の2バイトが入っているはずです。

読み込んだbyteデータをリトルエンディアンで扱うための方法

必ず2バイトずつ読み込むのであれば、逐次それをひっくり返すだけでもいいような気はしますが、敢えて何かしらJavaの機能を用いるのならByteBufferを使ったらどうでしょうか?こんな感じ。

    ByteBuffer buf = ByteBuffer.wrap(b_first);
    buf.order(ByteOrder.LITTLE_ENDIAN);

    //debug code
    System.out.printf("%04X", buf.getShort());
    System.out.println("");

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/10 00:52

    keicha_hrsさん

    夜分遅くにも関わらず、早速のご回答ありがとうございます。

    コードの変更を早速試させていただきました。
    keicha_hrsさんのご尽力により私の意図した出力を得ることができました。
    read()について理解が及んでいなかった様です。
    実行結果は意図したものとなりましたが、レビューのためにもう一度APIリファレンスを確認いたします。

    また、リトルエンディアンについても私の意図した出力を得ることができました。

    この度は、迅速なご回答並びに貴重なご意見誠にありがとうございました。
    今後ともよろしくお願いいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.28%

関連した質問

同じタグがついた質問を見る

  • Java

    10819questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。