2016-04-12 5 views
-2

Я пытаюсь читать в CSV-файле с тремя шортами в начале файла. Мне нужно прочитать их, и я устанавливаю переменную, но, похоже, не тянет нужные данные.Чтение в шортах в RandomAccessFile .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]; 

Первые 3 шорты файла должен быть 05,11,22, но я получаю 12344, когда я распечатать M в конце этого бита

+0

Я предлагаю использовать библиотеку для чтения файла CSV, если у вас нет никаких ограничений. (https://commons.apache.org/proper/commons-csv/) – dumitru

ответ

1

От Java Docs из RandomAccessFile#readShort

Читает подписал 16-разрядное число из этого файла. Метод читает два байта , начиная с текущего указателя файла. Если два байта чтения, в порядке, является b1 и b2, где каждый из двух значений от 0 до 255 включительно, то результат будет равен:

(короткий) ((b1 < < 8) | b2)

Этот метод блокируется до тех пор два байта не считываются, конец потока обнаруживается, или исключение

Теперь давайте посмотрим, что происходит в вашем случае, предположим, что первое короткое значение, которое вы читаете, - 05

когда readShort читает два байта будет считана 0 до 48 и 5, 53 (помните ASCII-коды) и затем применяет вышеупомянутую формулу к ней, которая дает

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

Таким образом, вы видите эти значения в ваших коротких переменных.

Вы должны использовать сканер # nextShort как предложено EJP

+0

Сканер не совместим с RandomAccessFile, не так ли? – user3038573

+0

Нет, это не так. вы должны прочитать его последовательно с помощью объекта Scanner – Sanjeev

1

Файл CSV является текст. Он не содержит шорт, и вы не можете рассчитывать на использование RandomAccessFile.readShort(). Более вероятно, вы должны использовать Scanner.nextShort() и т.д.

+0

Хорошо. Итак, я делаю Scanner в качестве буферизованного считывателя для файла? – user3038573