JavaのRandomAccessFileについて教えてください

このQ&Aのポイント
  • Javaの構造体の代わりにRandomAccessFileを使用してバイナリファイル内の任意の位置に読み書きできます
  • 各フィールドをByte配列に配置する必要があるため、面倒ですが、他の言語のようなフィールドの塊を一気に読み書きする方法はありません
  • RandomAccessFileを使用することで、任意の位置にデータを書き込んだり読み出したりすることができます
回答を見る
  • ベストアンサー

JavaのRandomAccessFileについて教えてください。

お世話になります。  Java(アプレットとして使用しています。)を最近から勉強し 始めました。  現在、作成しようとしているプログラムは、C言語で言うところの 構造体の項目をバイナリファイル内の任意の位置に読み書きしたいと 思っております。  現在、Javaでは、構造体の概念が見当たらなかったので、 Classで各フィールドを定義して、各フィールドの値を ByteBufferでByte配列に配置して、RandomAccessFileでこの配列の内容を書き込んだり、この逆の方法で 読み出したりしています。  この方法だと、各フィールドをわざわざ一つ一つByte配列に 配置しなければならず、面倒です。  他の言語の構造体やレコードの概念の様にフィールドの塊を 一気にランダムファイルに簡単に読み書きする方法は有りませんでしょうか?  ご存知の方がいらっしゃいましたら、ご教示の程、是非よろしくお願いします。

  • maigo
  • お礼率35% (37/103)
  • Java
  • 回答数1
  • ありがとう数1

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

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

おそらくそのような方法はないと思います。 Javaのオブジェクトが実際にどのような配置になっているかは処理系依存で、 たとえばフィールドが定義した順番に並んでいるとも限らないですし、 C言語のようにアドレスが丸出しになっていないということもあります。 C言語でも構造体をfwriteで書き出してしまうと移植性が犠牲になりますから、 構造体のメンバをひとつひとつ出力するほうが望ましいとは言われます。 ましてや安全性にとくに気を使っているJavaにそのような機能がないのは致しかたないように思います。 もしオブジェクトを手軽に丸ごと保存したいようならシリアライズが使われます。 「フィールドの塊を一気にランダムファイルに簡単に読み書きする」というのを見る限り、もしかしたらお求めのものはシリアライズなのかもしれません。 そうではなく、どうしてもバイナリファイルの読み書きが面倒であれば、 リフレクションでフィールドを動的に調べて自動的に読み書きすることはできなくもないでしょう。 とはいえ、RandomAccessFileで読み書きするのはごく妥当な方法だと思います。

maigo
質問者

お礼

 早速の回答ありがとうございます。  確かにそうですね。  Javaでは一般的にその様な方法が無いと言う事が判って、 すっきりしました。  あまりアクロバティックなことは避けたいので、単純な配列で 扱える様なデータの構造になるように仕様を検討しなおしてみます。  どうもありがとうございました。  まずは、お礼まで。   

