2017-10-16 37 views
0
BufferedReader in = new BufferedReader(new FileReader(file)); 
String line; 
int[] data = null; 

while((line = in.readLine()) != null) { 
    String[] a = line.split(","); //read in all numbers in file 
    data = new int[a.length]; //convert those numbers from Strings to ints 
    for(int i = 0; i < a.length; i++) { 
     data[i] = Integer.parseInt(a[i]); 
     System.out.print(data[i] + ","); //testing 
    } 
} 

System.out.println(); 
for(int i = 0; i < data.length; i++) { 

     System.out.print(data[i] + ","); 
} 

的文件只是包含1行由逗号分隔的数字,如组成:为什么读取一行后数组的值会发生变化?

5,4, 
1,-1,-1,1,1, 
1,0,3,4,1, 
1,0,2,2,1, 
1,1,1,1,1, 

程序板条箱仅包含数字的字符串数组,然后创建以相同的顺序的整数数组。但是将字符串更改为整数,然后验证int数组是否包含文件中的值,则输出int数组。

该代码输出:

5,4,1,-1,-1,1,1,1,0,3,4,1,1,0,2,2,1,1,1,1,1,1, 
1,1,1,1,1, 

正如你可以看到数的第一行,其对应于当块内的打印功能,打印正确。但是当数组迭代并在while块之外再次打印时,突然间它完全不同了,为什么会出现这种情况?该数组应该在while块外部相同。

+2

可以请您确认您的文件的内容。它看起来好像你在一条单独的行上用'1,1,1,1,1'换行。这会导致一个问题,因为每次读取数据都会重新初始化数据。 –

+0

5,4, 1,-1,-1,1,1, 1,0,3,4,1, 1,0,2,2,1, 1,1,1,1,1 , –

+1

如果内容正是你刚发布的内容,你会得到一个'NumberFormatException'。我已经试过你的代码,并且它能正常格式化文本文件(单行,没有额外的空白)。 –

回答

0

试图修改你的问题,我看到你贴:

5,4, 
1,-1,-1,1,1, 
1,0,3,4,1, 
1,0,2,2,1, 
1,1,1,1,1, 

所以,我可以想像,你的文件是这样。

如果执行此代码:

BufferedReader in = new BufferedReader(new FileReader("Path_to/java.txt")); 
     String line; 
     int[] data = null; 

     while((line = in.readLine()) != null) { 
      String[] a = line.split(","); //read in all numbers in file 
      data = new int[a.length]; //convert those numbers from Strings to ints 
      System.out.println("1data.length: " + data.length); 
      for(int i = 0; i < a.length; i++) { 
       data[i] = Integer.parseInt(a[i]); 
       System.out.println(data[i] + ","); //testing 
      } 
     } 

     System.out.println("data.length: " + data.length); 
     for(int i = 0; i < data.length; i++) { 

      System.out.print(data[i] + ","); 
     } 

    } 

你可以看到data.length是5月末(出于明显的原因)。这就是为什么在

for(int i = 0; i < data.length; i++) { 

     System.out.print(data[i] + ","); 
} 

你看

1,1,1,1,1, 
+0

是的,我想我现在明白了,在记事本上它看起来像1行的文本,但显然有多行(你可以看到一个额外的空间在stackoverflow上,表示新行?) –

+0

我刚才格式化您的问题 –

+0

@ApprentlyOk乐于帮助。如果此答案或任何其他人解决了您的问题,请将其标记为已接受:stackoverflow.com/help/someone-answers –

0

测试你的代码,我发现它做工精细用正确格式的文本文件后。正确格式化为单行,逗号分隔整数,没有额外的白色间距。

您的程序

例有效文本文件:

5,4,1,-1,-1,1,1,1,0,3,4,1,1,0,2,2,1,1,1,1,1,1 

如果你在你的文件换行符,该阵列data将有一个新的数组等于当前分割线的长度重新初始化。因此,data将只包含最后一行读取。

我提出作为一个更好的解决方案使用List的,因为整数的数量可能是未知的,并且Scanner读取使用分隔符的文本文件“”。此外,在“扫描”文本文件的同时,删除所有额外的空白区域,以防止在存在任何空白时使用Integer.valueOf()时发生NumberFormatException。这种方法将使读取的文本文件不够完整。请注意,如果文件不仅包含整数,这仍然会导致异常。

例如:

String fileName = "test.txt"; 
Scanner scanner = new Scanner(new File(fileName)); 
scanner.useDelimiter(","); 
List<Integer> result = new ArrayList<>(); 
while (scanner.hasNext()) { 
    // add the parsed integer to the list, removing split space. 
    result.add(Integer.valueOf(scanner.next().replaceAll("\\s+", ""))); 
} 

// Display contents 
String output = ""; 
for (int value : result) { 
    if (!output.isEmpty()) { 
     output += ", "; 
    } 
    output += value; 
} 
System.out.println(output); 
相关问题