Java 使用BufferedReader对多维数组中的行进行计数

Java 使用BufferedReader对多维数组中的行进行计数,java,file-io,multidimensional-array,bufferedreader,Java,File Io,Multidimensional Array,Bufferedreader,我正在使用BufferedReader读取.csv文件。我在读取文件和提取数据方面没有问题。然而,我的问题是,我必须硬编码我的数组声明。例如: String[][] numbers=new String[5258][16]; List<String[]> data = new ArrayList<String[]>(); 我使用的.csv文件有5258行16列。但我希望能够做到以下几点: String[][] numbers=new S

我正在使用BufferedReader读取.csv文件。我在读取文件和提取数据方面没有问题。然而,我的问题是,我必须硬编码我的数组声明。例如:

        String[][] numbers=new String[5258][16];
List<String[]> data = new ArrayList<String[]>();
我使用的.csv文件有5258行16列。但我希望能够做到以下几点:

        String[][] numbers=new String[rowsInFile][16];
换句话说,我希望变量“rowsInFile”等于我不想计算列数的文件中的行数,因为我将运行此程序的每个.csv文件都有16列

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

        int row = 0;
        int col = 0;

        String fileInput = JOptionPane.showInputDialog(null, 
                "Please enter the path of the CSV file to read:");

        File file = new File(fileInput);

        BufferedReader bufRdr;
        bufRdr = new BufferedReader(new FileReader(file));
        String line = null;

        //get rows in the file
        int rowsInFile = 0;
        while(bufRdr.readLine() != null) {
            rowsInFile++;
            row++;
        }
        String[][] numbers=new String[rowsInFile][16];

        //read each line of text file
        row = 0;
        while((line = bufRdr.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line,",");
            col=0;

            while (st.hasMoreTokens()) {
                //get next token and store it in the array
                numbers[row][col] = st.nextToken();
                col++;
            }
            row++;
        }
但是,我得到了一个空指针异常。你知道我该怎么做吗


是的,这段代码被try/catch语句包围。

问题是,一旦你浏览了BufferedReader一次,你就不能再浏览它了。换句话说,您必须使用新的BufferedReader

或者,可以使用动态数组结构(如ArrayList或LinkedList)来存储行

LinkedList<String[]> numbers = new LinkedList<String[]>();

while( (line = bufRdr.readLine()) != null ) {
    numbers.add(line.split(","));
}

然后使用numbers.geti[j]来代替数字[i][j]。

问题是,一旦您通过BufferedReader一次,就不能再通过它了。换句话说,您必须使用新的BufferedReader

或者,可以使用动态数组结构(如ArrayList或LinkedList)来存储行

LinkedList<String[]> numbers = new LinkedList<String[]>();

while( (line = bufRdr.readLine()) != null ) {
    numbers.add(line.split(","));
}

然后,不用数字[i][j],而是使用数字。geti[j]。

不用数组,而是使用一些动态的东西,比如列表。例如:

        String[][] numbers=new String[5258][16];
List<String[]> data = new ArrayList<String[]>();

另外,使用String的split方法将简化行的加载。

使用动态的列表代替数组。例如:

        String[][] numbers=new String[5258][16];
List<String[]> data = new ArrayList<String[]>();

另外,使用String的split方法将简化行的加载。

您的问题是,BufferedReader通过读取文件直到文件结束,然后卡在那里。您的代码需要读取文件两次,但由于您已经达到EOF,BufferedReader仍将返回null。我倾向于通过将行填充到ArrayList中,并使用size方法获得行数来解决这个问题。源代码如下所示:

    int rowsInFile=0;
    ArrayList<String> lines = new ArrayList<String>();
    String tmp = "";
    while(tmp=bugRdr.readLine())
    {
        lines.add(tmp);
    }

    rowsInFile = lines.size();
    String[][] numbers = new String[rowsInFile][16];

    int row = 0;
    for(String line : lines)
    {
        StringTokenizer st = new StringTokenizer(line,",");
        col=0;

        while (st.hasMoreTokens()) {
        //get next token and store it in the array
            numbers[row][col] = st.nextToken();
            col++;
        }
        row++;
    }

您的问题是,BufferedReader的工作方式是一直读取文件,直到文件结束,然后就卡在那里。您的代码需要读取文件两次,但由于您已经达到EOF,BufferedReader仍将返回null。我倾向于通过将行填充到ArrayList中,并使用size方法获得行数来解决这个问题。源代码如下所示:

    int rowsInFile=0;
    ArrayList<String> lines = new ArrayList<String>();
    String tmp = "";
    while(tmp=bugRdr.readLine())
    {
        lines.add(tmp);
    }

    rowsInFile = lines.size();
    String[][] numbers = new String[rowsInFile][16];

    int row = 0;
    for(String line : lines)
    {
        StringTokenizer st = new StringTokenizer(line,",");
        col=0;

        while (st.hasMoreTokens()) {
        //get next token and store it in the array
            numbers[row][col] = st.nextToken();
            col++;
        }
        row++;
    }

我尝试添加bufRdr=new BufferedReadernew FileReaderfile;字符串[]之后[]数字=新字符串[rowsInFile][16];再次创建一个新的BufferedReader,但是我仍然得到一个空指针异常。另外,我对使用列表有点不熟悉。你介意解释一下我如何用它们来存储这些行吗?@迈克·盖茨:嗯,真奇怪。总之,我编辑了我的答案,以便使用LinkedList包含一个示例。我接受了你的答案,但是我似乎仍然无法将列表转换为字符串[]。字符串[][]arr=新字符串[numbers.size][];forint i=0;i