1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio.channels; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.MappedByteBuffer; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.spi.AbstractInterruptibleChannel; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An abstract channel type for interaction with a platform file. 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@code FileChannel} defines the methods for reading, writing, memory 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mapping, and manipulating the logical state of a platform file. This type 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not have a method for opening files, since this behavior has been 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * delegated to the {@link java.io.FileInputStream}, 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link java.io.FileOutputStream} and {@link java.io.RandomAccessFile} types. 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FileChannels created from a {@code FileInputStream} or a 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RandomAccessFile} created in mode "r", are read-only. FileChannels 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * created from a {@code FileOutputStream} are write-only. FileChannels created 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from a {@code RandomAccessFile} created in mode "rw" are read/write. 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FileChannels created from a {@code RandomAccessFile} that was opened in 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * append-mode will also be in append-mode -- meaning that each write will be 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * proceeded by a seek to the end of file. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FileChannels have a virtual pointer into the file which is referred to as a 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * file <em>position</em>. The position can be manipulated by moving it 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * within the file, and the current position can be queried. 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FileChannels also have an associated <em>size</em>. The size of the file 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is the number of bytes that it currently contains. The size can be 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * manipulated by adding more bytes to the end of the file (which increases the 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size) or truncating the file (which decreases the size). The current size can 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * also be queried. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FileChannels have operations beyond the simple read, write, and close. They 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can also: 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>request that cached data be forced onto the disk,</li> 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>lock ranges of bytes associated with the file,</li> 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>transfer data directly to another channel in a manner that has the 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * potential to be optimized by the platform,</li> 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>memory-mapping files into NIO buffers to provide efficient manipulation 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of file data,</li> 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>read and write to the file at absolute byte offsets in a fashion that 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not modify the current position.</li> 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FileChannels are thread-safe. Only one operation involving manipulation of 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the file position may be executed at the same time. Subsequent calls to such 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operations will block, and one of those blocked will be freed to continue 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when the first operation has completed. There is no ordered queue or fairness 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * applied to the blocked threads. 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is undefined whether operations that do not manipulate the file position 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will also block when there are any other operations in-flight. 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The logical view of the underlying file is consistent across all FileChannels 7499e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes * and I/O streams opened on the same file by the same VM. 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Therefore, modifications performed via a channel will be visible to the 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream and vice versa; this includes modifications to the file position, 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * content, size, etc. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class FileChannel extends AbstractInterruptibleChannel 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements GatheringByteChannel, ScatteringByteChannel, ByteChannel { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code MapMode} defines file mapping mode constants. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static class MapMode { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Private mapping mode (equivalent to copy on write). 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 89f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes public static final MapMode PRIVATE = new MapMode("PRIVATE"); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Read-only mapping mode. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 94f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes public static final MapMode READ_ONLY = new MapMode("READ_ONLY"); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Read-write mapping mode. 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes public static final MapMode READ_WRITE = new MapMode("READ_WRITE"); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The string used to display the mapping mode. 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String displayName; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Private constructor prevents others creating new modes. 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private MapMode(String displayName) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.displayName = displayName; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string version of the mapping mode. 113f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this map mode as string. 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 116eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return displayName; 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Protected default constructor. 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected FileChannel() { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Requests that all updates to this channel are committed to the storage 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * device. 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When this method returns, all modifications made to the platform file 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * underlying this channel have been committed if the file resides on a 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * local storage device. If the file is not hosted locally, for example on a 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * networked file system, then applications cannot be certain that the 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modifications have been committed. 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * There are no assurances given that changes made to the file using methods 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defined elsewhere will be committed. For example, changes made via a 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mapped byte buffer may not be committed. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The <code>metadata</code> parameter indicates whether the update should 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * include the file's metadata such as last modification time, last access 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * time, etc. Note that passing <code>true</code> may invoke an underlying 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * write to the operating system (if the platform is maintaining metadata 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * such as last access time), even if the channel is opened read-only. 147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param metadata 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if the file metadata should be flushed in 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * addition to the file content, {@code false} otherwise. 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is already closed. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void force(boolean metadata) throws IOException; 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Obtains an exclusive lock on this file. 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is a convenience method for acquiring a maximum length lock on a 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * file. It is equivalent to: 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code fileChannel.lock(0L, Long.MAX_VALUE, false);} 164eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the lock object representing the locked file area. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the file channel is closed. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this channel was not opened for writing. 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OverlappingFileLockException 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * either a lock is already held that overlaps this lock 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request, or another thread is waiting to acquire a lock that 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will overlap with this request. 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws FileLockInterruptionException 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the calling thread was interrupted while waiting to acquire 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the lock. 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the channel was closed while the calling thread was waiting 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to acquire the lock. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs while obtaining the requested 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * lock. 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final FileLock lock() throws IOException { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return lock(0L, Long.MAX_VALUE, false); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Obtains a lock on a specified region of the file. 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is the blocking version of lock acquisition, see also the 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>tryLock()</code> methods. 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Attempts to acquire an overlapping lock region will fail. The attempt 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will fail if the overlapping lock has already been obtained, or if 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * another thread is currently waiting to acquire the overlapping lock. 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the request is not for an overlapping lock, the thread calling this 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method will block until the lock is obtained (likely by no contention or 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * another process releasing a lock), or until this thread is interrupted or 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the channel is closed. 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the lock is obtained successfully then the {@link FileLock} object 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned represents the lock for subsequent operations on the locked 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * region. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the thread is interrupted while waiting for the lock, the thread is 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to the interrupted state and throws a 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link FileLockInterruptionException}. If this channel is closed while 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the thread is waiting to obtain the lock then the thread throws a 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link AsynchronousCloseException}. 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * There is no requirement for the position and size to be within the 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current start and length of the file. 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Some platforms do not support shared locks, and if a request is made for 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a shared lock on such a platform, this method will attempt to acquire an 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exclusive lock instead. It is undefined whether the lock obtained is 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * advisory or mandatory. 220eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the starting position for the locked region. 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the length of the locked region in bytes. 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param shared 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a flag indicating whether an attempt should be made to acquire 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a shared lock. 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the file lock object. 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code position} or {@code size} is negative. 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OverlappingFileLockException 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the requested region overlaps an existing lock or pending 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * lock request. 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel is not opened in read-mode but shared is true. 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel is not opened in write mode but shared is 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * false. 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread while this method 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is executing. 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws FileLockInterruptionException 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the thread is interrupted while in the state of waiting on 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the desired file lock. 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract FileLock lock(long position, long size, boolean shared) 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Maps the file into memory. There can be three modes: read-only, 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read/write and private. After mapping, changes made to memory or the file 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * channel do not affect the other storage place. 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note: mapping a file into memory is usually expensive. 259eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param mode 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one of the three mapping modes. 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the starting position of the file. 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the size of the region to map into memory. 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the mapped byte buffer. 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the FileChannel is not opened for reading but the given 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mode is "READ_ONLY". 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the FileChannel is not opened for writing but the given 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mode is not "READ_ONLY". 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given parameters of position and size are not correct. 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Both must be non negative. {@code size} also must not be 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bigger than max integer. 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any I/O error occurs. 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract MappedByteBuffer map(FileChannel.MapMode mode, 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long position, long size) throws IOException; 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the current value of the file position pointer. 285f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current position as a positive integer number of bytes from 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the start of the file. 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long position() throws IOException; 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the file position pointer to a new value. 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The argument is the number of bytes counted from the start of the file. 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The position cannot be set to a value that is negative. The new position 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can be set beyond the current file size. If set beyond the current file 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size, attempts to read will return end of file. Write operations will 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * succeed but they will fill the bytes between the current end of file and 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new position with the required number of (unspecified) byte values. 304f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new file position, in bytes. 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the receiver. 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the new position is negative. 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract FileChannel position(long offset) throws IOException; 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads bytes from this file channel into the given buffer. 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The maximum number of bytes that will be read is the remaining number of 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bytes in the buffer when the method is invoked. The bytes will be copied 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * into the buffer starting at the buffer's current position. 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The call may block if other threads are also attempting to read from this 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * channel. 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Upon completion, the buffer's position is set to the end of the bytes 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that have been read. The buffer's limit is not changed. 329eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte buffer to receive the bytes. 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read. 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread closes the channel during the read. 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread interrupts the calling thread during the 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read. 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs, details are in the message. 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel has not been opened in a mode that permits 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reading. 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract int read(ByteBuffer buffer) throws IOException; 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads bytes from this file channel into the given buffer starting from 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified file position. 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The bytes are read starting at the given file position (up to the 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * remaining number of bytes in the buffer). The number of bytes actually 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read is returned. 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@code position} is beyond the current end of file, then no bytes are 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read. 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that the file position is unmodified by this method. 360eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer to receive the bytes. 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the (non-negative) position at which to read the bytes. 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read. 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread while this method 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is executing. 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread interrupts the calling thread while this 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation is in progress. The calling thread will have the 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interrupt state set, and the channel will be closed. 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if <code>position</code> is less than 0. 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel has not been opened in a mode that permits 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reading. 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract int read(ByteBuffer buffer, long position) 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads bytes from this file channel and stores them in the specified array 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of buffers. This method attempts to read as many bytes as can be stored 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the buffer array from this channel and returns the number of bytes 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * actually read. It also increases the file position by the number of bytes 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read. 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a read operation is in progress, subsequent threads will block until 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the read is completed and will then contend for the ability to read. 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Calling this method is equivalent to calling 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code read(buffers, 0, buffers.length);} 398eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffers 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of byte buffers into which the bytes will be copied. 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read. 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread during this read 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation. 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the thread is interrupted by another thread during this 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read operation. 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs; details are in the message. 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel has not been opened in a mode that permits 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reading. 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final long read(ByteBuffer[] buffers) throws IOException { 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return read(buffers, 0, buffers.length); 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 421eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * Reads bytes from this file channel into a subset of the given buffers. 422eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * This method attempts to read all {@code remaining()} bytes from {@code 423eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * length} byte buffers, in order, starting at {@code targets[offset]}. It 424eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * increases the file position by the number of bytes actually read. The 425eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * number of bytes actually read is returned. 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a read operation is in progress, subsequent threads will block until 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the read is completed and will then contend for the ability to read. 429eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffers 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of byte buffers into which the bytes will be copied. 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param start 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the index of the first buffer to store bytes in. 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param number 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of buffers to store bytes in. 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually read. 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread during this read 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation. 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the thread is interrupted by another thread during this 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read operation. 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code start < 0} or {@code number < 0}, or if 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code start + number} is greater than the size of 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffers}. 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs; details are in the message. 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel has not been opened in a mode that permits 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reading. 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long read(ByteBuffer[] buffers, int start, int number) 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the size of the file underlying this channel in bytes. 460f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the size of the file in bytes. 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an I/O error occurs while getting the size of the file. 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long size() throws IOException; 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads up to {@code count} bytes from {@code src} and stores them in this 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * channel's file starting at {@code position}. No bytes are transferred if 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code position} is larger than the size of this channel's file. Less 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * than {@code count} bytes are transferred if there are less bytes 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * remaining in the source channel or if the source channel is non-blocking 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and has less than {@code count} bytes immediately available in its output 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer. 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that this channel's position is not modified. 479eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param src 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source channel to read bytes from. 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non-negative start position. 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non-negative number of bytes to transfer. 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes that are transferred. 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the parameters are invalid. 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the source channel is not readable. 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is not writable. 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if either channel has already been closed. 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if either channel is closed by other threads during this 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation. 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the thread is interrupted during this operation. 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any I/O error occurs. 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long transferFrom(ReadableByteChannel src, long position, 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long count) throws IOException; 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads up to {@code count} bytes from this channel's file starting at 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code position} and writes them to {@code target}. No bytes are 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * transferred if {@code position} is larger than the size of this channel's 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * file. Less than {@code count} bytes are transferred if there less bytes 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * available from this channel's file or if the target channel is 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * non-blocking and has less than {@code count} bytes free in its input 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer. 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that this channel's position is not modified. 516eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non-negative position to begin. 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non-negative number of bytes to transfer. 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param target 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target channel to write to. 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes that were transferred. 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the parameters are invalid. 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonReadableChannelException 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is not readable. 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the target channel is not writable. 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if either channel has already been closed. 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if either channel is closed by other threads during this 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation. 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the thread is interrupted during this operation. 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any I/O error occurs. 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long transferTo(long position, long count, 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project WritableByteChannel target) throws IOException; 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Truncates the file underlying this channel to a given size. Any bytes 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * beyond the given size are removed from the file. If there are no bytes 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * beyond the given size then the file contents are unmodified. 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the file position is currently greater than the given size, then it is 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to the new size. 550eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum size of the underlying file. 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the requested size is negative. 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel cannot be written to. 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this channel. 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract FileChannel truncate(long size) throws IOException; 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Attempts to acquire an exclusive lock on this file without blocking. 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is a convenience method for attempting to acquire a maximum length 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * lock on the file. It is equivalent to: 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code fileChannel.tryLock(0L, Long.MAX_VALUE, false);} 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The method returns {@code null} if the acquisition would result in an 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * overlapped lock with another OS process. 574eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the file lock object, or {@code null} if the lock would overlap 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with an existing exclusive lock in another OS process. 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the file channel is closed. 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OverlappingFileLockException 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a lock already exists that overlaps this lock request or 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * another thread is waiting to acquire a lock that will overlap 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with this request. 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any I/O error occurs. 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final FileLock tryLock() throws IOException { 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return tryLock(0L, Long.MAX_VALUE, false); 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Attempts to acquire an exclusive lock on this file without blocking. The 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method returns {@code null} if the acquisition would result in an 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * overlapped lock with another OS process. 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is possible to acquire a lock for any region even if it's completely 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * outside of the file's size. The size of the lock is fixed. If the file 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grows outside of the lock that region of the file won't be locked by this 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * lock. 599eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the starting position. 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the size of file to lock. 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param shared 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * true if the lock is shared. 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the file lock object, or {@code null} if the lock would overlap 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with an existing exclusive lock in another OS process. 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any parameters are invalid. 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the file channel is closed. 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OverlappingFileLockException 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a lock is already held that overlaps this lock request or 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * another thread is waiting to acquire a lock that will overlap 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with this request. 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any I/O error occurs. 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract FileLock tryLock(long position, long size, boolean shared) 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Writes bytes from the given byte buffer to this file channel. 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The bytes are written starting at the current file position, and after 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * some number of bytes are written (up to the remaining number of bytes in 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer) the file position is increased by the number of bytes 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * actually written. 629f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param src 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte buffer containing the bytes to be written. 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually written. 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel was not opened for writing. 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel was already closed. 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread closes the channel during the write. 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread interrupts the calling thread while this 641eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * operation is in progress. The interrupt state of the calling 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread is set and the channel is closed. 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs, details are in the message. 645eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * @see java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer) 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract int write(ByteBuffer src) throws IOException; 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Writes bytes from the given buffer to this file channel starting at the 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * given file position. 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The bytes are written starting at the given file position (up to the 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * remaining number of bytes in the buffer). The number of bytes actually 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * written is returned. 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the position is beyond the current end of file, then the file is first 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * extended up to the given position by the required number of unspecified 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * byte values. 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that the file position is not modified by this method. 662eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer containing the bytes to be written. 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param position 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the (non-negative) position at which to write the bytes. 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually written. 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if <code>position</code> is less than 0. 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the channel was not opened in write-mode. 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread while this method 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is executing. 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread interrupts the calling thread while this 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation is in progress. The interrupt state of the calling 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread is set and the channel is closed. 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs. 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract int write(ByteBuffer buffer, long position) 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Writes bytes from all the given byte buffers to this file channel. 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The bytes are written starting at the current file position, and after 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the bytes are written (up to the remaining number of bytes in all the 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffers), the file position is increased by the number of bytes actually 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * written. 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Calling this method is equivalent to calling 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code write(buffers, 0, buffers.length);} 697eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffers 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffers containing bytes to write. 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually written. 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread during this write 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation. 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread interrupts the calling thread while this 706eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * operation is in progress. The interrupt state of the calling 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread is set and the channel is closed. 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs; details are in the message. 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel was not opened for writing. 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final long write(ByteBuffer[] buffers) throws IOException { 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return write(buffers, 0, buffers.length); 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 720eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * Attempts to write a subset of the given bytes from the buffers to this 721eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * file channel. This method attempts to write all {@code remaining()} 722eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * bytes from {@code length} byte buffers, in order, starting at {@code 723eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * sources[offset]}. The number of bytes actually written is returned. 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a write operation is in progress, subsequent threads will block until 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the write is completed and then contend for the ability to write. 727eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffers 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of byte buffers that is the source for bytes written 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to this channel. 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the index of the first buffer in {@code buffers }to get bytes 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from. 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of buffers to get bytes from. 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually written to this channel. 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws AsynchronousCloseException 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed by another thread during this write 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation. 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedByInterruptException 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another thread interrupts the calling thread while this 742eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * operation is in progress. The interrupt state of the calling 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread is set and the channel is closed. 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClosedChannelException 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel is closed. 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code offset < 0} or {@code length < 0}, or if 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code offset + length} is greater than the size of 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffers}. 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another I/O error occurs; details are in the message. 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NonWritableChannelException 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this channel was not opened for writing. 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long write(ByteBuffer[] buffers, int offset, int length) 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 758