あなたのケースでは不可能なファイル全体の読み込みを避けるためにRandomAccessFile
、標準の java の代わりに aを使用することをお勧めしますFileInputStream
。では、メソッドをRandomAccessFile
使用してseek(long position)
、ファイル内の任意の場所にスキップして、そこから読み始めることができます。コードは次のようになります。
RandomAccessFile raf = new RandomAccessFile("path-to-file","rw");
HashMap<Integer,String> sampledLines = new HashMap<Integer,String>();
for(int i = 0; i < numberOfRandomSamples; i++)
{
//seek to a random point in the file
raf.seek((long)(Math.random()*raf.length()));
//skip from the random location to the beginning of the next line
int nextByte = raf.read();
while(((char)nextByte) != '\n')
{
if(nextByte == -1) raf.seek(0);//wrap around to the beginning of the file if you reach the end
nextByte = raf.read();
}
//read the line into a buffer
StringBuffer lineBuffer = new StringBuffer();
nextByte = raf.read();
while(nextByte != -1 && (((char)nextByte) != '\n'))
lineBuffer.append((char)nextByte);
//ensure uniqueness
String line = lineBuffer.toString();
if(sampledLines.get(line.hashCode()) != null)
i--;
else
sampledLines.put(line.hashCode(),line);
}
ここでsampledLines
は、ランダムに選択した行を最後に保持する必要があります。その場合のエラーを回避するために、ファイルの最後までランダムにスキップしていないことも確認する必要がある場合があります。
編集:最後に到達した場合に備えて、ファイルの先頭にラップしました。かなり簡単なチェックでした。
EDIT 2:を使用して、行の一意性を検証するようにしましたHashMap
。