Java 2-d阵列I / O.

时间:2013-07-23 17:06:31

标签: java arrays

我将存储的数据从数组写入文本文件时遇到了一些问题。 我已经设法在文件中获得某种数据,但我在理解它的真实性方面遇到了问题(它是否正确?)。问题是,该文件大约是4Mb,当我尝试打开它时 - 它没有打开,因为计算机只是试图加载它。所以我然后在终端中使用“cat gedit filename”命令(是的,我使用linux),我看到每个正方形中都有大量正方形被打印出来,几乎看起来像是因为我看到很多零和一些。但我也非常清楚我的数组包含许多零和一些,这使得很难看出它是否甚至是数组的内容。 请参阅下面的代码。

然而,关于文件中的其他代码是从Project Euler解决问题,但是我将自己将数据用于其他东西,所以我想将它全部存储在一个数组中,然后将其保存到一个单独的文件中。解决这个问题很好,但效果很好,但是 - 我的“写入文件”(参见方法“写入”)不起作用 - 或者它确实有效,但我无法理解文件的内容。

文件应包含许多零和1,一些更高(数组中的最高值为71),并且数组是大小为2000x2000的方阵。 我已经尝试分别打印出数组的内容进行调试,看看它到目前为止是否有效 - 而且确实如此。

    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;


    public class Euler27_MATLAB {

        public static boolean isPrime(int n){
            if(n<2 || (n>2 && n%2==0)){
                return false;
            }else if(n==2){
                return true;
            }else{
                for(int i=3; i<=Math.sqrt(n); i=i+2){
                    if(n%i==0){
                        return false;
                    }
                }
                return true;
            }       
        }
                   //THIS IS WHERE I NEED HELP

        public static void write (String filename, int[][]x) throws IOException{
              BufferedWriter outputWriter = null;
              outputWriter = new BufferedWriter(new FileWriter(filename));
              for (int i = 0; i < x.length; i++) {
                for(int j=0; j<x.length; j++){ //array is square
                    outputWriter.write((x[i][j]));
                }
                outputWriter.newLine();
              }
              outputWriter.flush();  
              //outputWriter.close();  
            }
        public static void main(String[] args){
            int tmp=0; int A = 0; int B = 0; int limit = 1000;
            int nbr = 0;
            int [][]array = new int[limit*2+1][limit*2+1];
            long start = System.currentTimeMillis();
            for(int a=-limit; a<=limit; a++){ //2 if only odd nbrs
                for(int b=-limit; b<=limit; b++){   
                    while(isPrime(nbr*nbr+a*nbr+b)){ //n^2+an+b
                        nbr++;
                    }
                     array[a+limit][b+limit]=nbr;

                    if(nbr>tmp){    //store the values for later out-print
                        tmp = nbr; A=a; B=b;
                    }
                    nbr=0;
                }
            }
            long time = System.currentTimeMillis() - start;
            System.out.println("The product a*b is: " + A*B + "\nwith a=" + A +
                    " and b=" + B + " with limit " + limit +".");
             System.out.println("Formula generated " + tmp + " primes.");
            System.out.println("Time: " + time + " ms.");

                //FOR THE ARRAY ----------------------------------------------
            try{
                write("/home/robin/workspace/ProjectEuler/src/pe27",array); 
            }catch(E`enter code here`xception e){
                System.out.println("Failure");
            }
        }
    }

我尝试过在谷歌上找到的代码,但也无法让这些代码发挥作用。

吉尔

2 个答案:

答案 0 :(得分:4)

outputWriter.write((x[i][j]));

您正在为文件写int。整数是4个字节,构成一个值。该文件包含您正在写入的内容;每int个4个字节。然而,这并不代表人类可读的任何东西。

根据您尝试查看此文件的说明,我假设您尝试将可读的文本写入此文件,在这种情况下您需要转换int到表示该整数值的String

outputWriter.write(String.valueOf(x[i][j]));

修改以展开:

文件包含字节。为了人类可读,这些字节必须映射到一个字符集(默认情况下,最有可能是你的系统上的UTF-8)。

现在,让我们说x[0][0]包含值1这意味着如果您将该值作为int写入文件,则会将以下4个字节写入文件: 00000000 00000000 00000000 00000001

当您尝试使用文本编辑器打开文件或使用cat查看文件时,这些程序会尝试将这些字节映射到人类可读的字符集......并且会失败。这就是为什么你会看到“每个正方形都有数字正方形被打印出来的”

在UTF-8中,字符“1”映射到包含值49的单个字节。将该字符写入文件意味着将单个字节写入文件:00110001

这是显示人类可读文本的程序可以通过将其映射到UTF-8来显示

答案 1 :(得分:-2)

文件中的数据是正确的。 Java在存储到文件时序列化数据,这是二进制格式,而不是文本。之后加载速度更快。它并不意味着人类可读。

如果您想要人类可读的输出,您应该考虑XML,YAML或其他基于文本的格式。