我有三个程序要为我的面向对象编程课程编写,所有程序都涉及文件输入/输出,每个程序都没有编译错误,但是他们没有在运行时做到他们应该做的事情(他们没有'打印到outFile,就像他们应该的那样)。
我知道正在读取输入文件并将其保存在正确的位置,因为Eclipse会指出其中任何一个都不是这种情况。
此外,我(据我所知)没有提交任何常见错误,包括不包括关闭读/写文件的抛出异常。
我在这里附加了我的第一个i / o作业,希望其他文件有类似的错误,一旦我弄清楚这个错误,我就能解决。
import java.io.*;
public class GreenK4_Lab8 {
public static void main(String[] args) throws IOException {
int[] numbers = new int[countLines()];
int i = 0;
for(i = 0; i < numbers.length; i++) {
numbers[i] = readValues(i);
}
printOdd(numbers);
}
public static int countLines() throws IOException {
BufferedReader inFile = new BufferedReader(
new FileReader( "Lab8_TestFile.txt" ) );
int lineNumber = 1;
String nextLine = inFile.readLine();
while( nextLine != null ) {
lineNumber ++;
}
inFile.close();
return lineNumber;
}
public static int readValues(int number) throws IOException {
BufferedReader inFile = new BufferedReader(
new FileReader( "Lab8_TestFile.txt" ) );
int value = 0;
for(int i = 0; i < number; i++) {
String nextLine = inFile.readLine();
value = Integer.parseInt( nextLine );
}
inFile.close();
return value;
}
public static void printOdd(int[] array) throws IOException {
PrintWriter outFile = new PrintWriter( "results.out" );
for(int i = 0; i < array.length; i++) {
int value = array[i];
if( value % 2 != 0)
outFile.println( value );
}
outFile.close();
}
}
以下是Lab8_TestFile.txt的内容
4
6
2
10
8
1
-1
-2147483648
2147483647
5
9
3
7
-7
答案 0 :(得分:0)
正如其他评论者指出的那样,从
更改countLines函数中的代码 String nextLine = inFile.readLine();
while( nextLine != null ) {
lineNumber ++;
}
到
while (inFile.readLine() != null) {
lineNumber ++;
}
通过此更改,您的程序可以按预期工作。
答案 1 :(得分:0)
您的代码存在多处问题。让我们从头开始:你的countLines
方法不能按预期工作,并且会创建一个无限循环,因为你的while条件永远不会被评估为false
(除非你的文件为空): / p>
// String nextLine = inFile.readLine();
// while(nextLine != null) {
while (inFile.readLine() != null) {
lineNumber++;
}
您可能需要检查Number of lines in a file in Java以获取检索文件行数的速度更快,效果更好的版本。
此外,您的readValues
函数会为其想要读取的每一行打开文件,读取文件直到该行并再次关闭文件 - &gt;的 BAD 即可。你应该做的是以下几点:
public static void readValues(int[] contentsOfFile) throws IOException {
BufferedReader inFile = new BufferedReader(new FileReader("Lab8_TestFile.txt"));
for(int i = 0; i < contentsOfFile.length; i++) {
String nextLine = inFile.readLine();
contentsOfFile[i] = Integer.parseInt( nextLine );
}
inFile.close();
}
然而,由于你依赖一个足够大的int数组来传递,所以这并不是很好。如果你仍然希望将行数与读取值分开,那么这样做,但是让readValues
自己处理适当的阅读。这可能会导致类似:
public static ArrayList<Integer> readValues() throws IOException {
BufferedReader inFile = new BufferedReader(new FileReader("Lab8_TestFile.txt"));
ArrayList<Integer> integerContents = new ArrayList<>();
String nextLine = null;
while ((nextLine = inFile.readLine()) != null) {
integerContents.add(Integer.parseInt(nextLine));
}
inFile.close();
return integerContents;
}
这样,您只需解析文件一次即可读取值。如果你需要返回一个int [],请查看How to convert an ArrayList containing Integers to primitive int array?以了解如何从给定的数据结构中提取它。
您的主要功能可能会导致类似:
public static void main(String[] args) throws IOException {
int numberOfLines = countLines(); // technically no longer needed.
int[] intContents = convertIntegers(readValues());
printOdd(intContents);
}