2

我正在完成一项任务并且遇到了一些障碍。

我的程序将输出打印到屏幕上,(不是我需要的),但只打印文件的第一个条目。下面是代码片段。该文件似乎正在从输入文件中读取数据,但循环不会在第一个条目之后输出到文件。

Scanner in = new Scanner(System.in);    //Scanner object to read input from the file
System.out.println("Enter filename to read ");  //file name prompt  
String inputFileName = in.nextLine();                //line input reads next line

/*
 * TODO 2) Use an unbuffered file input stream to open listings.txt file
 * and read in property listings.
 */
Scanner reader = null;
try {
    reader = new Scanner(new File(inputFileName));
} catch (FileNotFoundException e) {

    System.out.println("Try Again");   //error window if name is null
    JOptionPane.showMessageDialog(null, "You must enter a filename", "File input error", JOptionPane.ERROR_MESSAGE);
    return;

}

PrintWriter out = new PrintWriter("agentreport.txt"); //This method prints out the file readfile.txt a word at a time
while (reader.hasNextLine()) {                      //It needs to output to the text file. Currently a file is created, but it is empty?
    Scanner s2 = new Scanner(reader.next());

    @SuppressWarnings("unused")
    boolean b;
    while (b = s2.hasNext()) {
        String output = s2.next();
        String output2 = output.toUpperCase(); //converts output to upper case
        System.out.println(output2);
        out.print(output2);  //only printing the first entry to the agentsreport.txt file. Not stepping thru the file for some reason? 
   }
4

4 回答 4

3

即使您正在使用自动刷新(在这种情况下不是这样), PrintWriter 对象也会在其内部缓冲区中输出任何内容,除非您执行以下两项操作之一:

1) 使用println(), printf(), 或format()to 方法

flush()2)每次打印时调用该方法,这样内部缓冲区中的所有数据都会被写出。

注意:该print()方法不会导致PrintWriter 对象到flush()它的缓冲区。

flush()在你打电话后尝试添加一个电话print()

split() 示例

PrintWriter out = new PrintWriter("agentreport.txt"); 
while (reader.hasNextLine()) {                    
    String words = reader.nextLine().split();

    @SuppressWarnings("unused")
    boolean b;
    for(String word : words) {
        String output = word ;
        String output2 = output.toUpperCase(); //converts output to upper case
        System.out.println(output2);
        out.print(output2);  
   }
于 2012-04-20T16:48:56.857 回答
0

尝试

out.println(output2);

http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html

当导入 system.out 以使用简码“out.println()”时,我也会使用“out”以外的 var,这可能会导致变量混淆

编辑:好点@Hunter McMillen,更改为 println,因为 append 用于 CharSequence。

于 2012-04-20T16:49:09.740 回答
0

立即跳出来的一件事是您没有正确处理您的资源。

任何时候你使用一个 IO 资源,比如读卡器/数据库连接等,你应该总是使用 finally 块关闭它,使用这种模式:

Reader reader = /* construct it however */
try {
    /* do something with the reader */
}
finally {
    reader.close();
}

如果您不这样做,则无法保证阅读器实际上会被关闭,并且您的应用程序将泄漏文件描述符/连接池连接/等,直到最终它无法再获取任何内容并且您的应用程序崩溃。(这并不总是会产生致命的后果,但这是一个非常简单的模式,您应该每次都使用它,直到它变成自动的)。

在这种情况下,您根本没有关闭您的编写器这意味着它不能保证它实际上会将其输出刷新到文件中。完全按照Writer接口写任何东西或什么都不写 - 没有刷新,你无法保证。请注意,关闭编写器将自动调用刷新,因此这是您完成后最好的选择。

所以你的代码的后半部分应该是这样的:

PrintWriter out = new PrintWriter("agentreport.txt");
try {
    // Existing code here
}
finally {
    // This closes the file and frees the descriptor, but also flushes the buffers
    out.close();
}

另外,你是如何处理IOException读写可能抛出的 s 的?您是否在某个地方抓住它们并吞下它们?如果是这样,你的代码可能会抛出一个异常,告诉你它为什么不能写,而你只是忽略它,然后看起来很困惑。

不要说得太细,错误处理可能是好的软件开发中最重要的部分。在一切正常的情况下编写可以运行的软件并不难。最具挑战性的部分是在硬盘空间不足或网络暂时中断等情况下处理好事情。

在这种情况下,最实用的方法是让异常从main方法的顶部抛出。在这种情况下,您的应用程序将“崩溃”,并且您将在控制台上收到一条堆栈跟踪 + 错误消息,这将立即表明出现了问题,并让您很好地了解它是什么。

于 2012-04-20T16:56:40.413 回答
0
try ( 
   Scanner reader = new Scanner(new File(inputFileName));
   PrintWriter writer = new PrintWriter(new FileOutputStream("agentreport.txt"), true);
) {

   while (reader.hasNextLine()) {                     
      String output = reader.nextLine().toUpperCase();
      System.out.println(output);
      writer.println(output); 
   }
} catch (FileNotFoundException e) {

   System.out.println("Try Again");   //error window if name is null
   JOptionPane.showMessageDialog(null, "You must enter a filename", "File input error", JOptionPane.ERROR_MESSAGE);

}
于 2012-04-20T16:57:33.257 回答