我将存储的数据从数组写入文本文件时遇到了一些问题。 我已经设法在文件中获得某种数据,但我在理解它的真实性方面遇到了问题(它是否正确?)。问题是,该文件大约是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");
}
}
}
我尝试过在谷歌上找到的代码,但也无法让这些代码发挥作用。
吉尔
答案 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或其他基于文本的格式。