为什么打开和读取文件需要两个try-catch块?

时间:2018-04-07 17:56:34

标签: java file-handling

我正在尝试读取一个文件,但它要求两个try-catch块,一个用于打开文件,另一个用于读取其内容。为什么需要这个?

String line = null;
        try {
            File file = new File("F:\\Mobile Extractor.txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            while((line=reader.readLine())!=null) {
                System.out.println(line);
            }
            reader.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

3 个答案:

答案 0 :(得分:0)

<div style="margin: 10% auto 0px; width: 80%; text-align:center;"> <span style="float: left;">Number of Todos:</span> <input type="text" placeholder="input todo" style="text-align: left;"> <span style="float: right;">Number Checked</span> </div>需要try-catch阻止。

它将检查文件中的可用内容。如果没有内容,则会抛出IOException,否则将显示内容。

应该是这样的:

IOException

答案 1 :(得分:0)

如果您使用的是7之前的版本,请考虑使用finally块来避免内存泄漏并关闭流。从Java 7开始,您可以使用try with resources是最佳实践

String line = null;
File file = new File("F:\\Mobile Extractor.txt");
BufferedReader reader = null;
try {
 reader = new BufferedReader(new FileReader(file));
 while ((line = reader.readLine()) != null) {
    System.out.println(line);
 }
} catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
       if(reader!=null){
        reader.close();
        }
    } catch (IOException e) {
      e.printStackTrace();
    }
}

尝试与 - 资源:

String line = null;
File file = new File("F:\\Mobile Extractor.txt");
try(BufferedReader reader = new BufferedReader(new FileReader(file));) {
   while ((line = reader.readLine()) != null) {
   System.out.println(line);
    }
    } catch (IOException e) {
        e.printStackTrace();
} 

声明语句出现在try关键字后面的括号内。 Java SE 7及更高版本中的类BufferedReader实现了接口java.lang.AutoCloseable。因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常完成还是突然完成(由于方法BufferedReader.readLine抛出{{1},它都将被关闭}})。

答案 2 :(得分:0)

试试java8,你不需要任何东西。你可以这样做。

import java.nio.file.Files;
import java.nio.file.Paths;

Files.lines(Paths.get(path))
    .filter(l -> l.contains(searchWord)).forEach(System.out::println);