Проблема с Java Binary I / O - PullRequest
       15

Проблема с Java Binary I / O

1 голос
/ 04 февраля 2011

Хорошо, поэтому я пытаюсь записать кучу головоломок судоку в файл. Это код, который я должен генерировать головоломки. gen - это класс, который генерирует головоломки, gridArray - массив объектов, который будет содержать головоломки (головоломки генерируются как двумерные массивы int). System.out.print просто печатает сетку, чтобы убедиться, что головоломки верны. У меня проблема указана под блоком кода:

public void run(){
    ObjectOutputStream output;
    try {
        output = new ObjectOutputStream(new FileOutputStream(f));

        for(int i = 0; i < amount; i++){
            int[][] blahbot = gen.generate(difficulty);
            gridArray[i] = blahbot;
            System.out.println(" #" + (i + 1) + " ");
            for(int row = 0; row < 9; row++){
                for(int col = 0; col < 9; col++){
                    System.out.print(blahbot[row][col]);
                    if(col == 8){
                        System.out.println();
                    }
                }
            }
        }
        output.writeObject(gridArray);
        output.close();
    } catch (FileNotFoundException e) {
    } catch (IOException e) {
    }
}

Выходные данные записывают весь массив объектов в файл. У меня проблема в том, что каждый раз, когда я читаю массив из файла, он всегда возвращает одну загадку. У меня есть программа чтения, распечатывающая все содержимое массива, и это та же головоломка, хотя длина массива правильная.

Я заставил эту часть распечатать массивы по мере их сохранения, и они были правильными (без повторов). У меня заканчиваются вещи для тестирования. Я даже пытался использовать разные классы коллекций для сохранения, и я получил тот же результат. Кто-нибудь может увидеть, что не так с моим кодом?

Вот часть моего кода для чтения:

try{
        ObjectInputStream input = new ObjectInputStream(new FileInputStream(file));
        try{
            while (true){
                try {
                    gridArray = (Object[]) input.readObject();
                } catch (ClassNotFoundException e) {
                } 
            }
        }catch(EOFException e){
        }

        /*
         * Close the input stream
         */
        input.close();
    } catch(FileNotFoundException e){
    } catch (IOException e) {
    }

    for(Object array: gridArray){
        int[][] temp = (int[][])array;
        for(int row = 0; row < 9; row++){
            for(int col = 0; col < 9; col++){
                System.out.print(temp[row][col]);
                if(col == 8){
                    System.out.println();
                }
            }
        }

        System.out.println("\n");
    }

Где r - Случайный. Он читает массив объектов из файла, а затем выводит каждый объект как int [] [] для распечатки. Печать - это всего лишь тест, чтобы увидеть содержимое массива.

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

На основании показанного кода может показаться, что вы возвращаете один и тот же экземпляр int [] [] для каждого вызова gen.generate ().Если этот метод повторно использует int [] [], который был создан из предыдущего вызова, то в действительности вы будете добавлять один и тот же int [] [] в массив каждый раз.Последующие вызовы метода generate приведут к изменению массивов, добавленных вами в список массивов.

Пример того, что может происходить:

private int[][]data = new int[9][9];
public int[][] generate() {
   // add logic here to set values in data array
   return data;
}

Если ваш метод похож на описанный выше, у вас возникнет проблема, которую вы задокументировали.Вам следует создавать новый экземпляр массива int [] [] каждый раз, когда вы вызываете метод, или изменяете способ записи данных в файл.

1 голос
/ 04 февраля 2011

Ради тестирования попробуйте изменить это:

for(int i = 0; i < amount; i++){
    int[][] blahbot = gen.generate(difficulty);
    gridArray[i] = blahbot;
    System.out.println(" #" + (i + 1) + " ");
    for(int row = 0; row < 9; row++){
        for(int col = 0; col < 9; col++){
            System.out.print(blahbot[row][col]);
            if(col == 8){
                System.out.println();
            }
        }
    }
}
output.writeObject(gridArray);
output.close();

К этому:

for(int i = 0; i < amount; i++){
    output.writeObject(gen.generate(difficulty));
    output.flush();
}
output.close();

Если все вдруг сработает лучше, результаты указывают на то, что ILMTitan упомянул в своем комментарии - вам нужно будет использовать ключевое слово new и фактически вернуть new int[9][9] из вашего generate метода, а не использовать любую ссылку возвращение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...