对于家庭作业,我需要创建一个可以在文件中读取和写入字节数组的类。我已经成功创建了可以读写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);
}
}
}
答案 0 :(得分:1)
关于你的第一个问题(关于无法阅读):
在main
方法中,以下行:
object.readByte(object.getByteFile(), 0, 0);
为要从文本文件中读取的行数和列数提供0和0。方法getByteFile()
会提示用户输入多个行和列,但是它不会返回此数量,也不会对这些数字执行任何操作。您必须提示用户输入行数和列数,并将其作为readByte
方法的main
方法的第二和第三个参数。
此外,一般情况下,我想知道你为什么还要在int[][] data
和readByte
方法中创建对象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所说,我认为你会从阅读多维阵列中受益。