资源是实现AutoClosable接口的对象。每当您在程序中使用资源时,建议在使用后将其关闭。
最初,此任务是使用finally块完成的。
import java.io.File; import html" target="_blank">java.io.FileInputStream; import java.io.IOException; import java.util.Scanner; public class FinalExample { public static void main(String[] args) throws IOException { File file = null; FileInputStream inputStream = null; try { file = new File("D:\\source\\sample.txt"); inputStream = new FileInputStream(file); Scanner sc = new Scanner(inputStream); while(sc.hasNextLine()) { System.out.println(sc.nextLine()); } } catch(IOException ioe) { ioe.printStackTrace(); } finally { inputStream.close(); } } }
This is a sample file with sample text
Java中的ARM代表自动资源管理,它是在Java7中引入的,其中资源应在try块中声明,并且资源将在该块末尾自动关闭。这也称为尝试资源块,我们在其中声明的对象应该是资源,即它们应该是AutoClosable类型。
以下是try-with-resources语句的语法-
try(ClassName obj = new ClassName()){ //代码…… }
从JSE7开始,引入了try-with-resources语句。在这种情况下,我们在try块中声明一个或多个资源,这些资源在使用后将自动关闭。(在try块的末尾)
我们在try块中声明的资源应扩展java.lang.AutoCloseable类。
Following program demonstrates the try-with-resources in Java. import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Scanner; public class FinalExample { public static void main(String[] args) throws IOException { try(FileInputStream inputStream = new FileInputStream(new File("D:\\source\\sample.txt"));) { Scanner sc = new Scanner(inputStream); while(sc.hasNextLine()) { System.out.println(sc.nextLine()); } } catch(IOException ioe) { ioe.printStackTrace(); } } }
This is a sample file with sample text
您还可以在try-with资源中声明多个资源,它们将在块末尾立即关闭。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopying { public static void main(String[] args) { try(FileInputStream inS = new FileInputStream(new File("E:\\Test\\sample.txt")); FileOutputStream outS = new FileOutputStream(new File("E:\\Test\\duplicate.txt"))){ byte[] buffer = new byte[1024]; int length; while ((length = inS.read(buffer)) > 0) { outS.write(buffer, 0, length); } System.out.println("File copied successfully!!"); } catch(IOException ioe) { ioe.printStackTrace(); } } }
File copied successfully!!
它们的编译方式不同吗?
问题内容: 除了让编译器检查超类是否具有该方法之外,是否有任何其他理由来注释方法? 问题答案: 如您所描述的,@ Override创建一个编译时检查,以确保方法被覆盖。这对于确保尝试覆盖时不会出现愚蠢的签名问题非常有用。 例如,我看到以下错误: 此类按编写方式进行编译,但是将@Override标记添加到equals方法将导致编译错误,因为它不会覆盖Object上的equals方法。这是一个简单的错
问题内容: 我正在研究Java代码,我需要在其中实现线程。我正在通过JAVA 8 API,我了解了Stamped Locks。谁能告诉我为什么在多线程中使用StampedLocks? 提前致谢。 问题答案: StampedLock是使用ReadWriteLock(由ReentrantReadWriteLock实现)的替代方法。StampedLock和ReentrantReadWriteLock之间
问题内容: 它们之间有什么区别? 是Integer类型的数组列表。 版本1: 版本2: 问题答案: 将返回,然后调用它将返回整数作为type 。 转换的到被称为 拳击 。 将转换为的操作称为 拆箱,依次 类推,以便在其他原始类型及其对应的Wrapper类之间进行转换。 从Java 5开始,它将自动为您进行所需的转换(自动装箱),因此, 如果您使用的是Java 5或更高版本,则示例之间没有区别 。
问题内容: 是否确实有一些功能,或者它只是有点对此有何评论? 问题答案: 从有关注解的Java教程中: — 注释告知编译器该元素旨在覆盖超类中声明的元素(覆盖方法将在名为“接口与继承”的课程中进行讨论)。 虽然在重写方法时不需要使用此批注,但它有助于防止错误。如果标有的方法无法正确覆盖其父类之一中的方法,则编译器将生成错误。 让我们看一下Java语言规范9.6.1.4 Override中 给出的示
问题内容: 我写了这段代码: 我得到这个: 为什么?的定义是什么? 问题答案: 在Java中,当您输入一个十进制数为时,它被解释为。是64位精度的IEEE 754浮点,而32位精度的IEEE 754浮点。由于a 的精确度低于a ,因此无法隐式执行转换。 如果要创建浮点数,则应以(。:) 结尾。 有关更多说明,请参见Java教程的原始数据类型定义。