0

我有一个包含数千行数据的文本文件,如下所示:

38.48,88.25
48.20,98.11
100.24,181.39
83.01,97.33

...并且列表继续进行(就像这样的数千行)。

我想出了如何使用FileReaderScanner将这些数据分成可用的令牌,但这种方法太慢了。

我创建了以下分隔符: src.useDelimiter(",|\n");

然后使用扫描器类 nextDouble() 来获取每条数据。

我做了很多研究,看起来解决方案是使用MappedByteBuffer将数据放入内存并在那里访问它。问题是我不知道如何使用 MappedByteBuffer 将这些数据分成可用的令牌。

我找到了这个网站: http: //javarevisited.blogspot.com/2012/01/memorymapped-file-and-io-in-java.html - 它可以帮助我将文件映射到内存并解释如何读取文件但看起来数据以字节或二进制形式返回?我试图访问的文件是 ascii,我也需要能够以 ascii 格式读取数据。谁能解释如何做到这一点?有没有一种方法可以像使用扫描仪和以前的 FileReader 方法一样扫描映射到内存中的文件?还是有另一种更快的方法?我目前的方法花费的时间几乎是它应该花费的时间的 800 倍。

我知道有些人可能会说我正在尝试重新发明轮子,但这是出于学术目的,因此我不允许使用外部库。

谢谢!

4

2 回答 2

0

要将数据加载到内存中,您可以像之前一样使用 Scanner,然后将每一行存储在一个列表中,如下所示。

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;
  }   
  ....
}
于 2013-05-09T20:28:25.843 回答
0

MappedByteBufferByteBuffer您可以调用的子类asCharBuffer。这将返回一个CharBufferwhich implements Readable,然后可以将其提供给Scanner.

这样您就可以Scanner通过MappedByteBuffer. 我不知道这是否使它执行得更快。

于 2013-05-09T20:15:26.667 回答