为什么不应该将新的File()放入try块,但新的FileReader(" input.txt")应该在try块中?

时间:2016-03-04 23:37:25

标签: java

我正在学习如何在java中读取文件。这种差异困扰着我。我认为有一些重要的区别,我不太清楚。

File inputFile = new File("input.txt");
// is perfect fine even if input.txt doesn't exist. Why?

// but
FileReader fr = new FileReader("input.txt");
// should be put into try.. catch block?? or compiler error

4 个答案:

答案 0 :(得分:4)

因为new FileReader("file")会抛出已检查的异常FileNotFoundExceptionnew File("file")不会。{/ p>

请注意,new File不检查文件是否确实存在,FileReader在哪里。

答案 1 :(得分:1)

因为File只是表示文件名的对象:

  

文件和目录路径名的抽象表示。

虽然FileReader是用于读取文件内容的开放资源,但实现了AutoCloseable

  

不再需要时必须关闭的资源。

答案 2 :(得分:1)

技术原因是因为一个构造函数抛出非运行时异常而另一个不抛出。

至于为什么?也许是因为File类只是文件系统路径名的抽象。文件是否存在于该路径中并不重要。 FileReader封装了对实际文件系统对象的读取操作,如果该文件不存在或者无法打开以进行读取,则会引发异常。

答案 3 :(得分:0)

<div ng-repeat="photo in controller.pendingPhotos" class="mdl-card photo-frame mdl-card--border mdl-shadow--4dp"> <div class="mdl-card__title"> {{photo.file.name}} </div> <div class="img-placeholder mdl-card__media"> <div ng-if="!photo.content" class="mdl-spinner mdl-js-spinner is-active" mdl-upgrade ></div> <img class="img-preview" ng-if="photo.content" ng-src="{{photo.content}}"/> </div> <div class="mdl-card__supporting-text" ng-if="photo.response"> {{controller.formatResponse(photo.response)}} </div> </div> 尚未提交给实际文件。因此,您可以测试文件是否存在,或者打开文件以便稍后写入。虽然File("input.txt")实际上尝试打开命名文件进行读取,因此可以抛出异常。