- PR -

固定長ファイルの作成

1
投稿者投稿内容
soccer
ベテラン
会議室デビュー日: 2003/09/17
投稿数: 99
投稿日時: 2004-01-08 18:42
Javaの初心者です。
Javaで固定長のファイルを作成したいのですが、
C言語のような構造体の概念はないのでしょうか?

もし、よければ簡単なサンプルのプログラムを提供していただければ有難いのですが・・・

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-01-08 18:59
引用:

soccerさんの書き込み (2004-01-08 18:42) より:
Javaの初心者です。
Javaで固定長のファイルを作成したいのですが、
C言語のような構造体の概念はないのでしょうか?

もし、よければ簡単なサンプルのプログラムを提供していただければ有難いのですが・・・



CでもJavaでも標準ではファイルは単純なストリームとしてでしか扱えないと思いますが、
どのような処理をお考えですか? 通常固定長のファイルというとデータをレコード単位で
扱えて、一レコードの長さが決まっているものを指すかと思いますが。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-01-09 01:44
引用:

C言語のような構造体の概念はないのでしょうか?


ちょっと誤解を招く言い方かもしれませんが、「Cの構造体に構造体のデータに対する
操作の関数を追加したものがJavaのクラスである」と一応説明しておきます。

# オブジェクト指向的な説明の仕方としては間違っていると思いますので、あくまで
# 便宜的な説明と捉えてくださいませ。

で、JavaにはCにおける構造体のようなデータ型はありませんが、メソッドを持たない
クラスを定義すれば似たようなものは作れます。

引用:

Javaで固定長のファイルを作成したいのですが、


固定長のファイルは、通常のJavaのI/Oを使えば出来るでしょう。
java.io.FileOutputStreamやjava.io.ByteArrayOutputStream等を参照してください。

で、疑問なんですが、Cの構造体と固定長ファイルって何か関係があるのでしょうか?
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-01-09 08:00
意図されているのは、C言語でいうところのこういう処理かも。
コード:
struct record {
	int id;
	double account;
};
struct record current;
/* 中略 */
fread(&current, sizeof(record), 1, fp);


この場合、Javaだと、DataOutputStreamを使ってこんなふうになるかと。
コード:
class Record {
	int id;
	double account;

	// 1.こういうメソッドを用意するか、
	void write(DataOutputStream os) throws IOException {
		os.writeInt(id);
		os.writeDouble(account);
	}

	// 2.あるいはこんなのを用意して、
	byte[] toByteArray() {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream buf = new DataOutputStream(baos);
		try {
			try {
				buf.writeInt(id);
				buf.writeDouble(account);
			} finally {
				buf.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	
		return baos.toByteArray();
	}
}

// ファイルオープンなどは略す。

// 1.を使う場合
current.write(os);	// os は DataOutputStream

// 2.を使う場合
os.write(current.toByteArray());



ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-01-09 08:03
一部間違ったので訂正します。
次の部分の最終行はfreadではなくて「fwrite」でした。
引用:

コード:
struct record {
	int id;
	double account;
};
struct record current;
/* 中略 */
fread(&current, sizeof(record), 1, fp);




soccer
ベテラン
会議室デビュー日: 2003/09/17
投稿数: 99
投稿日時: 2004-01-13 09:41
貴重な情報有難うございました。
1

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