• ベストアンサー

for文を使わずバイナリファイルから目的のデータを読む方法

バイナリファイルを読み込んで、目的のデータまでfor文を使っているのですが、もっと効率良く目的のデータを読むことはできないのでしょうか? for (int a=0 ; a < 36 ; a++) { bytedata = (byte)fi.read(); } よろしくお願いします。

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

  • ベストアンサー
回答No.4

これでどうですか? FileInputStream fi = new FileInputStream("a.dat"); fi.skip(4*35); // int のバイト数(4) * 読み飛ばす要素数 int data = fi.read(); System.out.print(Integer.toHexString(data)); * オマケ BufferedInputStream を使って以下のようにファイルを開いた方が速くなるかも知れません。(これ以上の読み書きをする場合は特に)。 BufferedInputStream fi = new BufferedInputStream(new FileInputStream("a.dat"));

kemonoqoo
質問者

お礼

ご返送ありがとうございます。 いろいろ実験してみて納得のいくものが作れました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.3

何度も申し訳ありません。訂正させてください。 >byte[] data = new byte[36]; >data = fi.read(data); byte[] data = new byte[36]; int ret = fi.read(data);

全文を見る
すると、全ての回答が全文表示されます。
  • covachan
  • ベストアンサー率38% (46/120)
回答No.2

要件はバイナリファイルの先頭から36bytes読み込む。 ですよね? ならば、普通に byte[] data = new byte[36]; data = fi.read(data); でいいのではないですか?

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

fiというのはFileInputStreamでしょうか? それだったら、skip()メソッドが使えると思います。 使い方はJavaのドキュメントを見てください。 ちなみに、 InputStream系のクラスが使いにくければ、 RandomAccessFileの使用を考えてもいいかもしれません。

kemonoqoo
質問者

お礼

