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