我有一个包含高程的地形数据,如下所示
每个文件包含 1,440,000 行
.
.
.
183
192
127
.
.
.
我怎样才能直接从文件中访问特定的行,而不会浪费完整的数据内存负载?(在安卓中)
我有一个包含高程的地形数据,如下所示
每个文件包含 1,440,000 行
.
.
.
183
192
127
.
.
.
我怎样才能直接从文件中访问特定的行,而不会浪费完整的数据内存负载?(在安卓中)
我相信您最好的选择是将文本文件转换为 SQLite 数据库。
您可能想要使用 BufferedInputStream:http: //developer.android.com/reference/java/io/BufferedInputStream.html
如果您可以将文件更改为二进制格式,您可以直接寻找您想要的位置并读取您需要的值。如果不是,您可能必须逐行读取并返回您想要的行(假设您无法计算字节位置,因为行可以具有不同的长度)。
在玩了太久之后,我得到了这个(虽然它未经测试):
File f = new File ("yourfile.txt");
HashMap <Integer, String> result = readLines(f, 1, 5, 255);
String line5 = result.get(5); // or null if the file had no line 5
private static HashMap <Integer, String> readLines(File f, int... lines) {
HashMap<Integer, String> result = new HashMap<Integer, String>();
HashSet<Integer> linesSet = new HashSet<Integer>();
for (int line : lines) {
linesSet.add(Integer.valueOf(line));
}
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8"));
int line = 1; // starting at line 1
String currentLine = null;
while ((currentLine = br.readLine()) != null) {
Integer i = Integer.valueOf(line);
if (linesSet.contains(i))
result.put(i, currentLine);
line++;
}
} catch (FileNotFoundException e) {
// file not found
} catch (UnsupportedEncodingException e) {
// bad encoding specified
} catch (IOException e) {
// could not read
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// ignore.
}
}
}
return result;
}
我认为,您可以使用 java.nio.FileChannel.read(buffers, start, number)。
start 表示起始偏移量,number 是要读取的字节数。
如果记录是固定长度的,您可以计算并直接转到所需记录的字节位置。
如果记录是可变长度的,但包含非常大文件的顺序标识信息(例如记录号),则可能值得根据平均记录长度猜测起始位置,在此之前寻找一点,然后向前阅读以找到所需的行(如果您已经过去了一点)。
如果除了从头开始计数之外没有其他方法可以识别记录,您将不得不这样做。理想情况下,您会以一种不会在扫描期间创建对象然后让垃圾收集器清理它们的方式来做这件事......