难以创建一个程序,用于在Java中读取和写入.txt文件中的2D数组

时间:2013-10-29 15:17:15

标签: java arrays file-io

对于家庭作业,我需要创建一个可以在文件中读取和写入字节数组的类。我已经成功创建了可以读写CSV和文本的类,但是当涉及到数组时我遇到了一些困难。

当我运行'readByte'方法(见下文)时,我没有收到编译器错误,相反,我无法获取要打印的文件内容。相反,控制台只显示“文件读取”,证明它已成功处理嵌套的for循环。我已经研究了各种资源但我找不到解决方案。我确信这是一个简单的错误,任何关于如何解决这个问题的建议将不胜感激。

我想读的文件内容也在下面。

第二个问题(我认为最好将两个问题放在一个帖子中),在我的'writeByte'方法中(用户将值输入到2D数组中然后打印在.txt文件中),允许我在我收到以下错误消息之前输入两个值:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at com.gc01.FileManager.ByteManager.writeByte(ByteManager.java:93)
at com.gc01.FileManager.ByteManager.main(ByteManager.java:111)

我确信它与循环如何收集用户输入有关,但我无法弄清楚如何纠正它。理想情况下,该文件看起来类似于'readByte'方法读取的文件。

我理解这个问题很长,但我碰到了一堵砖墙,所有的帮助都会非常感激!


文件内容(以标签分隔)


1     10
2     11
3     12
4     13

public class ByteManager {

public String getByteFile(){
    Scanner sc = new Scanner (System.in);
    System.out.println("Please enter the file directory of the chosen txt file?");
    System.out.println("For Example: /Users/UserName/Downloads/FileName.txt");
    ///Users/ReeceAkhtar/Desktop/FileName.txt
    final String fileName = sc.nextLine();
    System.out.println("How many columns are in the file?");
    final int columns = sc.nextInt();
    System.out.println("How many rows are in the file?");
    final int rows = sc.nextInt();
    return fileName;
    }



public void readByte(final String fileName, int rows,int columns){

BufferedReader br = null;

String[] line;
String splitBy =  "\t";
int [][] data = new int[rows] [columns];


try {
    br = new BufferedReader(new FileReader(fileName));  
        for (int i = 0; i < rows; i++){
            line = br.toString().split(splitBy);
            //data[i] [0] = Integer.parseInt(line[i]);
            for (int j = 0; j < columns; j++){
                data[i] [j] = Integer.parseInt(line[j]);
                System.out.println(data[i][j]);
            }
        }       
    } catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e) {   
        e.printStackTrace();  
    } finally {  
        if (br != null) {  
        try {  
        br.close();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }
        }
    }
    System.out.println("*****File Read*****");
}


public String chooseFileOutput(){
    Scanner sc = new Scanner (System.in);
    System.out.println("Please enter the file directory for the output of the chosen file");
    System.out.println("For Example: /Users/UserName/Downloads/FileName.txt");
    ///Users/ReeceAkhtar/Desktop/GeoIPCountryWhois.csv
    final String fileNameOUT = sc.nextLine();
    return fileNameOUT;
    }

public void writeByte(final String fileNameOUT){
    Scanner input = new Scanner (System.in);
    FileOutput createData = new FileOutput (fileNameOUT);
    System.out.println("How many rows?");
    int rowsOut = input.nextInt();
    System.out.println("How many columns?");
    int columnsOut = input.nextInt();


    System.out.println("Please enter data.");

        int newDataR = 0;
        int newDataC = 0;
        int [] [] data = new int [rowsOut] [columnsOut];    


        for (int i = 0; i < rowsOut; i++){
            createData.writeInteger(newDataR = input.nextInt());
            System.out.print("\t");
            for (int j = 0; j < columnsOut; i++){
                createData.writeInteger(newDataC = input.nextInt());
                data[i] [j] = data[newDataR] [newDataC];
                System.out.print("\t");
            } 
        }   
        createData.close();

}

public static void main(String[] args) {
    Scanner in = new Scanner (System.in);
    final ByteManager object = new ByteManager ();

    System.out.println("1 for Read File, 2 for Write file");
    String choice = in.nextLine();
    if("1".equals(choice)){
        object.readByte(object.getByteFile(), 0, 0);
    } else if ("2".equals(choice)){
        object.writeByte(object.chooseFileOutput());
    } else{
        System.out.println("Goodbye!");
        System.exit(0);
    }
}
}

3 个答案:

答案 0 :(得分:1)

关于你的第一个问题(关于无法阅读):

main方法中,以下行:

object.readByte(object.getByteFile(), 0, 0);

为要从文本文件中读取的行数和列数提供0和0。方法getByteFile()会提示用户输入多个行和列,但是它不会返回此数量,也不会对这些数字执行任何操作。您必须提示用户输入行数和列数,并将其作为readByte方法的main方法的第二和第三个参数。

此外,一般情况下,我想知道你为什么还要在int[][] datareadByte方法中创建对象writeByte。它们是无效方法,因此您不会返回int[][],也不会对其执行任何有意义的操作。你打算稍后使用这个对象吗?

答案 1 :(得分:0)

“第93行是:'data [i] [j] = data [newDataR] [newDataC];”

好的,这是你的问题。我想你的意思是:

data[i][j] = newDataC;

多维数组只是一个数组数组。当您有这样的访问权限时:

data[i][j]

这意味着您正在访问数组#i的元素#j。

data[][]是一个int数组数组,data[i]是一个int数组,data[i][j]data[i]中的int元素。

所以我建议的是检查多维数组的工作方式,然后通常会查看代码以查找这样的内容:

createData.writeInteger(newDataR = input.nextInt());

这基本上看起来毫无意义。这并不意味着作为负面评论,这条线在多维数组的上下文中没有意义,因为只有“columns”包含int元素。

答案 2 :(得分:0)

对于您的例外情况: 我不确定我的评论是否清楚,所以我会在这里试试。 你有:

for (int i = 0; i < rowsOut; i++){
    createData.writeInteger(newDataR = input.nextInt());
    System.out.print("\t");
    for (int j = 0; j < columnsOut; i++){  //do you mean to increment j here?
        createData.writeInteger(newDataC = input.nextInt());
        data[i] [j] = data[newDataR] [newDataC];
        System.out.print("\t");
    } 
} 

在你的第二个for循环中,你正在递增 i ,而不是 j 。你把它递增两次,所以你会去0,2,4 ...... 所以你几乎肯定会超过阵列的那个维度。正如Radiodef所说,我认为你会从阅读多维阵列中受益。