【问题标题】:Reading from a text file and attempting to use printWriter to write to another results in a blank file从文本文件读取并尝试使用 printWriter 写入另一个文件会导致空白文件
【发布时间】:2015-04-05 22:26:41
【问题描述】:

我的任务如下:

编写一个程序来读取附加的文本文件并写出一个单独的文本文件(使用您的名字首字母和姓氏作为文件名)。新文本文件应包含与输入文件相同的所有文本行,并添加一个行号作为该行的第一个字符。

例如:如果您的输入行显示为:

这是一个测试

你的输出应该是

  1. 这是一个测试

我已经编写了我认为主要是功能代码的内容 - 在运行它时会编译并创建一个要写入的新文件,但该文件是空白的(包含 0 个字节)。阅读问题后,我尝试确保我的 printWriter 和输入/输出流已关闭/刷新。我现在不确定我的循环是否有问题,或者我是否在错误的地方调用了 close 方法。任何帮助表示赞赏。

代码如下:

package module6lecture;

import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class ReadWriteProgram {

public static void main(String[] args) {
    try
    {
        FileInputStream fis = new FileInputStream("C:\\Users\\Reid\\Desktop\\Chapter11.txt");
        FileOutputStream fos = new FileOutputStream("C:\\Users\\Reid\\Desktop\\rulicny.txt");
        Scanner scan = new Scanner(fis);
        PrintWriter pw = new PrintWriter(fos);
        int lineNumber = 1;
        while(scan.hasNextLine());
        {
            String stringRead = scan.nextLine();
            pw.println(lineNumber + ": " + stringRead);
            lineNumber++;
        }
        pw.close();
    }
    catch(FileNotFoundException fnf)
    {
        System.out.println("Unable to find Chapter11.txt. Exiting...");
        fnf.printStackTrace();
    }
}
}

免责声明:我完全是新手。

【问题讨论】:

  • 尝试在您的代码中添加多个 println 以查看是否已到达位置。最重要的是写行。
  • 看来你的任务与this guy完全相同。

标签: java io printwriter


【解决方案1】:

while循环后面有个分号

while(scan.hasNextLine());
//                       ^

这使它成为无限循环,因为它代表空指令,就像

while(scan.hasNextLine()){}

所以你永远不会真正进入

{
    String stringRead = scan.nextLine();
    pw.println(lineNumber + ": " + stringRead);
    lineNumber++;
}

块,并在其后编写代码,这意味着您没有向结果文件写入任何内容,甚至没有关闭它。如果使用

创建空文件,您将拥有的一切
FileOutputStream fos = new FileOutputStream("C:\\Users\\Reid\\Desktop\\rulicny.txt");

所以删除这个分号。


顺便说一句,如果您让您的 IDE 为您格式化代码,您很容易发现这种错误。 Eclipse 为我将您的示例格式化为

while (scan.hasNextLine())
    ;
{
    String stringRead = scan.nextLine();
    pw.println(lineNumber + ": " + stringRead);
    lineNumber++;
}

如您所见,这表明您的循环实际上执行的是空语句而不是代码块,这非常好。

【讨论】:

  • 这似乎解决了一个问题。正在打印输出文件,但它只是在无限循环中打印输入文件的第一行。我需要做什么才能让扫描仪按顺序读取行?
  • 奇怪,删除这个额外的分号后,您的代码对我来说很好。考虑共享当前版本的代码(但不要更改原始问题,因为这会使答案不正确),例如在 pastebin.com 上发布。
  • 我对它进行了更多的调整,然后决定尝试撤消我的所有更改,直到删除分号之前的正确位置,再次删除它,你瞧,正如你所说它完美地工作。不知道我改变了什么,但无论如何都非常感谢!
【解决方案2】:

尝试在循环外预定义String stringRead

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2023-04-05
    • 2016-08-14
    • 1970-01-01
    • 2017-05-09
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多