在RandomAccessFile .csv中读短片

时间:2016-04-12 07:52:42

标签: java csv randomaccessfile

我正在尝试在文件开头的3个短片中读取.csv文件。我需要阅读它们并且我设置了一个变量,但似乎没有提取正确的数据。

private short M = 0;
private short rootPtr = 0;
private short N = 0;
RandomAccessFile file;
private short[] TP; // array of TPs for one node
private String[] KV; // array of KVs for one node
private short[] DRP; // array of DRPs for one node
private int nodesRead; // iterator for nodes read
private int sizeOfDataRec; // stores size of data record: (M - 1) * (7) + 2

    // sets values from header record
    file.seek(0);
    M = file.readShort();
    rootPtr = file.readShort();
    N = file.readShort();
    sizeOfDataRec = (M - 1) * (7) + 2; // sets size of data record
    TP = new short[M];
    KV = new String[M - 1];
    DRP = new short[M - 1];

文件的前三个短片应该是05,11,22但是当我在这个位的末尾打印出M时我得到了12344

2 个答案:

答案 0 :(得分:1)

CSV文件是文本。它不包含短片,您不能期望在其上使用RandomAccessFile.readShort()。更有可能的是你应该使用Scanner.nextShort()等。

答案 1 :(得分:1)

来自RandomAccessFile#readShort

的Java文档
  

从此文件中读取已签名的16位数字。该方法读取两个   此文件中的字节,从当前文件指针开始。如果是两个   按顺序读取的字节是b1和b2,其中两个值中的每一个都是   在0到255之间(含),结果等于:

     

(短)((b1 <&lt; 8)| b2)

     

此方法阻塞,直到读取两个字节,即流的结尾   被检测到,或者抛出异常

现在让我们看看你的案例中发生了什么,假设你正在阅读的第一个短值是05

readShort 读取两个字节时,它将读取0为48,将5读为53(记住ASCII码),然后将上述公式应用于其中

(48 << 8) | 53 = 12288 + 53 = 12341

所以你在短变量中看到了这些值。

您应按照EJP

的建议使用Scanner#nextShort