/** *Finalizershouldn'tdiscardafiledescriptoruntilallstreamshave *finishedwithit.
*/ privatestaticvoid TestFinalizer() throws Exception {
FileDescriptor fd = null;
File tempFile = new File("TestFinalizer1.txt");
tempFile.deleteOnExit(); try (Writer writer = new FileWriter(tempFile)) { for (int i=0; i<5; i++) {
writer.write("test file content test file content");
}
}
FileInputStream fis1 = new FileInputStream(tempFile);
fd = fis1.getFD(); // Create a new FIS based on the existing FD (so the two FIS's share the same native fd) try (FileInputStream fis2 = new FileInputStream(fd)) { // allow fis1 to be gc'ed
fis1 = null; int ret = 0; while(ret >= 0) { // encourage gc
System.gc(); // read from fis2 - when fis1 is gc'ed and finalizer is run, read will fail
System.out.print(".");
ret = fis2.read();
}
}
// variation of above. Use RandomAccessFile to obtain a filedescriptor
File testFinalizerFile = new File("TestFinalizer");
RandomAccessFile raf = new RandomAccessFile(testFinalizerFile, "rw");
raf.writeBytes("test file content test file content");
raf.seek(0L);
fd = raf.getFD(); try (FileInputStream fis3 = new FileInputStream(fd)) { // allow raf to be gc'ed
raf = null; int ret = 0; while (ret >= 0) { // encourage gc
System.gc(); /* *readfromfis3-whenrafisgc'edandfinalizerisrun, *fdshouldstillbevalid.
*/
System.out.print(".");
ret = fis3.read();
}
} finally {
testFinalizerFile.delete();
}
}
File test1 = new File("test1"); try {
raf = new RandomAccessFile(test1, "rw");
fos = new FileOutputStream(raf.getFD());
fis = new FileInputStream(raf.getFD());
fc = raf.getChannel();
fileLock = fc.lock();
raf.setLength(0L);
fos.flush();
fos.write("TEST".getBytes());
} finally { if (fileLock != null) fileLock.release(); if (fis != null) fis.close(); if (fos != null) fos.close(); if (raf != null) raf.close();
test1.delete();
}
/* *CloseoutindifferentordertoensureFDisnot *closedouttooearly
*/
File test2 = new File("test2"); try {
raf = new RandomAccessFile(test2, "rw");
fos = new FileOutputStream(raf.getFD());
fis = new FileInputStream(raf.getFD());
fc = raf.getChannel();
fileLock = fc.lock();
raf.setLength(0L);
fos.flush();
fos.write("TEST".getBytes());
} finally { if (fileLock != null) fileLock.release(); if (raf != null) raf.close(); if (fos != null) fos.close(); if (fis != null) fis.close();
test2.delete();
}
// one more time, fos first this time
File test3 = new File("test3"); try {
raf = new RandomAccessFile(test3, "rw");
fos = new FileOutputStream(raf.getFD());
fis = new FileInputStream(raf.getFD());
fc = raf.getChannel();
fileLock = fc.lock();
raf.setLength(0L);
fos.flush();
fos.write("TEST".getBytes());
} finally { if (fileLock != null) fileLock.release(); if (fos != null) fos.close(); if (raf != null) raf.close(); if (fis != null) fis.close();
test3.delete();
}
}
File test1 = new File("test1"); try {
raf = new RandomAccessFile(test1, "rw");
fd = raf.getFD();
fos = new FileOutputStream(fd);
fis = new FileInputStream(fd);
} finally { try { if (fis != null) fis.close(); if (fd.valid()) { thrownew RuntimeException("[FIS close()] FileDescriptor shouldn't be valid");
} if (fos != null) fos.close(); if (raf != null) raf.close();
} finally {
test1.delete();
}
}
/* *CloseoutindifferentordertoensureFDis *closedcorrectly.
*/
File test2 = new File("test2"); try {
raf = new RandomAccessFile(test2, "rw");
fd = raf.getFD();
fos = new FileOutputStream(fd);
fis = new FileInputStream(fd);
} finally { try { if (raf != null) raf.close(); if (fd.valid()) { thrownew RuntimeException("[RAF close()] FileDescriptor shouldn't be valid");
} if (fos != null) fos.close(); if (fis != null) fis.close();
} finally {
test2.delete();
}
}
// one more time, fos first this time
File test3 = new File("test3"); try {
raf = new RandomAccessFile(test3, "rw");
fd = raf.getFD();
fos = new FileOutputStream(fd);
fis = new FileInputStream(fd);
} finally { try { if (fos != null) fos.close(); if (fd.valid()) { thrownew RuntimeException("[FOS close()] FileDescriptor shouldn't be valid");
} if (raf != null) raf.close(); if (fis != null) fis.close();
} finally {
test3.delete();
}
}
}
/** *TestconcurrentaccesstothesameFileDescriptor
*/ privatestaticvoid MultiThreadedFD() throws Exception {
RandomAccessFile raf = null;
FileDescriptor fd = null; int numThreads = 2;
CountDownLatch done = new CountDownLatch(numThreads);
OpenClose[] fileOpenClose = new OpenClose[numThreads];
File MultipleThreadedFD = new File("MultipleThreadedFD"); try {
raf = new RandomAccessFile(MultipleThreadedFD, "rw");
fd = raf.getFD(); for(int count=0;count<numThreads;count++) {
fileOpenClose[count] = new OpenClose(fd, done);
fileOpenClose[count].start();
}
done.await();
} finally { try { if(raf != null) raf.close(); // fd should now no longer be valid if(fd.valid()) { thrownew RuntimeException("FileDescriptor should not be valid");
} // OpenClose thread tests failed if(fail) { thrownew RuntimeException("OpenClose thread tests failed.");
}
} finally {
MultipleThreadedFD.delete();
}
}
}
/** *TestcloseAllhandlinginFileDescriptor
*/ privatestaticvoid TestCloseAll() throws Exception {
File testFile = new File("test");
testFile.deleteOnExit();
RandomAccessFile raf = new RandomAccessFile(testFile, "rw");
FileInputStream fis = new FileInputStream(raf.getFD());
fis.close(); if (raf.getFD().valid()) { thrownew RuntimeException("FD should not be valid.");
}
// Test the suppressed exception handling - FileInputStream
raf = new RandomAccessFile(testFile, "rw");
fis = new FileInputStream(raf.getFD());
BadFileInputStream bfis1 = new BadFileInputStream(raf.getFD());
BadFileInputStream bfis2 = new BadFileInputStream(raf.getFD());
BadFileInputStream bfis3 = new BadFileInputStream(raf.getFD()); // extra test - set bfis3 to null
bfis3 = null; try {
fis.close();
} catch (IOException ioe) {
ioe.printStackTrace(); if (ioe.getSuppressed().length != 2) { thrownew RuntimeException("[FIS]Incorrect number of suppressed " + "exceptions received : " + ioe.getSuppressed().length);
}
} if (raf.getFD().valid()) { // we should still have closed the FD // even with the exception. thrownew RuntimeException("[FIS]TestCloseAll : FD still valid.");
}
// Now test with FileOutputStream
raf = new RandomAccessFile(testFile, "rw");
FileOutputStream fos = new FileOutputStream(raf.getFD());
BadFileOutputStream bfos1 = new BadFileOutputStream(raf.getFD());
BadFileOutputStream bfos2 = new BadFileOutputStream(raf.getFD());
BadFileOutputStream bfos3 = new BadFileOutputStream(raf.getFD()); // extra test - set bfos3 to null
bfos3 = null; try {
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace(); if (ioe.getSuppressed().length != 2) { thrownew RuntimeException("[FOS]Incorrect number of suppressed " + "exceptions received : " + ioe.getSuppressed().length);
}
} if (raf.getFD().valid()) { // we should still have closed the FD // even with the exception. thrownew RuntimeException("[FOS]TestCloseAll : FD still valid.");
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.