为了避免在您的情况下可能无法读取整个文件,您可能希望使用 aRandomAccessFile
而不是标准 java 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
应该在最后保留您随机选择的行。您可能需要检查您是否还没有随机跳到文件末尾以避免在这种情况下出现错误。
编辑:我把它换到文件的开头,以防你到达结尾。这是一个非常简单的检查。
编辑 2:我通过使用HashMap
.