早々のお返事ありがとうございます。 skip()メソッドを調べたのですが、使い方がいまいちよくわかりませでした。 ------------------------------------------------- int data; //ファイルをオープンする FileInputStream fi = new FileInputStream("a.dat"); //36バイト目まで読み込む for (int a=0;a<36;a++) { data = fi.read(); } //36バイト目を表示する System.out.print(Integer.toHexString(data)); ------------------------------------------------- この場合forを使わずにskipを用いるにはどのようにすればよいのでしょうか? よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの

    VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいのですが、 例えば、"A"が一文字のみのShift-JIS もしくはunicodeのテキストファイルを作るため、 (下記の確認はShift-jis で行っています。) Dim ByteData As Byte ByteData = AscW("A") Open "C:\A.txt" For Binary Access Write As #1 Put #1, 1, ByteData Close #1 としました。 できあがったファイルをバイナリエディタで確認すると、  41 となっています。 (Unicode は 41 00 2バイト文字でリトルエンディアンのため) この41は、"A" の文字コード(Shift-JIS)「65」の16進表記です。 この「41」という値を使ってバイナリモードでテキストファイルを作成したいのですが、 どのようにすればよいでしょうか? 上記 Put #1, 1, ByteData の部分を、 1.Put #1, 1, 41 としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「29 00 20 20」でした。 文字コード00 に該当する文字がないためだと思います。 2.Put #1, 1, "41" としたところ、「41 」(バイナリモードで 「34 31 20 20」) (41の後ろは半角空白) で×でした。 3.Put #1, 1, CLng("&H" & 41) としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「41 00 00 00」でした。 4.ByteData = CLng("&H" & 41) Put #1, 1, ByteData これでやっとできました。 この他にも方法があるのか?と思い、質問させていただきました。 ご指導よろしくお願いいたします。

  • バイナリファイルでOutOfMemoryエラー

    お世話になります。 ブラウザ画面からファイルをアップロードし、そのバイナリデータを返すメソッドを作成したのですが、約50MB以上のファイルを使用するとOutOfMemoryエラーとなりJava heap spaceが足りないといわれてしまいます。ヒープサイズをあげればエラーはしなくなるとはおもいますが、根本的な解決にはならないと思います。 public byte[] upload(FormFile ff) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream is = ff.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); byte[] byteData; try { int data = 0; byte[] buffer = new byte[1024]; while ((data = bis.read(buffer) != -1) { baos.write(buffer, 0, data); } byteData = baos.toByteArray(); } catch (IOException e) { throw e; } finally { if (null != bis) { bis.close(); } } return byteData; } 以上のようなメソッドなのですが、おかしい点はありますでしょうか。 指摘していただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • iアプリでバイナリデータを16進数に変換する方法がわかりません。

    01234 56789 abcde こちらのデータを一旦、バイナリデータに圧縮して、 携帯端末でint型に変換する方法がわかりません。 10進数では上手くいきましたが、16進数では上手くいきません。 byte[] dbuf // 取得したデータ byte[] dttip = new byte[1]; int data = 0, pos = 0; for(int j = 0;j < 5;j++){ // 文字を配列に格納 for(int i = 0; i < 3;i++){     // ここでデータを1バイトずつ取得     dttip[0] = dbuf[pos]; data = byteChangeint(dttip[0]); if(data >= 48){ // ここでデータを取得 } else{ i--; } pos++; } public int byteChangeint(byte[] b){ int res = 0; res |= (int)(b[0]) & 0x000000FF; return res; } 16進数のデータを取得しようとした後、データの展開が上手くいきません。 よろしくお願いします。

  • ACCESS VBA でのバイナリデータ操作について

    ACCESS VBA でのバイナリデータ操作について いつも参考にさせていただいております。ありがとうございます。 テキストファイルがあるとし、 日本語(UTF-16 BE)で   あいう というデータとします。 バイナリモードで確認すると、 30 42 30 44 30 46 と表示されます。 この文字コードを使って文字を生成したいのですが、 http://support.microsoft.com/kb/404928/ja 上記を参照し、 ByteData = InputB(6, #1) ChrB(cint("&H" & Hex(ByteData(1)))) & ChrB(cint("&H" & Hex(ByteData(0)))) という方法で「あ」を生成させることはできたのですが、 全角空白があった場合、ただしくコードを取得させることができません。 たとえば、「あ う」(←[あ]と[う]の間が全角空白です)の場合、 バイナリモードで確認すると、 30 42 30 00 30 46 なのですが、「00」を取得することができず、 hex(ByteData(0)) = 30 hex(ByteData(1)) = 42 hex(ByteData(2)) = 30 hex(ByteData(3)) = 30 hex(ByteData(4)) = 46 となってしまいます。 なぜなのでしょうか? また、他によい方法はありますでしょうか? ご指導よろしくお願いいたします。

  • バイナリファイルの読み込みについて

    java初心者です。 今バイナリファイルの読み込みを行っているのですがバイナリファイルのデータの値とプログラムで読み込んだ値が違っているので困っています。 バイナリファイルはASCIIテキストになっていてデータを見ることができ中身は -0.00012 -0.00009 -0.00009 -0.00012 -0.00009 -0.00009 -0.00009 -0.00012 ・・・・・・・(値が続くという意味です) となっています。 作ったプログラムは import java.io.*; class a { public static void main(String[] args) { try { FileInputStream in = new FileInputStream("file name"); int ch; while ((ch = in.read()) != -1) { System.out.println(ch); } in.close(); } catch (IOException e) { System.out.println(e); } } } で作って読み込んでみたのですが出力された値は 45 48 46 48 48 48 49 50 ・・・・・・ になってしまいます。 どのようにしたら値が等しくなるのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • ループ文出力から バイナリファイルの作成方法

    for文でまわして求められた値をバイナリファイルに落としたく、下記のようなプログラムを書いたのですがうまくいきません。fwriteをretfunc中で行えばうまくいくと思うのですが、retfuncは実際は複雑なので、下位関数で計算だけを行い、mainでは戻り値を随時バイナリファイルに書き込むだけの処理にしたいです。 質問(1) 下記プログラムだとfor文がまわりません。勝手にループして欲しいだけなので引数はなくvoidとしてみましたが問題ないでしょうか? 質問(2)どうしたらループするでしょうか? 質問(3)fwriteの使い方はあってますか?サイズは1バイトで一個ずつの書き込みです。 ※参考書を元にやっているため体系的に理解してないことも多いです。 ご教授よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int retfunc (void) { int acnt,bcnt; int srout; for ( bcnt=0; bcnt<10; bcnt++) { for ( acnt=0; acnt<10; acnt++) srout=いろいろな処理; return srout ; } } main (int argc, char *argv[]) { int srout; FILE *FPo; FPo = fopen("out.bmp","wb"); if ( FPo == NULL ) { puts("Can't open out.bmp!"); return 1; } srout =retfunc(); fwite(&srout,1,1,fpo); }

  • VBAでバイナリデータが上手く読めない。

    VBAでバイナリデータが上手く読めない。 もともとC言語でバイナリデータを加工していた事をVBAでやる事になったのですが、上手く読めない。 <VBA> Open inputFileName For Binary As #mFileNo のようにオープンして、 <VBA> Dim a(800) As Byte Get #1, , a のように記述すればC言語のように取得出来ると思ったのですが、上手く取得出来ません。 なんとなく分かった事ですが、800バイトの中に改行文字があった場合、そこまでを変数aに入れるようにすると出来そうなので、Getで改行コードがあった場合はそこまでを読み込むみたいな手段はありますでしょうか。inputだとデータがまったく見れませんでしたのでGetにて対応したいと思っています。 宜しくお願い致します。

  • RubyでバイナリデータをIOストリームにする方法

    Rubyで、バイナリデータをIOストリームに変換する方法を探しています。 Railsで、データベースに格納された アップロード済のPDFファイル(バイナリデータ)を、 PDF::readで読み込んで処理したいのですが、 PDF::readは、ファイルパスかIOストリームしか受け付けてくれないようなのです。 よろしくお願いします。

  • javaで16進数のバイナリデータ4バイトを10進数に変換する方法

    今私が行なおうとしていることは、char型とbin型が混ざり合ったファイル(1レコード301バイト)から固定バイト部分(bin型の部分4バイト分)を切り取り、 テキストファイルで読み取れる数値(int、又はbouble)に変換・出力するという作業です。 FileInputStreamとDataInputStream.read()を使用し、全データをbyte[]で取得、対象固定バイト部分のbyte[]取得までは出来ました。 取得したbyte[]の値を見ると、16進数表記になっていました。ここで、1バイト分(byte[1])をintValueでintに変換する事はできましたが、 4バイト分(byte[4])の値を一気に10進数表記にしてint型で出力する方法がわかりません。 誰かわかる方はいらっしゃいますか?そもそもできないのでしょうか? またはもっと良い方法があれば教えていただきたいです。 補足としてですが、BufferedReaderでファイルを読込まなかったのは、bin型データ部分がたまたま改行コードになってしまうことがあり、readLine()で1行データ(301バイト分)を取得できないからです。 こちらの方法でも読込み・変換できるのでしょうか? 誰かわかる方がいらっしゃったらぜひ教えて下さい!

    • ベストアンサー
    • Java
  • javaバイナリ変換したデータのファイル出力

    現在、 String test_st = "0123456789abcdef"; というデータを byte[] bytes = test_st.getBytes("UTF-8"); このコードでバイナリ変換したのですが、このbytesに格納したバイナリデータたバイナリファイルとして出力したいのですが、どのようにしたらよいかご教授よろしくお願い致します。 BinaryFileWriter writer = new BinaryFileWriter(); このようなコードで出力できるとのサンプルもあったのですが、うまくいきません。 どうぞ、よろしくお願い致します。

    • ベストアンサー
    • Java
PX-M5041F エラーコード0xF3
このQ&Aのポイント
  • PX-M5041Fのエラーコード0xF3が表示されている場合、以下の対処方法を試してみましょう。
  • ヘッド周辺及びヘッド走査部を確認し、カセット給紙に対応した機種をご利用の場合はカセットを外して用紙詰まりがないか確認してください。
  • さらに、背面ユニットを外して背面ユニットおよびプリンター部に用紙詰まりがないか確認してみましょう。試してみたが改善されない場合は、修理をご検討ください。
回答を見る