Search code examples
javarandomaccessfile

readInt() not work when try read binary saved integer


i trying save some integers and doubles to txt file in binary format. Numbers are saved correctly i think, but problem is when i try read integer with readInt(). For example, when integer number have value = 12, program output for this integer is 208797696, and program with more integers always end with EOF exception. There´s not problem with readDouble(), it works correct.

import java.util.Scanner;
import java.io.*;

public class CandyFruit {

public static void main(String[] args) throws IOException {
    int i;
    int int_sc ;
    double double_sc;
    String string_sc;
    int seek_w = 0; //seek for writing

    String map = ""; 
    Scanner scan = new Scanner(System.in);
    try (RandomAccessFile write = new RandomAccessFile("fgh.txt", "rw")) {

    for (;;) {  
        System.out.println("1 - write int, 2 - write double, 0 - break");
        i = scan.nextInt();
        if (i == 0) break;
        System.out.println("Your choice:");
        if (i == 1) {
            int_sc = scan.nextInt();
            write_int(write, int_sc, seek_w);
            map = map + "1";
            seek_w += 4; //seek growth for int

        }
        else if (i == 2) {
            double_sc = scan.nextDouble();
            write_double(write, double_sc, seek_w);
            map = map + "2"; 
            seek_w += 8; //seek growth for double
        }
    }
    }

    //catch

    try (RandomAccessFile read = new RandomAccessFile("fgh.txt", "rw")) {

        int seek_r = 0;

        for (int o = 0; o < map.length(); o++) {
            char c = map.charAt(o);

            if (c == '1') {
                read_int(read, seek_r);
                seek_r += 4; //seek growth for int

            }
            else if (c == '2') {

                read_double(read, seek_r);
                seek_r += 8; //seek growth for double 
            }


        }
    }

    //catch

}

public static void write_int (RandomAccessFile write, int scanned, int s) throws IOException {
    write.seek(s);
    write.write(scanned);
}

public static void write_double(RandomAccessFile write, double scanned, int s) throws IOException {
    write.seek(s);
    write.writeDouble(scanned);
}

public static void read_int(RandomAccessFile read, int s) throws IOException {
    read.seek(s);
    System.out.println("Int is: "+read.readInt());
}

public static void read_double(RandomAccessFile read, int s) throws IOException {
    read.seek(s);
    System.out.println("Double is: "+read.readDouble());
}

}


Solution

  • Your write_int method writes using RandomAccessFile.write(), which writes a byte to the file. When you use readInt(), you read that single byte plus three bytes of other arbitrary data (because you didn't write them).

    You should use RandomAccessFile.writeInt() in write_int instead.