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

Java 为什么打开和读取文件需要两个try-catch块?,java,file-handling,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((l

我试图读取一个文件,但它要求两个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();
        }

IOException
需要
try-catch

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

应该是这样的:

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

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

如果您使用的是7之前的版本,请考虑使用
finally
块以避免内存泄漏并关闭流。从Java7开始,您可以使用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关键字后面的括号内。JavaSE7及更高版本中的类
BufferedReader
实现了接口
Java.lang.AutoCloseable
。由于
BufferedReader
实例是在
try with resource
语句中声明的,因此无论try语句是正常完成还是突然完成(由于方法
BufferedReader.readLine
抛出
IOException
),它都将关闭。

try 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);

请在问题中插入您的代码请添加您的代码而不是图像。您可以通过粘贴它来实现这一点,请确保跳过一行并使用ctrl+K缩进所有代码。我已附加了一个图像。我试图上传代码,但它给出了缩进错误。我已经上传了代码。它还要求为while循环添加try-catch块。是的,我知道它将在没有try-catch块的情况下引发IO异常,但为什么需要两个try-catch块?在添加
throws-IOException
子句之前,它不会引发任何异常。一个try-catch块用于读取文件,另一个用于检查文件的存在性。函数式编程可以避免编写大量的锅炉板代码。