Java输入和输出

3

我是Java的新手。我有一个来自学校的练习,需要创建一个BasicIO类和Main类来读写文件。

然而,我的代码只能读取第一句话并在无限循环中打印它。

BasicIO.java

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class BasicIO 
{

    BasicIO()
    {
        line = null;
    }

    public void readplzthx(String filename) throws IOException
    {
        FileReader f = null;
        BufferedReader rd = null;

        f = new FileReader(filename);
        rd = new BufferedReader(f);

        line = rd.readLine();   
        rd.close();
        f.close();
    }

    public void writeplzthx(String filename)
    {

    }
    //String fn;
    String line;
}

Main.java:

import java.io.File;
import java.io.IOException;

public class Main {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException
    {
        File f = new File("test.txt");
        BasicIO io = new BasicIO();
        //io.readplzthx(f.getAbsolutePath());
        //File f = new File(args[1]);
        io.readplzthx(f.getAbsolutePath());
        do
        {
        //  io.readplzthx(f.getAbsolutePath());
            System.out.println(io.line);
        } while (io.line != null);
    }   

}
5个回答

2
    do
    {
    //  io.readplzthx(f.getAbsolutePath());
        System.out.println(io.line);
    } while (io.line != null);

这就是你的无限循环。在循环中,io.line 的值不会改变。

即使修复了这个问题,你仍然会遇到同样的问题。你只需要打开文件一次,然后重复读取它。


看起来他注释掉了有问题的代码。真正的问题是readplzthnx方法总是从文件中返回相同的行(第一行)。 - Barry

1

三个提示:

  • readplzthx 每次调用时不应重新打开文件;
  • 在循环内调用 readplzthx,以便在每次迭代中读取新行;
  • 确保你正确处理到达输入文件的末尾。

1

你在每次循环迭代时重新加载文件。你应该在循环之前创建读取器,然后在循环迭代中调用reader.readLine(),这样你的io.line值就不总是第一行。


他的readplzthnx方法打开文件,读取一行,然后关闭文件。因此,每次循环时他都会重复获取相同的第一行。 - Barry

1
你遇到问题的原因是你打开文件,读取第一行,然后关闭了它。在调用readplzthx时需要保持文件处于打开状态,并在完成后清理文件。

好的,谢谢。我觉得我太依赖教程了,所以我让这个练习变得更加困难了。他们说我必须在Main类中打印输出。实际上,在readplzthx()中打印内容才是我一开始应该做的事情。 - Dung

0
在你的readplzthx方法中,你打开文件,读取一行,然后关闭文件。这就是第一个问题。这就是为什么你只得到一行。
你将类的包私有成员line设置为从文件中读取的行。你的do-while循环基于条件io.line不为空。这将始终保持真实。这就是为什么你陷入了无限循环。
所以这里有一些关于你的BasicIO类的提示:
  • 编写显式方法来打开和关闭文件/流。
  • 编写一个状态检查方法,告诉您是否已到达文件结尾,或者是否还有更多内容可读取。您可以在while循环中使用它。
  • 编写一个从当前打开的文件返回一行的方法;您可以在循环内部使用它。
现在你需要做的就是把这三个部分组合起来。
祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接