在Java中将文本文件逐字符读入2D数组

在Java中将文本文件逐字符读入2D数组,java,arrays,text-files,tui,Java,Arrays,Text Files,Tui,作为我面向对象类的一部分,我们将设计一个战舰游戏,它使用TUI最终实现GUI。 根据设计,我们将从一个文本文件中读取AI的船舶位置,该文本文件看起来与b类似 ABCDEFGHIJ 1. 2 BBBB 3. 4 C 5D C 6D 7AAAAA 8 SSS 9 0看看这里。你可以用这种方式逐字阅读。你需要注意新的线路。 看看这里。你可以用这种方式逐字阅读。你需要注意新的线路。 在我看来,最简单的方法是先逐行读取文件,然后逐字符读取这些行。通过使用内置实用程序,您可以避免处理新行的复杂性,因为新行

作为我面向对象类的一部分,我们将设计一个战舰游戏,它使用TUI最终实现GUI。 根据设计,我们将从一个文本文件中读取AI的船舶位置,该文本文件看起来与b类似

ABCDEFGHIJ 1. 2 BBBB 3. 4 C 5D C 6D 7AAAAA 8 SSS 9
0看看这里。你可以用这种方式逐字阅读。你需要注意新的线路。

看看这里。你可以用这种方式逐字阅读。你需要注意新的线路。
在我看来,最简单的方法是先逐行读取文件,然后逐字符读取这些行。通过使用内置实用程序,您可以避免处理新行的复杂性,因为新行因操作系统/编辑器而异


在我看来,最简单的方法是先逐行读取文件,然后逐字符读取这些行。通过使用内置实用程序,您可以避免处理新行的复杂性,因为新行因操作系统/编辑器而异

总的想法是把问题分解成更简单的问题来解决。如果您有一个函数可以打开一个文件并读取一行,那么您就解决了一个问题。接下来,您需要解决逐个字符迭代字符串的问题。这可以通过多种方式完成,但其中一种方式是使用String类的内置函数将字符串转换为字符数组

唯一缺少的是try{}catch{}在打开文件时通常需要正确导入类:FileReader&BufferedReader

总的想法是把问题分解成更简单的问题来解决。如果您有一个函数可以打开一个文件并读取一行,那么您就解决了一个问题。接下来,您需要解决逐个字符迭代字符串的问题。这可以通过多种方式完成,但其中一种方式是使用String类的内置函数将字符串转换为字符数组


唯一缺少的是try{}catch{}通常在打开文件并正确导入类时需要:FileReader&BufferedReader。

@JudgeJohn的答案是好的-我会评论,但不幸的是我不能。逐行阅读第一行将确保任何系统细节(如换行的实现)都由Java的各种库处理,它们知道如何很好地处理。在文件上的某种读取器上使用a将允许在行上轻松枚举。在此之后,逐个字符读取获得的字符串应该不是问题,例如使用toCharArray方法

一个重要的补充-当使用流和读卡器对象以及它们上面的扫描程序时,您的代码处理好进程的结尾通常非常重要-处理系统资源,如文件句柄。这是在Java中使用这些类的close方法完成的。现在,如果我们完成阅读并只调用close,当事情按计划进行时,这一切都很好,但是有可能抛出异常,导致方法在调用close方法之前退出。一个好的解决方案是try-catch或try-finally块。例如

Scanner scanner = null;
try {
    scanner = new Scanner(myFileStream);
    //use scanner to read through file
    scanner.close();
} catch (IOException e) {
    if (scanner != null) scanner.close(); //check for null in case scanner never got initialised.
}
更好的是

Scanner scanner = null;
try {
    scanner = new Scanner(myFileStream);
    //use scanner to read through file
} finally {
    if (scanner != null) scanner.close(); //check for null in case scanner never got initialised.
}
无论try块如何退出,始终会调用finally块。更好的是,Java中有一个块,如下所示:

try (Scanner scanner = new Scanner(myFileStream)) {
    //use scanner to read through file
}

这个函数完成了所有空值的检查,最后调用close。非常安全,而且打字很快

@JudgeJohn的回答很好-我会评论,但不幸的是我不能。逐行阅读第一行将确保任何系统细节(如换行的实现)都由Java的各种库处理,它们知道如何很好地处理。在文件上的某种读取器上使用a将允许在行上轻松枚举。在此之后,逐个字符读取获得的字符串应该不是问题,例如使用toCharArray方法