関連するQ&A

  • Cの構造体のデータのbyte配列をjavaのclassに入れるには

    サーバーからCの構造体のデータをbyte配列で受け取ったものをjavaのclassに入れるにはどうすればよいでしょうか? クライアントプログラムがCなら受け取ったデータをそのまま構造体にコピーすれば終わりなのですが(サーバーもクライアントもx86なのでendianを気にする必要が無い)、java で簡単に書く方法が分からないので、今はbyte配列から1バイトづつ読みだして、classのメンバーに代入しています。もっとスマートな書き方はないでしょうか?

  • Javaには、構造体はないんですか?

     C言語の構造体みたいなのはないんですか? 野球のデータを扱っているのですが、構造体がないのでできません。 打率の順位をソートしたいのですが、Cでは構造体でソートすれば選手名まで全部ソートできたのですが。。。 Javaでは、いちいち選手名、打率などの配列を作っているのですが、打率をソートしてから選手名と一緒に表示しようとしても打率の配列だけ、ソートしてあり選手名の配列と打率の配列があいません。 要するに、打率の配列はソートし、選手の配列はデータを入力したときのままなので、順番が違っているのです。 うまい方法を教えてください。初歩的な質問でごめんなさい。

    • ベストアンサー
    • Java
  • Javaの配列について

    お世話になります。 Javaでは配列は基本型ではなくオブジェクト型(参照型)だということなのですが(実際equals()やtoString()などを持っている)、配列に他のクラスやインターフェイスを継承させる方法はあるのでしょうか?例えば配列にSerializableをimplementsさせて、他のクラスのインスタンスのように直接ファイルに読み書きできるようにすることは、可能なのでしょうか? よろしくご教授ください。

    • ベストアンサー
    • Java
  • Javaでのエンディアン変換

    こんばんは☆ Javaでのエンディアン変換をご教授ください。 ファイルを読み込み、ソケット通信でサーバへデータ送信しています。 リトルエンディアンで送らなければいけないのですが、 Javaはプラットフォーム問わずにビッグエンディアンでメモリに格納するとありました。 そこで、バイトオーダーをしようと思い、 stirlingというバイナリエディタでバイナリファイルを作成して以下の2点で試しました。 <バイナリファイル構造体> struct stest { LONG l1; LONG l2; LONG l3; LONG l4; }; <バイナリデータ(数値)> 1234 (010000020000030000040000)←バイナリエディタで見たとき <テスト1結果> ・・・new InputStreamReader(in, "UnicodeLittle"); >1000200030004000 <テスト2結果> ByteBuffer buffer = ByteBuffer.wrap(bt); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.get(); >1000200030004000 これはリトルエンディアンなのでしょうか? どちらも、 Javaで読み込み時にエンディアン指定しない時と出力結果に違いがありませんでした。 なぜでしょうか? ちなみに、データ型を意識せずに変換したいです。 色々と調べたのですが、良く分かりません。 どなたかご教授お願いいたしますm(_ _)m

    • ベストアンサー
    • Java
  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • Javaのオブジェクトのソート方法について

    Javaに関する質問です。 配列を用いてオブジェクトをつくり、そのフィールドの内容を用いて配列のオブジェクトをソートしたいのですが、どのようにプログラミングをすればよいのでしょうか? 方法をご存知の方がおりましたら、解答よろしくお願いします。

    • ベストアンサー
    • Java
  • ファイルの中身

    現在C言語を勉強中です。テキストファイルの読書き パイナリーファイルの読書き、構造体の保存方法まではなんとか理解できたのですが。  mdbファイル(Access)やリッチテキストファイルの中身はいったいどうなっているのですか。データ構造はいったいどうなっているのでしょうか。まったく想像もつきません。ファイルの中身の調べ方等教えてください。 漠然とした質問で申し訳ないのですがよろしくお願いします。

  • JavaとHTMLについて

    Java初心者です。アプレットを使ってプログラムしています。HTMLには<applet> のタグをつかってclassファイルをHTMLの中に取り込みますが、他の方法もあるのでしょうか?<embed><object>とかも無理して使えるのでしょうか?Web上でJavaを扱う際に、アプレット以外の方法があれば知りたいのですが。また、そういったものを調べるのに適したサイトや書籍をお教え下さい。お願いします

  • Java バイナリデータの扱い

    既出でないことを確認してみたつもりです。 <やりたいこと> 1.バイナリデータに埋め込まれたデータを読み込みたい。 2.バイナリデータの並びは例えば double d1,d2; char buffer[256]; int i1, i2; などとなっていてファイルヘッダとして同じフォーマットのファイルには全て埋め込まれています。これを読み込みたいです。 <質問> C言語であれば例えば構造体を定義してやって構造体のポインタに対して ヘッダの読み込みを行ってやれば上記のdoubleなどの変数は参照できる ようになりますが、Javaで同等の処理をやろうとするとどうすれば 良いのかわかりません。 良い方法があれば教えて下さい。宜しくお願いします。

    • ベストアンサー
    • Java
  • Javaの配列の宣言方法のメリット?

    1週間ほど前からJavaを独学している者です。 C言語をその前からやっていて、初心者レベル程度ならわかると思います。 そこで、質問です。 C言語の配列宣言:   int array[10]; Javaの配列宣言:   int array[] = new int[10]; 二つの言語とも、要素10個のarray1次元配列変数を宣言していると思います。 C言語の書き方はシンプルなので、納得がいきますが、Javaの方はどうしてこの形で宣言をするのかわかりません。(自分が言語製作者ならシンプルな書き方を採用します) だから、このような宣言の方法をとるということは何か理由があるのだと思います。 自分が思うところ、JavaはC言語より、柔軟で多機能だとおもうので、その影響で汎用性をますために、 長くなっているのかな~?と思っています。 こんごJavaの学習を進めていくと、例えば、   int array[] = new double[10]; //←エラーになりました みたいに型のちがう、宣言が出てきたりするのでしょうか? ちらっと、学習に使っている本をみたところ、動的配列の作成は別の操作で実現しているようなので、 「動的とは関係ないのかな?」と思っています。 長くなりましたが、Javaの配列宣言のメリットを教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう