投稿

ラベル(入出力ストリーム)が付いた投稿を表示しています

[Java] シリアライズとデシリアライズ

入出力ストリームを利用してインスタンスをファイルに書き出すことをシリアライズ、ファイルから読み込むことをデシリアライズと言います。 Serializableインターフェース Serializableインターフェースはシリアライズ、デシリアライズさせたいクラスに実装させるインターフェースです。 このインターフェースは、マーカーインターフェースといい、シリアライズするクラスであるということをJVMへ示すためだけのものです。メソッドは何も持っていません。 コード例 ここではidとnameというフィールドを保持するPersonクラスを定義し、Serializableインターフェースを実装しています。 import java.io.Serializable; public class Person implements Serializable { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "id:" + id + ", name:" + name; } } Serializableインターフェースはマーカーインターフェースであり、JVMがシリアライズ可能と判別するためのもの。メソッドは持たない。 シリアライズ ObjectOutputStreamクラス オブジェクトをシリアライズしてファイルに書き出すにはObjectOutputStreamクラスを使用します。 ObjectOutputStreamクラスのインスタンスを取得 ObjectOutputStreamクラスのコンストラクタは、FileOutputStreamクラスのオブジェクトを引数に取ります。 FileOutputStream fstream = new FileOutputStream("output/test.ser"); ObjectOutp

[Java] バイト入出力ストリーム

画像ファイルなどのバイナリーデータの入出力については、バイトストリームを扱うクラスが用意されています。ここでは、バイトストリームの入出力についてまとめていきます。 バイト入出力ストリーム FileInputStreamクラス ファイルからバイトストリームを読み込みます。 1. FileInputStreamクラスの主なメソッド byte read() ファイルから1バイト読み込むで返す。 byte[] readNBytes(int) ファイルから指定バイト数を読み込んで配列を返す。 byte[] readAllBytes() ファイルから全バイトを一度に取り出して配列で返す。大きなサイズのファイルの場合メモリを大量に使用するので、一般的にはreadNBytes(int)を使用する。 FileOutputStreamクラス バイトストリームをファイルへ出力します。 2. FileOutStreamクラスの主なメソッド void write(int) ファイルへ1バイト出力する。 void write(byte[]) ファイルへ複数バイトを出力する。 コードサンプル 以下の例はsample1.pngファイルを1024バイトずつ読み込んで、sample2.pngへコピーする例です。 FileInputStream fileInputStream = new FileInputStream("test/sample1.png"); FileOutputStream fileOutputStream = new FileOutputStream("test/sample2.png"); try ( fileInputStream; fileOutputStream; ) { byte[] data = null; while ((data = fileInputStream.readNBytes(1024)).length > 0) { fileOutputStream.write

[Java] 入出力ストリーム

Javaの入出力ストリームについてまとめていきます。 Fileクラス Fileクラスは、Java1.0の最初期からあるAPIで、ファイルやディレクトリのパスを表すクラスです。 あくまでパスを扱っているだけで、ファイルやディレクトリそのものを扱っているわけではない。 Fileオブジェクトの取得 コード例 File file = new File("output/data.txt"); この時オブジェクトはファイルパスを扱っているだけなので、output/data.txtの存在有無や書き込み権限にかかわらず、インスタンスを生成することが可能です。 Fileオブジェクトの主なメソッド boolean isFile() ファイルの場合にTrueを返す。 boolean isDirectory() ディレクトリの場合にTrueを返す。 long lastModified() ファイルの更新日付をUNIXタイムで返す。 String getAbsolutePath() ファイルの絶対パスを取得する。 String getCanonicalPath() ファイルの相対パスを取得する。 File[] listFiles() ディレクトリ配下のFileオブジェクトの配列を生成する。 File[] listFiles(FileFilter) FileFilter関数型インターフェースを引数に取り、条件に一致したFileオブジェクトの配列を生成する。 サンプル コード例 output配下の拡張子が「.txt」のファイル一覧を取得 ファイル名と最終更新日時を出力する File file = new File("output"); FileFilter filter = pathname -> pathname.getName().endsWith(".txt"); File[] files = file.listFiles(filter); Ar