Javaでオブジェクトをバイナリファイルに書き込むことは可能ですか?私が書きたいオブジェクトは、String
オブジェクトの2つの配列になります。これを実行したい理由は、永続データを保存するためです。これを行う簡単な方法があれば、私に知らせてください。
5 に答える
あなたは出来る
- 配列、または配列を含むクラスをシリアル化します。
- JSON、XML、CSVなどのフォーマットされた方法で配列を2行で記述します。
これが最初のコードです(キューを配列に置き換えることができます) Serialize
public static void main(String args[]) {
String[][] theData = new String[2][1];
theData[0][0] = ("r0 c1");
theData[1][0] = ("r1 c1");
System.out.println(theData.toString());
// serialize the Queue
System.out.println("serializing theData");
try {
FileOutputStream fout = new FileOutputStream("thedata.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(theData);
oos.close();
}
catch (Exception e) { e.printStackTrace(); }
}
デシリアライズ
public static void main(String args[]) {
String[][] theData;
// unserialize the Queue
System.out.println("unserializing theQueue");
try {
FileInputStream fin = new FileInputStream("thedata.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
theData = (Queue) ois.readObject();
ois.close();
}
catch (Exception e) { e.printStackTrace(); }
System.out.println(theData.toString());
}
2つ目はもっと複雑ですが、人間であるだけでなく、他の言語でも読めるという利点があります。
XMLとしての読み取りと書き込み
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.*;
public class XMLSerializer {
public static void write(String[][] f, String filename) throws Exception{
XMLEncoder encoder =
new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream(filename)));
encoder.writeObject(f);
encoder.close();
}
public static String[][] read(String filename) throws Exception {
XMLDecoder decoder =
new XMLDecoder(new BufferedInputStream(
new FileInputStream(filename)));
String[][] o = (String[][])decoder.readObject();
decoder.close();
return o;
}
}
JSONとの間
Googleには、JSONとの間で変換するための優れたライブラリがhttp://code.google.com/p/google-gson/ にあります。オブジェクトをJSOnに書き込んでから、ファイルに書き込むことができます。読むには反対のことをします。
シリアル化以外の1つの可能性は、オブジェクトをXMLファイルに書き込んで、人間が判読できるようにすることです。XStream APIはこれに対応しており、シリアル化と同様のアプローチを使用します。
Javaのシリアル化メカニズムを使用してこれを行うことができますが、シリアル化はオブジェクトの長期永続ストレージに適したソリューションではないことに注意してください。この理由は、シリアル化されたオブジェクトがJavaコードと非常に緊密に結合されているためです。プログラムを変更すると、シリアル化されたデータファイルはJavaコードとの互換性がなくなるため、読み取り不能になります。シリアル化は、一時的なストレージ(たとえば、ディスク上のキャッシュ)またはネットワークを介したオブジェクトの転送に適しています。
長期保存の場合は、Javaコードと緊密に結合されていない、標準的で十分に文書化された形式(XML、JSONなど)を使用する必要があります。
何らかの理由で絶対にバイナリ形式を使用したい場合は、GoogleプロトコルバッファやHessianなどのいくつかのオプションを利用できます。
クラスではなくオブジェクトを書く必要がありますよね?クラスはすでにバイナリ.classファイルにコンパイルされているためです。
ObjectOutputStreamを試してください。例があります
http://java.sun.com/javase/6/docs/api/java/io/ObjectOutputStream.html
文字列の配列を記述したい場合は、テキストファイルを使用したほうがよい場合があります。テキストファイルを使用する利点は、簡単に表示、編集でき、システム内の他の多くのツールで使用できることです。つまり、これらのツールを自分で作成する必要はありません。
また、XMLやJSONを使用するよりも、単純なテキスト形式の方が高速でコンパクトになることもわかります。注:これらの形式は、複雑なデータ構造に役立ちます。
public static void writeArray(PrintStream ps, String... strings) {
for (String string : strings) {
assert !string.contains("\n") && string.length()>0;
ps.println(strings);
}
ps.println();
}
public static String[] readArray(BufferedReader br) throws IOException {
List<String> strings = new ArrayList<String>();
String string;
while((string = br.readLine()) != null) {
if (string.length() == 0)
break;
strings.add(string);
}
return strings.toArray(new String[strings.size()]);
}
あなたが
String[][] theData = { { "a0 r0", "a0 r1", "a0 r2" } {"r1 c1"} };
これにより、
a0 r0
a0 r1
a0 r2
r1 c1
ご覧のとおり、これは編集/表示が簡単です。
これにより、文字列に何を含めることができるかについていくつかの仮定が行われます(アセットを参照)。これらの仮定が有効でない場合は、これを回避する方法があります。