2013-07-23 72 views
-2

我在將存儲的數據從我的數組寫入文本文件時遇到了一些問題。 我已經設法獲得文件中的某種數據,但是我有問題了解它是什麼(是否正確?)。事情是,該文件大約是4Mb,當我嘗試打開它時 - 它不打開,因爲計算機只是試圖加載它。於是我在終端中使用「cat gedit filename」命令(是的,我使用linux),並且我看到很多正方形都打印出來,每個方塊都有數字,幾乎看起來像是位,因爲我看到很多零和一些。但我也很清楚,我的數組包含很多零和很難看到它是否甚至是數組的內容。 請參閱下面的代碼。Java 2-D陣列I/O

但是,關於該文件中的其他代碼正在解決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"); 
      } 
     } 
    } 

我嘗試了代碼,我發現在谷歌,並不能讓那些工作。

吉爾

+0

不相關,但'貓gedit文件名'沒有任何意義。你的意思是'貓文件名'。 – m0skit0

回答

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

+1關於人類可讀二進制的解釋:) – m0skit0

-2

的數據顯示該文件是正確的。 Java在存儲到文件時序列化數據,這是一種二進制格式,而不是文本。之後加載速度更快。這並不意味着人類可讀。

如果你想要人類可讀的輸出,你應該考慮XML,YAML或其他基於文本的格式。

+0

dowvotes的解釋是可喜的 – m0skit0

+0

我沒有downvote,但是......這裏沒有涉及任何對象,也沒有必要用一種荒謬的標記語言將一些數字打印到文件中。 –

+0

更正對象。關於荒謬的標記語言,請注意:*「或其他基於文本的格式」* – m0skit0