Javaでメモリのみを使用するカスタムファイル実装を作成する最も簡単な方法は何ですか
質問
ファイルを広範囲に使用して単一のデータオブジェクトを表すコードベースがあります。コードをリファクタリングして、データオブジェクトが明示的にjavaオブジェクトになり、基本的なファイルシステムとの相互作用がほとんど隠れるようになりました。ただし、ファイルを読み書きするいくつかの外部ツール(Wekaなど)を使用します。
理想的には、読み取りまたは書き込みのいずれかのために、メモリ内のバイト配列に支えられたこれらの他のライブラリに渡すことができるFileのサブクラスが必要です。
Google検索でメモリマップファイルが表示されましたが、ファイルシステムに実際のファイルが必要ないので、これは問題ではありません。すでに解決策がありますか、それともFileを自分でサブクラス化し、実際のファイルシステムを参照するすべてのメソッドをオーバーライドする必要がありますか?
解決
これは一般的に、本当に必要な場合を除いて、Fileを取得するメソッドを決して記述してはならない理由です。ライブラリは、任意のInputStreamを受け取るメソッドを提供していませんか?この場合、ByteArrayInputStreamまたはメモリから読み取る入力ストリームを渡すのは簡単です。
Fileのオーバーライドに関する問題は、あなたを助ける方法でオーバーライドできる可能性は低いということです。たとえば、ライブラリがFileInputStreamを使用してライブラリを開く場合、その時点でのバイトの送信元は、FileではなくFileInputStream実装によって実際に制御されます。
他のヒント
java.io.File
は基本的に、ファイルパスを表す String
のラッパーです( final
クラスである必要があり、しかしそこに行きます)。ですから、あなたはそのアプローチに不運です。もちろん、一時ファイルと「RAMディスク」にファイルを作成できます。
ByteArrayOutputStream とtoByteArray()メソッド、または ByteArrayInputStream とbyte []コンストラクター。 データがより複雑に表現されている場合は、インターフェイスを直接実装できます。
サードパーティが使用しているFileメソッドを見つけて、それらのカスタム実装を提供する必要があります。
java.io.FileオブジェクトはFileコンテンツの読み取り/書き込みを担当していないため、成功することはほぼ不可能です。
最良の方法は、コードをリファクタリングして、Fileオブジェクトに依存せず、そのファイルによって返されるバイト配列に依存させることです。
ファイルのサブクラスを作成できます。
public class InMemoryFile extends File {
public InMemody() {
super( "/dev/null" );
}
// find out what methods should be overwritten ?????
}