【问题标题】:Reading a file in java and placing its contents into a 2D array在java中读取文件并将其内容放入二维数组
【发布时间】:2019-12-09 18:35:21
【问题描述】:

我正在尝试读取文件并将内容放入从第 5 行开始的二维数组中。我确实让程序运行没有错误,但出现问题并且它没有填充数组。

我进行了测试,发现在我引入了一个 while 循环后似乎出了点问题。文件的前4行在while循环外被一一读取成功,所以应该不是文件读取器本身的问题。

这是一个 while 循环,它应该读取剩余的行并将每个字符串的每个字符放入一个 2D 数组中:

while (fileReader.hasNextLine()) {
   String fileLine = fileReader.nextLine();

   int k = 0;
   for (int i = 0; i < fileLine.length(); i++) {
      for (int j = 0; j < columns; j++) {
         fileArray[k][j] = fileLine.charAt(i);
      }
   }
   k++
}

但是,如果我尝试打印数组,它只会打印空行。为什么它不填充数组,为什么不给出任何错误?当然,我怎样才能修复此代码以使其正常工作?

// 编辑。这是整个代码,因为它似乎有更多的问题,而不仅仅是 for 循环(我为此修复了):

import java.io.*;
import java.util.Scanner;
public class Filer {

   public static void main (String[] args) {
      Scanner fileReader = null;
      char[][] fileArray = null;

      try {
         String fileName = "alphabet.txt";
         File textFile = new File(fileName);
         fileReader = new Scanner(fileName);

         String line1 = fileReader.nextLine();
         int rows = Integer.parseInt(line1);

         String line2 = fileReader.nextLine();
         int columns = Integer.parseInt(line2);

         fileArray = new char[rows][columns];

         char line3 = fileReader.nextLine().charAt(0);
         char line4 = fileReader.nextLine().charAt(0);

         int i = 0;

         while (fileReader.hasNextLine()) {
            String fileLine = fileReader.nextLine();
            for (int r = 0; r < fileLine.length(); r++) {
               fileArray[i][r] = fileLine.charAt(r);
            }
            i++;
         }

         fileReader.close();
      }

      catch (Exception e) {
         if (fileReader != null) {
            fileReader.close();
         }
      }

      if (fileArray != null) {
         for (int i = 0; i < fileArray.length; i++) {
            System.out.print(fileArray[i]);
            System.out.println();
         }
      }
      else {
         System.out.println("Error!");
      }
   }
}

文件内容为:

4
4
x
o
xxxx
xxox
ooxo
xxxx

【问题讨论】:

  • 您有两个嵌套循环来读取单行的字符。在循环中,你总是填充 fileArray[k],其中 k 总是 0。你需要完全重新考虑这个循环。目前还不清楚它应该做什么,所以很难提供帮助。
  • 分享第 5 行的示例数据。
  • k 应该代表行,我推断它应该像那样工作,因为当 while 循环重新启动时它不会增长吗?因此,假设文本文件中的第 5 行是“abcdefg”,for 循环将根据索引号(k 表示行,j 表示列)将字符一一放入数组中,这将使数组的第一行是'a','b','c','d','e','f','g'。之后,k 将增加 1,以便文件第 6 行的字符将放置在数组的第二行。
  • 我编辑了帖子并包含了整个代码,以防其他地方出现问题。这是我第一次在 java 中处理文件,所以我确信这很混乱,但非常感谢您的帮助。
  • 也许更有经验的人在这里看到了“真正的”问题,但如果我错了,请纠正我:由于您在 try-section 中定义了 fileArray,因此 if-loop 无法在外部使用它?

标签: java arrays file


【解决方案1】:

之前,您有一些语法错误,但我可以看到您现在已经更正了它们。下面给出的是工作代码。运行它,让我知道它是否有效。

import java.io.File;
import java.util.Scanner;

public class Filer {

    public static void main(String[] args) {
        Scanner fileReader = null;
        char[][] fileArray = null;

        try {
            File file = new File("alphabet.txt");
            if (file.exists()) {
                fileReader = new Scanner(file);
            } else {
                System.out.println("The file does not exist");
            }

            String line1 = fileReader.nextLine();
            int rows = Integer.parseInt(line1);

            String line2 = fileReader.nextLine();
            int columns = Integer.parseInt(line2);

            fileArray = new char[rows][columns];

            char line3 = fileReader.nextLine().charAt(0);
            char line4 = fileReader.nextLine().charAt(0);

            int i = 0;

            while (fileReader.hasNextLine()) {
                String fileLine = fileReader.nextLine();
                for (int r = 0; r < fileLine.length(); r++) {
                    fileArray[i][r] = fileLine.charAt(r);
                }
                i++;
            }    
            fileReader.close();
        } catch (Exception e) {
            if (fileReader != null) {
                fileReader.close();
            }
        }

        if (fileArray != null) {
            for (int i = 0; i < fileArray.length; i++) {
                System.out.print(fileArray[i]);
                System.out.println();
            }
        } else {
            System.out.println("Error!");
        }
    }
}

【讨论】:

  • 是的,它确实有效,谢谢!但是,似乎在自己尝试之后,我发现我最初遇到的问题与我在此处发布的代码中遗漏的内容有关。我没有提到我还需要将第 3 行和第 4 行的字符放入一个完全不同的数组(一维数组)中。显然我做错了,当我离开这个一维数组时,它会弄乱其余的代码。无论如何,谢谢你的帮助。
【解决方案2】:

这样怎么样?

int i = 0;
while (fileReader.hasNextLine()) {
      String fileLine = fileReader.nextLine();
      for (int r = 0; r < fileLine.length(); r++) {
          fileArray[i][r] = fileLine.charAt(r);
          }
      i++;
      }

您只需要遍历文件中的行(我这里的 for 循环)。不需要其他循环。

【讨论】:

  • 这个循环更有意义,但不知何故我仍然有同样的问题:数组打印出空。我还尝试完全删除 for 循环(将代码分成几部分以找到问题)并仅打印 fileLine 字符串,但它也不打印它。
  • 也许您需要在此处发布整个代码,以便我们查明问题所在。否则很难说是什么情况。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
相关资源
最近更新 更多