Запись 3D-массива в двоичный файл и чтение файла обратно в другой 3D-массив Java - PullRequest
4 голосов
/ 19 января 2011

У меня есть задание, что мне нужно создать трехмерный массив произвольного размера, записать его в двоичный файл, затем прочитать двоичный файл обратно в программу и создать другой трехмерный массив, такой же, как первый. У меня проблемы с чтением обратно в программу, после нескольких часов я могу получить только первый int или последний из предыдущего массива. Я еще не успел пройти первые 2D, поэтому я просто выделил место для работы массива, но как только получу, это должно произойти быстро. Метод readData () - тот, который доставляет мне проблемы. Заранее спасибо.

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

public class homework1 {

public homework1() {
}

// Allocates space for the 3-dimension array as specified and for each
// array element, assigns a random number, and return the array
public static int[][][] createData() {

    int[][][] data;

    //Random variables for array dimensions
    Random rand = new Random();
    int x = rand.nextInt(5) + 1;
    rand = new Random();
    int y = rand.nextInt(5) + 1;
    rand = new Random();
    int z = rand.nextInt(5) + 1;

    data = new int[x][y][z];

    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            for (int k = 0; k < z; k++) {

                rand = new Random();
                int r = rand.nextInt(5) + 1;
                data[i][j][k] = r;
            }
        }
    }

    return data;
}

//Writes the 3-dimension array to file.
public static int[][][] writeData(int[][][] array, String fileName)
        throws IOException {

    try {
        FileOutputStream out = new FileOutputStream(fileName);
        DataOutputStream outs = new DataOutputStream(out);

        for (int i = 0; i < array.length; i++) {
            //outs.writeInt(array[i].length); (maybe?)

            for (int j = 0; j < array[i].length; j++) {
                //outs.writeInt(array[i][j].length); (maybe?)

                for (int k = 0; k < array[i][j].length; k++) {
                    outs.writeInt(array[i][j][k]);
                }
            }
        }

        outs.close();
        out.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

    return array;
}

public static int[][][] readData(String fileName)
        throws FileNotFoundException, IOException {

    int[][][] array = new int[3][3][5];

    try {
        FileInputStream in = new FileInputStream(fileName);
        DataInputStream ins = new DataInputStream(in);
        int readFrom = ins.readInt(); //read 4 binary byes and

        System.out.println("From file");




        while (in.read() != -1) {
           // poop = ins.readInt();
            System.out.println(readFrom);

            for (int i = 0; i < array.length; i++) {
                //outs.writeInt(array[i].length); (maybe?)

                for (int j = 0; j < array[i].length; j++) {
                    //outs.writeInt(array[i][j].length); (maybe?)

                    for (int k = 0; k < array[i][j].length; k++) {
                        array[i][j][k] = readFrom;
                    }
                }
            }

            System.out.flush();

            readFrom=ins.readInt();

        }
        //save them in an integer
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (EOFException ex){
        ex.printStackTrace();
    }
    System.out.println("Blank array that needs to be filled");

    return array;
}

// Displays the array.
public static void printData(int[][][] array) {

    for (int i = 0; i < array.length; i++) {
        System.out.println("Frame " + i + ":");
        for (int j = 0; j < array[i].length; j++) {
            for (int k = 0; k < array[i][j].length; k++) {
                System.out.print("\t" + array[i][j][k] + " ");
            }
            System.out.print("\n");
        }
    }

}

public static void main(String args[]) throws IOException {
    //        throws FileNotFoundException, IOException {

    int data[][][];
    data = createData();
    printData(data);
    writeData(data, "data.out");
    data = readData("data.out");
    printData(data);

}

}

Ответы [ 3 ]

1 голос
/ 19 января 2011

Как вы уже написали, вы не читаете из файла каждый раз, когда делаете цикл в самом внутреннем цикле - и не во внешних циклах. Таким образом, вы читаете только один раз.

Вызов ins.readInt () должен находиться в самом внутреннем цикле, потому что вам нужно прочитать каждую ячейку таблицы.

0 голосов
/ 19 января 2011

Давайте подумаем.Метод readData () ДОЛЖЕН получить информацию о размере массива откуда-то, верно?Затем writeData () ДОЛЖЕН сохранить его.

и сколько раз вы вызываете readInt () в readData ()?

0 голосов
/ 19 января 2011

Я полагаю, что вы можете достичь этого с помощью сериализации.

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