randomaccessfile с java

Я пытаюсь прочитать целые числа из текстового файла. Этот файл имеет следующий текст:

3 1.9 a2 8 9
1 3 5.6 xx 7
7.2 abs 7  :+  -4
5
ds ds ds

Я использую randomAccessFile с java. Когда я пытаюсь прочитать первый int, я получаю 857747758 (я написал int number1 = inputStream.nextInt();, а также и другие, подобные этому, для других int в txt-файле). мне сказали, что длина равна 59. Я мне просто интересно, почему он дает мне это большое число, а не только 3? Кроме того, куда мне переместить указатель файла после того, как я прочитал int 3? я знаю, что он начинается с позиции 0, но мне просто нужна помощь, чтобы понять, как перемещается точка файла. Считает ли он пустые места? Я знаю, что он преобразует их в двоичные файлы.

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;


public class Program5 {
public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    RandomAccessFile inputStream = null;
    int n1, n2, n3, n4, n5, n6, n7, n8, n9;
    int sum = 0;

    System.out.println("Please enter the file name you wish to read from.");
    String file_name = keyboard.next();

    try {
        inputStream = new RandomAccessFile(file_name, "r");

        n1 = inputStream.readInt();
        // inputStream.seek(3);
        // n2 = inputStream.readInt();
        // n3 = inputStream.readInt();
        // n4 = inputStream.readInt();
        // n5 = inputStream.readInt();
        // n6 = inputStream.readInt();
        // n7 = inputStream.readInt();
        // n8 = inputStream.readInt();
        // n9 = inputStream.readInt();
        System.out.println(inputStream.length());
        System.out.println(inputStream.getFilePointer());
        System.out.println(n1);
        // System.out.println(n2);
        sum = n1; // n2; /* n3 + n4 + n5 + n6 + n7 + n8 + n9; */
        inputStream.close();
    } catch (FileNotFoundException e) {
        System.out.println("Problem opening up file" + file_name);
        System.exit(0);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    System.out.println("The sum of the numbers is: " + sum);

    System.out.println("End of program.");

}
 }

получить это

 Please enter the file name you wish to read from.
 inputP5.txt
 length at 59
 file pointer at 4
 n1 =857747758
 The sum of the numbers is: 857747758
 End of program.

person MoneyMonster    schedule 07.03.2017    source источник
comment
Вы можете найти это полезный.   -  person DevilsHnd    schedule 07.03.2017
comment
@DevilsHnd это не помогло мне ответить на мой вопрос, я прочитал это еще до того, как спросил.   -  person MoneyMonster    schedule 07.03.2017
comment
Можете ли вы показать больше вашего кода?   -  person Jeremy    schedule 07.03.2017
comment
@ Джереми, я только что надеюсь, что это поможет тебе   -  person MoneyMonster    schedule 07.03.2017


Ответы (2)


Я пытаюсь прочитать целые числа из текстового файла.

Тогда вам не следует использовать бинарный API.

Я использую RandomAccessFile с Java. Когда я пытаюсь прочитать первый int, я получаю 857747758 (я написал int number1 = inputStream.nextInt()

Нет, ты этого не сделал. Вы использовали inputStream.readInt(). Это бинарный API. readInt() читает 4-байтовое двоичное целое число в сетевом порядке байтов, как указано в Javadoc.

Вы должны использовать Scanner.nextInt().

person user207421    schedule 07.03.2017
comment
мне просто нужно читать строки как строку, а затем скрывать нужную мне информацию, или есть способ, такой как binart api, который позволяет мне перемещаться по текстовому файлу. - person MoneyMonster; 07.03.2017
comment
Какую часть фразы «вы должны использовать…» вы не поняли? - person user207421; 08.03.2017

readInt читает 4 байта. Таким образом, вы не получите желаемого результата.

Java API https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html#readInt()

Считывает из этого файла 32-битное целое число со знаком. Этот метод считывает 4 байта из файла, начиная с текущего указателя файла. Если прочитаны байты по порядку: b1, b2, b3 и b4, где 0 ‹= b1, b2, b3, b4 ‹= 255, то результат будет равен: (b1 ‹‹ 24) | (b2 ‹‹ 16) + (b3 ‹‹ 8) + b4

try (RandomAccessFile raf = new RandomAccessFile(new File(
        "filename.txt"), "r")) {

    byte[] bt = new byte[4];
    raf.read(bt);
    System.out.println(Arrays.toString(bt));
    System.out.println((bt[0] << 24) | (bt[1] << 16) + (bt[2] << 8) + bt[3]);

    raf.seek(0);
    System.out.println(raf.readInt());
} catch (IOException e) {
    e.printStackTrace();
}

Вот результат

[51, 32, 49, 46]
857747758
857747758
person rpfun12    schedule 07.03.2017