Ein Beschreibungsbeispiel wird angezeigt, wenn die Anweisung try-with-resources verwendet wird und wenn sie nicht verwendet wird. · Bietet Links zu nützlichen Websites, um die Try-with-Resources-Anweisung zu verstehen. -Die Try-with-Resources-Anweisung kann in Java SE 7 oder höher verwendet werden. -Die Klassen, die die Anweisung try-with-resources verwenden kann, sind auf die Implementierungsklassen der AutoCloseable-Schnittstelle und ihrer Closeable-Schnittstelle für die Unterschnittstelle beschränkt.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TryWithResources {
public static void main(String[] args) {
String inFilePath = "D:\\A.txt";
String outFilePath = "D:\\C.txt";
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(inFilePath);
out = new FileOutputStream(outFilePath);
int c;
//Daten kopieren
while ((c = in.read()) != -1) {
out.write(c);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Punkt
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TryWithResources {
public static void main(String[] args) {
String inFilePath = "D:\\A.txt";
String outFilePath = "D:\\C.txt";
try (FileInputStream in = new FileInputStream(inFilePath);
FileOutputStream out = new FileOutputStream(outFilePath);) {
int c;
//Daten kopieren
while ((c = in.read()) != -1) {
out.write(c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Punkt
Der Umfang der Variablen ist auf die try-Klausel beschränkt.
Try-with-Resources-Anweisung zur Oracle Java SE-Dokumentation TASK NOTES [Java] Syntax zum Ausprobieren mit Ressourcen try-catch-finally, try-with-resources und aufgetretene Ausnahmen
Klassen wie FileInputStream werden in der finalize-Methode geschlossen, sodass es schwierig ist, den Fehler von Ressourcenfreigabe-Lecks zu bemerken (oder zu passieren). Es ist jedoch ineffizient und keine gute Praxis, die Öffnung dem GC zu überlassen. Verwenden Sie daher Try-with-Resources.
FileInputStream.java
package java.io;
import java.nio.channels.FileChannel;
import sun.nio.ch.FileChannelImpl;
public
class FileInputStream extends InputStream
{
===========================Kürzung===========================
/**
* Closes this file input stream and releases any system resources
* associated with the stream.
*
* <p> If this stream has an associated channel then the channel is closed
* as well.
*
* @exception IOException if an I/O error occurs.
*
* @revised 1.4
* @spec JSR-51
*/
public void close() throws IOException {
synchronized (closeLock) {
if (closed) {
return;
}
closed = true;
}
if (channel != null) {
channel.close();
}
fd.closeAll(new Closeable() {
public void close() throws IOException {
close0();
}
});
}
===========================Kürzung===========================
/**
* Ensures that the <code>close</code> method of this file input stream is
* called when there are no more references to it.
*
* @exception IOException if an I/O error occurs.
* @see java.io.FileInputStream#close()
*/
protected void finalize() throws IOException {
if ((fd != null) && (fd != FileDescriptor.in)) {
/* if fd is shared, the references in FileDescriptor
* will ensure that finalizer is only called when
* safe to do so. All references using the fd have
* become unreachable. We can call close()
*/
close();
}
}
}
Recommended Posts