一个重要的补充-当使用流和读卡器对象以及它们上面的扫描程序时,您的代码处理好进程的结尾通常非常重要-处理系统资源,如文件句柄。这是在Java中使用这些类的close方法完成的。现在,如果我们完成阅读并只调用close,当事情按计划进行时,这一切都很好,但是有可能抛出异常,导致方法在调用close方法之前退出。一个好的解决方案是try-catch或try-finally块。例如

Scanner scanner = null;
try {
    scanner = new Scanner(myFileStream);
    //use scanner to read through file
    scanner.close();
} catch (IOException e) {
    if (scanner != null) scanner.close(); //check for null in case scanner never got initialised.
}
更好的是

Scanner scanner = null;
try {
    scanner = new Scanner(myFileStream);
    //use scanner to read through file
} finally {
    if (scanner != null) scanner.close(); //check for null in case scanner never got initialised.
}
无论try块如何退出,始终会调用finally块。更好的是,Java中有一个块,如下所示:

try (Scanner scanner = new Scanner(myFileStream)) {
    //use scanner to read through file
}
这个函数完成了所有空值的检查,最后调用close。非常安全,而且打字很快

您可以使用扫描仪读取单个字符,如下所示:

scanner.findInLine(".").charAt(0)
该电路板是一个11x11字符的char[][]board=new char[11][11],因此您必须跟踪r 当你在读这些角色时,你正在看的是ow和column。读完第11个字符后,您将知道何时转到下一行

代码示例:

public static void main(String[] args) throws Exception {
    String file = 
        " ABCDEFGHIJ\n" +
        "1          \n" +
        "2 BBBB     \n" +
        "3          \n" +
        "4       C  \n" +
        "5D      C  \n" +
        "6D         \n" +
        "7AAAAA     \n" +
        "8     SSS  \n" +
        "9          \n" +
        "0          \n";

    char[][] board = new char[11][11];
    Scanner scanner = new Scanner(file);

    int row = 0;
    int col = 0;
    while (scanner.hasNextLine()) {
        // Read in a single character
        char character = scanner.findInLine(".").charAt(0);
        board[row][col] = character;
        col++;

        if (col == 11) {
            // Consume the line break
            scanner.nextLine();

            // Move to the next row
            row++;
            col = 0;    
        }
    }

    // Print the board
    for (int i = 0; i < board.length; i++) {
        System.out.println(new String(board[i]));
    }
}
您可以使用扫描仪读取单个字符,如下所示:

scanner.findInLine(".").charAt(0)
该电路板是一个11x11字符的char[][]board=new char[11][11],因此在读取字符时,您必须跟踪您所在的行和列。读完第11个字符后,您将知道何时转到下一行

代码示例:

public static void main(String[] args) throws Exception {
    String file = 
        " ABCDEFGHIJ\n" +
        "1          \n" +
        "2 BBBB     \n" +
        "3          \n" +
        "4       C  \n" +
        "5D      C  \n" +
        "6D         \n" +
        "7AAAAA     \n" +
        "8     SSS  \n" +
        "9          \n" +
        "0          \n";

    char[][] board = new char[11][11];
    Scanner scanner = new Scanner(file);

    int row = 0;
    int col = 0;
    while (scanner.hasNextLine()) {
        // Read in a single character
        char character = scanner.findInLine(".").charAt(0);
        board[row][col] = character;
        col++;

        if (col == 11) {
            // Consume the line break
            scanner.nextLine();

            // Move to the next row
            row++;
            col = 0;    
        }
    }

    // Print the board
    for (int i = 0; i < board.length; i++) {
        System.out.println(new String(board[i]));
    }
}

所有行的长度都相同吗?当然应该相同长度。所有行的长度都相同吗?当然应该相同长度。完全忽略新行的处理。新行因操作系统/编辑器的不同而不同,尝试自己处理它们不是一个好主意。同意你的看法。这就解决了他主要的问题:如何读取文件字符。你可能至少应该添加一条注释,说明他需要知道行的结尾。你完全忽略了新行的处理。新行因操作系统/编辑器的不同而不同,尝试自己处理它们不是一个好主意。同意你的看法。这就解决了他主要的问题,即如何理解文件的字符。你可能至少应该添加一条注释,说明他需要注意行的结尾。非常优雅的答案,与我的答案完美结合。非常感谢。非常优雅的回答,与我所拥有的完美契合。非常感谢。