在Java中将文本文件读入数组

在Java中将文本文件读入数组,java,arrays,Java,Arrays,我对Java还很陌生(目前参加了我的第一个编程课程),所以我的问题的答案可能就在我面前 我的目标是读入一个文本文件,其内容如下: 4563123,112211324135412 2312311,222121324135211 2312345,112211324135421 5527687,212111313124412 7867567,111111111111111 其中第一组数字是一个ID,第二组是一组测试答案(我有答案)。一旦我阅读了答案,我需要将它们存储在一个数组中(我假设只是一个数组,

我对Java还很陌生(目前参加了我的第一个编程课程),所以我的问题的答案可能就在我面前

我的目标是读入一个文本文件,其内容如下:

4563123,112211324135412
2312311,222121324135211
2312345,112211324135421
5527687,212111313124412
7867567,111111111111111
其中第一组数字是一个ID,第二组是一组测试答案(我有答案)。一旦我阅读了答案,我需要将它们存储在一个数组中(我假设只是一个数组,因为我的类还没有涵盖
ArrayLists
)。所有这些数据都需要存储在一个数组中,因为我需要在方法末尾返回它

以下是我目前掌握的代码:

public static String[] readFile(String filename)throws IOException{
    Scanner inFile = new Scanner(filename);
    String line;
    String[] results = new String[101];
    int i = 0;
    while (inFile.hasNextLine()){
        line = inFile.nextLine();
        String[] incoming = line.split(",");
        String wid = incoming[0];
        String answer = incoming[1];
        results[i] = wid;
        results[i + 1] = answer;
        i += 2;

    }
    inFile.close();
    return results;
}
可以安全地忽略
字符串文件名
,它是从主文件传递进来的

每次运行此方法时,我都会遇到一个
BoundsException数组
,主要是当我尝试将
传入[1]
分配给
应答


我盯着这段代码看的时间比可能对我有好处的时间要长,但似乎我就是无法理解它。任何帮助都将不胜感激,无论是告诉我哪里出了问题,还是我可以做些什么来改进。

您的文件中有空行。或者一个没有逗号的垃圾行。因此,在访问狭缝阵列之前,只需进行检查

if(incoming != null && incoming.length >= 2){
    String wid = incoming[0];
    String answer = incoming[1];
    // ... other dependent codes go here!
}

它将帮助您避免异常。

因为您使用的是Java 7,所以请使用new Files API和try with resources语句;此外,避免复制空行:

final Path file = Paths.get(filename);
String line;
String[] incoming;
String[] results = new String[101];
int nrElements = 0;

try (
    final BufferedReader reader = Files.newBufferedReader(path,
        StandardCharsets.UTF_8);
) {
    while ((line = reader.readLine()) != null) {
        incoming = line.split(",");
        if (incoming.length != 2)
            continue;
        results[nrElements++] = incoming[0];
        results[nrElements++] = incoming[1];
    }
}

return Arrays.copyOfRange(results, 0, nrElements);

如果文本文件末尾有一个换行符,那么line.split(“,”)将不会分割该行,因此数组索引位置1将超出范围,因为它不存在于使用Java 7的用户中?好的,现在没有例外,但是当我试图打印数组以检查它是否存储了所有内容时,它会打印出来:
[Ljava.lang.String;@4c56291a
您是如何打印它的?使用
Arrays.toString(您的ArrayReference);
,或者编写您自己的打印方法以满足进一步的需要。恐怕我对这个解决方案的大部分内容都很不熟悉。虽然我理解其背后的逻辑,但我从未使用过
缓冲读取器,甚至从未使用过try语句。我们正在进行的编程应该是一些基本的(教授上周刚刚教过如何阅读课文),但出于某种原因,我遇到了这个障碍。我将进一步阅读您发布的一些代码,这看起来确实是一种更简单的方法。
try(){}
是一个try with resources语句;您声明要在
中打开的资源()
,在
{}
中使用这些资源的代码和Java将自动为您关闭源代码-
{}
中的代码是否引发异常。这是Java 7的基本功能;)查看Java 7和文件的一篇小文章,非常感谢!还有最后一个问题。是否可以剪掉数组的其余部分,这样我就不会有一堆
null
s,或者这是必要的?数组应该适用于“任意数量的学生”,最多50人(因此我的代码中的
结果
字符串的大小。它是,但首先,你必须使用数组吗?你不能使用
数组列表
?这里的诀窍是保留你写的元素的数量(你已经在这里做了)并使用
数组。copyOfRange()
。或者,如果您只需要打印它,请在数组的元素上循环,并在读取一个
null
时停止。实际上,我不需要打印它,因为这只是我检查的方式。此数组最终将被传递到其他方法中使用。我们将在几周后讨论
ArrayList
的内容,所以我不需要打印它确定解决方案是否明确需要它,更不用说我缺乏正确使用和读取它们的知识。我只是不确定数组中的
null
s是否会影响数组在其他方法中的使用。