Java文件处理,我做错了什么?

时间:2010-05-27 18:45:24

标签: java filehandle

为Java Homework任务编写了一个基本文件处理程序,当我收到作业后,我有一些关于未能捕获一些实例的注释:

  • 文件中的缓冲区可能为空。
  • 找不到档案
  • 文件流未关闭

以下是用于打开文件的代码块:

/**
 * Create a Filestream, Buffer, and a String to store the Buffer.
 */
FileInputStream fin = null;
BufferedReader buffRead = null;
String loadedString = null;

/** Try to open the file from user input */
try
{
    fin = new FileInputStream(programPath + fileToParse);
    buffRead = new BufferedReader(new InputStreamReader(fin));
    loadedString = buffRead.readLine();
    fin.close();
}
/** Catch the error if we can't open the file */
catch(IOException e)
{
    System.err.println("CRITICAL: Unable to open text file!");
    System.err.println("Exiting!");
    System.exit(-1);
}

我从他那里得到的一个评论是fin.close();需要在finally块中,我根本没有。但我认为我创建try / catch的方式可以避免文件无法打开的问题。

让我明白一些事情:这不适用于当前的任务(不是试图让某人做我自己的工作),我已经创建了我的项目并且已经对它进行了评分。我自己并不完全理解教授的推理。最后,我没有很多Java经验,所以我有点困惑为什么我的catch不够好。

4 个答案:

答案 0 :(得分:7)

  
      
  • 来自文件的缓冲区可能为空。
  •   

该文件可能为空。也就是说,打开文件时会到达文件结尾。然后loadedString = buffRead.readLine()将返回null。

也许您应该通过添加if (loadedString == null) loadedString = "";

之类的内容来修复此问题
  
      
  • 找不到文件
  •   

正如FileInputStream(String)的构造函数的文档中所解释的那样,它可能会抛出FileNotFoundException。您确实在IOException子句中发现了这一点(因为FileNotFoundException IOException),所以没关系,但您可能已经做过:

} catch (FileNotFoundException fnfe) {
    System.err.println("File not fonud!");
} catch (IOException ioex {
    System.err.println("Some other error");
}
  
      
  • 文件流未关闭
  •   

您可以调用fin.close(),这在正常情况下会关闭文件流。也许他意味着总是关闭。 readLine可能会抛出IOException,在这种情况下会跳过close()。这就是将它放在finally子句中的原因(无论try - 块中发生什么,都可以确保它被调用。(*)


(*)正如@mmyers正确指出的那样,将close()置于finally块中实际上是不够的,因为您在System.exit(-1) - 块中调用了catch 。如果这确实是所需的行为,您可以在catch子句中设置错误标志,如果设置了此标志,则在finally子句之后退出。

答案 1 :(得分:3)

但是如果你的程序在try块的第二行或第三行引发异常怎么办?

buffRead = new BufferedReader(new InputStreamReader(fin));
loadedString = buffRead.readLine();

此时,已打开文件句柄并将其分配给fin。您可以捕获异常,但文件句柄将保持打开状态。

您需要将fin.close()语句移至finally块:

} finally {
    try {
        if (fin != null) {
            fin.close();
        }
    } catch (IOException e2) {
    }
}

答案 2 :(得分:1)

buffRead.readLine()会抛出异常,您的FileInputStream会被关闭,还是会跳过该行? finally块的目的是即使在异常情况下,finally块中的代码也会执行。

答案 3 :(得分:0)

除了打开文件之外,还有许多其他错误可能发生。

最后,您可能会得到一个已定义或未定义的fin,您必须防止空指针错误,并且不要忘记关闭文件可能会抛出新的异常。

我的建议是在一个单独的例程中捕获它,让IOExceptions飞出它:

类似

private String readFile() throws IOException {
  String s;
  try {
    fin = new FileInputStream(programPath + fileToParse);
    buffRead = new BufferedReader(new InputStreamReader(fin));
    s = buffRead.readLine();
    fin.close();
  } finally {
    if (fin != null {
       fin.close()
    }
  }
  return s
}

然后你需要的地方:

try {
   loadedString = readFile();
} catch (IOException e) {
   // handle issue gracefully
}