-2

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

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

该文件应该包含许多零和一,一些更高(数组中的最大值是 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");
            }
        }
    }

我尝试了我在谷歌上找到的代码,但也无法让它们工作。

吉尔

4

2 回答 2

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

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

根据您对尝试查看此文件的描述,我假设您正在尝试将人类可读的文本写入此文件,在这种情况下,您需要将 转换为int表示String该整数值的 a 。

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 来显示的内容

于 2013-07-23T17:12:05.323 回答
-2

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

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

于 2013-07-23T17:13:15.663 回答