我有一个包含数千行数据的文本文件,如下所示:
38.48,88.25
48.20,98.11
100.24,181.39
83.01,97.33
...并且列表继续进行(数千行就是这样)。
我想出了如何使用 FileReader 和扫描程序将这些数据分成可用的令牌,但这种方法太慢了。
我创建了以下分隔符: src.useDelimiter( “| \ n”);
然后使用扫描器类nextDouble()来获取每个数据。
我做了很多研究,看起来解决方案是使用 MappedByteBuffer 将数据放入内存并在那里访问它。问题是我不知道如何使用MappedByteBuffer将这些数据分成可用的令牌。
我找到了这个网站:http://javarevisited.blogspot.com/2012/01/memorymapped-file-and-io-in-java.html - 这有助于我将文件映射到内存中,它解释了如何读取文件,但看起来数据是以字节或二进制形式返回的?我试图访问的文件是ascii,我需要能够以ascii的形式读取数据。任何人都可以解释如何做到这一点?有没有办法扫描映射到内存中的文件,就像我使用以前的FileReader方法使用扫描仪一样?或者还有另一种方法会更快吗?我目前的方法需要花费近800倍的时间。
我知道有些人可能会说我正在尝试重新发明轮子,但这是为了学术目的,因此,我不允许使用外部库。
谢谢!
答案 0 :(得分:0)
MappedByteBuffer
是ByteBuffer
的子类,您可以在其中调用asCharBuffer
。这将返回一个CharBuffer
,它实现Readable
,然后可以将其提供给Scanner
。
这样,您可以通过Scanner
对文件使用MappedByteBuffer
。这是否让它表现得更快我不知道。
答案 1 :(得分:0)
要将数据加载到内存中,您可以像以前一样使用扫描仪,然后将每行存储在列表中,如下所示。
List<Pair> data = new ArrayList<Pair>();
其中Pair被定义为
class Pair {
private final double first;
private final double second;
public Pair(double first, double second) {
this.first = first;
this.second = second;
}
....
}