|
Java example source code file (Basic.java)
The Basic.java Java example source code/* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test * @bug 4607272 6822643 6830721 6842687 * @summary Unit test for AsynchronousFileChannel */ import java.nio.file.*; import java.nio.channels.*; import java.nio.ByteBuffer; import java.io.File; import java.io.IOException; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import static java.nio.file.StandardOpenOption.*; public class Basic { private static final Random rand = new Random(); public static void main(String[] args) throws IOException { // create temporary file File blah = File.createTempFile("blah", null); blah.deleteOnExit(); AsynchronousFileChannel ch = AsynchronousFileChannel .open(blah.toPath(), READ, WRITE); try { // run tests testUsingCompletionHandlers(ch); testUsingWaitOnResult(ch); testInterruptHandlerThread(ch); } finally { ch.close(); } // run test that expects channel to be closed testClosedChannel(ch); // these tests open the file themselves testLocking(blah.toPath()); testCustomThreadPool(blah.toPath()); testAsynchronousClose(blah.toPath()); testCancel(blah.toPath()); testTruncate(blah.toPath()); // eagerly clean-up blah.delete(); } /* * Generate buffer with random contents * Writes buffer to file using a CompletionHandler to consume the result * of each write operation * Reads file to EOF to a new buffer using a CompletionHandler to consume * the result of each read operation * Compares buffer contents */ static void testUsingCompletionHandlers(AsynchronousFileChannel ch) throws IOException { System.out.println("testUsingCompletionHandlers"); ch.truncate(0L); // generate buffer with random elements and write it to file ByteBuffer src = genBuffer(); writeFully(ch, src, 0L); // read to EOF or buffer is full ByteBuffer dst = (rand.nextBoolean()) ? ByteBuffer.allocateDirect(src.capacity()) : ByteBuffer.allocate(src.capacity()); readAll(ch, dst, 0L); // check buffers are the same src.flip(); dst.flip(); if (!src.equals(dst)) { throw new RuntimeException("Contents differ"); } } /* * Generate buffer with random contents * Writes buffer to file, invoking the Future's get method to wait for * each write operation to complete * Reads file to EOF to a new buffer, invoking the Future's get method to * wait for each write operation to complete * Compares buffer contents */ static void testUsingWaitOnResult(AsynchronousFileChannel ch) throws IOException { System.out.println("testUsingWaitOnResult"); ch.truncate(0L); // generate buffer ByteBuffer src = genBuffer(); // write buffer completely to file long position = 0L; while (src.hasRemaining()) { Future<Integer> result = ch.write(src, position); try { int n = result.get(); // update position position += n; } catch (ExecutionException x) { throw new RuntimeException(x.getCause()); } catch (InterruptedException x) { throw new RuntimeException(x); } } // read file into new buffer ByteBuffer dst = (rand.nextBoolean()) ? ByteBuffer.allocateDirect(src.capacity()) : ByteBuffer.allocate(src.capacity()); position = 0L; int n; do { Future<Integer> result = ch.read(dst, position); try { n = result.get(); // update position if (n > 0) position += n; } catch (ExecutionException x) { throw new RuntimeException(x.getCause()); } catch (InterruptedException x) { throw new RuntimeException(x); } } while (n > 0); // check buffers are the same src.flip(); dst.flip(); if (!src.equals(dst)) { throw new RuntimeException("Contents differ"); } } // exercise lock methods static void testLocking(Path file) throws IOException { System.out.println("testLocking"); AsynchronousFileChannel ch = AsynchronousFileChannel .open(file, READ, WRITE); FileLock fl; try { // test 1 - acquire lock and check that tryLock throws // OverlappingFileLockException try { fl = ch.lock().get(); } catch (ExecutionException x) { throw new RuntimeException(x); } catch (InterruptedException x) { throw new RuntimeException("Should not be interrupted"); } if (!fl.acquiredBy().equals(ch)) throw new RuntimeException("FileLock#acquiredBy returned incorrect channel"); try { ch.tryLock(); throw new RuntimeException("OverlappingFileLockException expected"); } catch (OverlappingFileLockException x) { } fl.release(); // test 2 - acquire try and check that lock throws OverlappingFileLockException fl = ch.tryLock(); if (fl == null) throw new RuntimeException("Unable to acquire lock"); try { ch.lock((Void)null, new CompletionHandler<FileLock,Void> () { public void completed(FileLock result, Void att) { } public void failed(Throwable exc, Void att) { } }); throw new RuntimeException("OverlappingFileLockException expected"); } catch (OverlappingFileLockException x) { } } finally { ch.close(); } // test 3 - channel is closed so FileLock should no longer be valid if (fl.isValid()) throw new RuntimeException("FileLock expected to be invalid"); } // interrupt should not close channel static void testInterruptHandlerThread(final AsynchronousFileChannel ch) { System.out.println("testInterruptHandlerThread"); ByteBuffer buf = ByteBuffer.allocateDirect(100); final CountDownLatch latch = new CountDownLatch(1); ch.read(buf, 0L, (Void)null, new CompletionHandler<Integer,Void>() { public void completed(Integer result, Void att) { try { Thread.currentThread().interrupt(); long size = ch.size(); latch.countDown(); } catch (IOException x) { x.printStackTrace(); } } public void failed(Throwable exc, Void att) { } }); // wait for handler to complete await(latch); } // invoke method on closed channel static void testClosedChannel(AsynchronousFileChannel ch) { System.out.println("testClosedChannel"); if (ch.isOpen()) throw new RuntimeException("Channel should be closed"); ByteBuffer buf = ByteBuffer.allocateDirect(100); // check read fails with ClosedChannelException try { ch.read(buf, 0L).get(); throw new RuntimeException("ExecutionException expected"); } catch (ExecutionException x) { if (!(x.getCause() instanceof ClosedChannelException)) throw new RuntimeException("Cause of ClosedChannelException expected"); } catch (InterruptedException x) { } // check write fails with ClosedChannelException try { ch.write(buf, 0L).get(); throw new RuntimeException("ExecutionException expected"); } catch (ExecutionException x) { if (!(x.getCause() instanceof ClosedChannelException)) throw new RuntimeException("Cause of ClosedChannelException expected"); } catch (InterruptedException x) { } // check lock fails with ClosedChannelException try { ch.lock().get(); throw new RuntimeException("ExecutionException expected"); } catch (ExecutionException x) { if (!(x.getCause() instanceof ClosedChannelException)) throw new RuntimeException("Cause of ClosedChannelException expected"); } catch (InterruptedException x) { } } // exercise custom thread pool static void testCustomThreadPool(Path file) throws IOException { System.out.println("testCustomThreadPool"); // records threads that are created final List<Thread> threads = new ArrayList Other Java examples (source code examples)Here is a short list of links related to this Java Basic.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.