问题描述
我正在尝试将文件读取到我的Java程序中,其中txt文件的第一行是int,之后的所有内容都很长。
我遇到的问题是while循环中的每一行代码都在调用s.nextint()
和s.nextLong()
(至少当我在Eclipse中监视它们时)。
我只希望它们在我称之为它们的文本文件中递增。
首先,我在做错什么,因为据我了解,它们仅应在调用时增加,而不应在每一行代码中递增,并且有更好的方法吗? 我在想是否可以将它们全部作为一个单一类型加载到数组中,然后再进行转换,但是我认为这不是合理的。 我觉得这应该很简单,但是我忽略了一些东西。
还可以说文本文件中有10个数字,然后是1-10。 我知道将少量保存为int只是一种浪费,但是随它去吧。
public static long[] readfile()
{
int row = 1;
Scanner s = null;
long[] nums = null;
try {
s = new Scanner(new BufferedReader( new FileReader("text.txt")));
while (s.hasNext()) {
if(row == 1){
nums = new long[s.nextInt()];
row++;
}
else {
nums[row - 2] = s.nextLong();
row++;
}
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
finally {
if (s != null) {
s.close();
}
}
return nums;
}
1楼
我更喜欢这样的东西:
do
{
if(row == 1){
nums = new long[s.nextInt()];
row++;
}
else
{
nums[row] = s.nextLong();
row++;
}
}while(s.hasNextLong());
我没有尝试对其进行编译或调试。 您需要进一步的帮助。 (它假定文件顶上将有一个整数,就像您所说的那样。您可能应该添加代码以防止这种情况发生。)
2楼
您的代码正在抛出ArrayIndexOutOfBoundsException
。
您正在尝试将row
用于两个目的,这会引发数组索引编制工作。
当我们到达else
块时,row等于2,并且您尝试将row应用于0-9(例如10个long)的数组。
您应该在检查hasNextInt()
之后尝试初始化数组,然后在检查hasNextLong()
之后获取long
整数
代码示例(text.txt具有10个数字[1234567890]):
public static void main(String[] args) throws Exception {
long[] longs = readfile();
if (longs != null) {
for (long l : longs) {
System.out.println(l);
}
}
}
public static long[] readfile() {
int row = 0;
Scanner s = null;
long[] nums = null;
try {
s = new Scanner(new BufferedReader(new FileReader("text.txt")));
if (s.hasNextInt()) {
nums = new long[s.nextInt()];
}
while (s.hasNextLong()) {
nums[row] = s.nextLong();
row++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (s != null) {
s.close();
}
}
return nums;
}
结果:
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
3楼
我通常发现,尝试读取多种类型时,扫描仪的行为异常。 我将为您要阅读的每种类型创建一个单独的扫描仪。
4楼
看来我所说的问题与月食错误有关。 如果我只是运行代码或在主文件中的readfile之后设置断点,我的代码将按预期工作,但是当我逐步执行值时,Eclipse并没有正确分配值。 有趣的问题。 我想确切地了解是什么原因造成的。 似乎不太可能,但那不是编码吗? 没有任何进展。