私が提案するつもりな方法は、ファイルを読み込み、位置を追跡することです。あなたは後でそれを見ることができるように地図の途中で位置を保存します。
これを行うための最初の方法は、DataInput
として、あなたのファイルを使用して、今、あなたのデータが保存されているかRandomAccessFile#readline
RandomAccessFile raf = new RandomAccessFile("filename.txt", "r");
Map<String, Long> index = new HashMap<>();
を使用することですか?行ごとに格納され、エコーがDataInput
標準に準拠する場合は、使用することができます。
long start = raf.getFilePointer();
String line = raf.readLine();
String key = extractKeyFromLine(line);
index.put(key, start);
いつでも戻ってデータを取得する必要があります。ここで
long position = index.get(key);
raf.seek(position);
String line = raf.readLine();
完全な例です:
package helloworld;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;
/**
* Created by matt on 07/02/2017.
*/
public class IndexedFileAccess {
static String getKey(String line){
return line.split(":")[0];
}
public static void main(String[] args) throws IOException {
Map<String, Long> index = new HashMap<>();
RandomAccessFile file = new RandomAccessFile("junk.txt", "r");
//populate index and read file.
String s;
do{
long start = file.getFilePointer();
s = file.readLine();
if(s!=null){
String key = getKey(s);
index.put(key, start);
}
}while(s!=null);
for(String key: index.keySet()){
System.out.printf("key %s has a pos of %s\n", key, index.get(key));
file.seek(index.get(key));
System.out.println(file.readLine());
}
file.close();
}
}
junk.txt
は含まれています
dog:1, 2, 3
cat:4, 5, 6
zebra: p, z, t
最後に出力されます:
key zebra has a pos of 24
zebra: p, z, t
key cat has a pos of 12
cat:4, 5, 6
key dog has a pos of 0
dog:1, 2, 3
これには多くの注意点があります。たとえば、より堅牢なエンコーディングが必要な場合は、初めてエンコーディングを管理するリーダーを作成し、入力ストリームとしてRandomAccessFile
を使用するだけです。線が大きすぎるとreadLine()
メソッドが失敗します。次に、キー/データのペアを抽出する独自の戦略を考案する必要があります。
ヒント: 'HashMap'が便利です。 –
@BackSlash索引を作成するためにファイルを読むのは一度だけですので、問題はありません。私が必要とするのは、特定のバイトにジャンプするためのインデックス(バイト単位)を構築することです。 あなたが言った質問は複製されていますが、このインデックスを作成する解決策はありません。 –
@ジャッキー私はそうだと思いますが、特定のバイトにアクセスする方法がわかりません。 –