1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License. You may obtain a copy of the License at 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.io; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.channels.FileChannel; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.platform.IFileSystem; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.util.Msg; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.util.Util; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.nio.FileChannelFactory; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allows reading from and writing to a file in a random-access manner. This is 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * different from the uni-directional sequential access that a 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link FileInputStream} or {@link FileOutputStream} provides. If the file is 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * opened in read/write mode, write operations are available as well. The 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * position of the next read or write operation can be moved forwards and 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * backwards after every operation. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class RandomAccessFile implements DataInput, DataOutput, Closeable { 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The FileDescriptor representing this RandomAccessFile. 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private FileDescriptor fd; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean syncMetadata = false; 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // The unique file channel associated with this FileInputStream (lazily 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // initialized). 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private FileChannel channel; 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private IFileSystem fileSystem = Platform.getFileSystem(); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean isReadOnly; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-added 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int options; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-added 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static class RepositionLock { 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private Object repositionLock = new RepositionLock(); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a new {@code RandomAccessFile} based on {@code file} and opens 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it according to the access string in {@code mode}. 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><a id="accessmode"/> 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code mode} may have one of following values: 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <table border="0"> 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <tr> 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>{@code "r"}</td> 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>The file is opened in read-only mode. An {@code IOException} is 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown if any of the {@code write} methods is called.</td> 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </tr> 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <tr> 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>{@code "rw"}</td> 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>The file is opened for reading and writing. If the file does not 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exist, it will be created.</td> 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </tr> 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <tr> 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>{@code "rws"}</td> 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>The file is opened for reading and writing. Every change of the 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file's content or metadata must be written synchronously to the target 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * device.</td> 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </tr> 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <tr> 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>{@code "rwd"}</td> 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <td>The file is opened for reading and writing. Every change of the 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file's content must be written synchronously to the target device.</td> 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </tr> 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </table> 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param file 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the file to open. 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param mode 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the file access <a href="#accessmode">mode</a>, either {@code 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "r"}, {@code "rw"}, {@code "rws"} or {@code "rwd"}. 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws FileNotFoundException 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the file cannot be opened or created according to {@code 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode}. 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IllegalArgumentException 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code mode} is not {@code "r"}, {@code "rw"}, {@code 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "rws"} or {@code "rwd"}. 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws SecurityException 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if a {@code SecurityManager} is installed and it denies 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * access request according to {@code mode}. 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see java.lang.SecurityManager#checkRead(FileDescriptor) 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see java.lang.SecurityManager#checkWrite(FileDescriptor) 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RandomAccessFile(File file, String mode) 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws FileNotFoundException { 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project options = 0; 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd = new FileDescriptor(); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mode.equals("r")) { //$NON-NLS-1$ 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project isReadOnly = true; 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.readOnly = true; 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project options = IFileSystem.O_RDONLY; 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (mode.equals("rw") || mode.equals("rws") || mode.equals("rwd")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project isReadOnly = false; 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project options = IFileSystem.O_RDWR; 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mode.equals("rws")) { //$NON-NLS-1$ 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Sync file and metadata with every write 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project syncMetadata = true; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (mode.equals("rwd")) { //$NON-NLS-1$ 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Sync file, but not necessarily metadata 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project options = IFileSystem.O_RDWRSYNC; 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0081")); //$NON-NLS-1$ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SecurityManager security = System.getSecurityManager(); 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (security != null) { 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project security.checkRead(file.getPath()); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!isReadOnly) { 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project security.checkWrite(file.getPath()); 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.descriptor = fileSystem.open(file.properPath(true), options); 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if we are in "rws" mode, attempt to sync file+metadata 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (syncMetadata) { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.sync(); 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IOException e) { 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Ignored 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a new {@code RandomAccessFile} based on the file named {@code 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fileName} and opens it according to the access string in {@code mode}. 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The file path may be specified absolutely or relative to the system 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * property {@code "user.dir"}. 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param fileName 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the name of the file to open. 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param mode 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the file access <a href="#accessmode">mode</a>, either {@code 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "r"}, {@code "rw"}, {@code "rws"} or {@code "rwd"}. 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws FileNotFoundException 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the file cannot be opened or created according to {@code 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode}. 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IllegalArgumentException 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code mode} is not {@code "r"}, {@code "rw"}, {@code 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "rws"} or {@code "rwd"}. 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws SecurityException 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if a {@code SecurityManager} is installed and it denies 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * access request according to {@code mode}. 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see java.lang.SecurityManager#checkRead(FileDescriptor) 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see java.lang.SecurityManager#checkWrite(FileDescriptor) 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RandomAccessFile(String fileName, String mode) 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws FileNotFoundException { 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this(new File(fileName), mode); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Closes this file. 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an error occurs while closing this file. 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void close() throws IOException { 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (this) { 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (channel != null && channel.isOpen()) { 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project channel.close(); 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project channel = null; 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fd != null && fd.descriptor >= 0) { 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fileSystem.close(fd.descriptor); 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.descriptor = -1; 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets this file's {@link FileChannel} object. 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The file channel's {@link FileChannel.#position() position} is the same 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * as this file's file pointer offset (see {@link #getFilePointer()}). Any 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * changes made to this file's file pointer offset are also visible in the 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file channel's position and vice versa. 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return this file's file channel instance. 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final FileChannel getChannel() { 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized(this) { 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(channel == null) { 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project channel = FileChannelFactory.getFileChannel(this, fd.descriptor, 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project options); 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return channel; 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets this file's {@link FileDescriptor}. This represents the operating 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * system resource for this random access file. 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return this file's file descriptor object. 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an error occurs while getting the file descriptor of this 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file. 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final FileDescriptor getFD() throws IOException { 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fd; 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the current position within this file. All reads and 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * writes take place at the current file pointer position. 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the current offset in bytes from the beginning of the file. 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an error occurs while getting the file pointer of this 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file. 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public long getFilePointer() throws IOException { 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fileSystem.seek(fd.descriptor, 0L, IFileSystem.SEEK_CUR); 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Checks to see if the file is currently open. Returns silently if it is, 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and throws an exception if it is not. 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the receiver is closed. 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private synchronized void openCheck() throws IOException { 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fd.descriptor < 0) { 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IOException(); 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the length of this file in bytes. 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the file's length in bytes. 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or some other I/O error occurs. 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public long length() throws IOException { 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long currentPosition = fileSystem.seek(fd.descriptor, 0L, 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IFileSystem.SEEK_CUR); 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long endOfFilePosition = fileSystem.seek(fd.descriptor, 0L, 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IFileSystem.SEEK_END); 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fileSystem.seek(fd.descriptor, currentPosition, 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IFileSystem.SEEK_SET); 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return endOfFilePosition; 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a single byte from the current position in this file and returns it 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * as an integer in the range from 0 to 255. Returns -1 if the end of the 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file has been reached. Blocks until one byte has been read, the end of 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the file is detected or an exception is thrown. 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the byte read or -1 if the end of the file has been reached. 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int read() throws IOException { 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] bytes = new byte[1]; 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long readed = fileSystem.read(fd.descriptor, bytes, 0, 1); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return readed == -1 ? -1 : bytes[0] & 0xff; 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads bytes from the current position in this file and stores them in the 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte array {@code buffer}. The maximum number of bytes read corresponds 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to the size of {@code buffer}. Blocks until at least one byte has been 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * read. 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param buffer 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the byte array in which to store the bytes read. 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the number of bytes actually read or -1 if the end of the file 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has been reached. 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int read(byte[] buffer) throws IOException { 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return read(buffer, 0, buffer.length); 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads at most {@code count} bytes from the current position in this file 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and stores them in the byte array {@code buffer} starting at {@code 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * offset}. Blocks until {@code count} bytes have been read, the end of the 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file is reached or an exception is thrown. 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param buffer 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the array in which to store the bytes read from this file. 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param offset 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the initial position in {@code buffer} to store the bytes read 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * from this file. 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param count 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the maximum number of bytes to store in {@code buffer}. 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the number of bytes actually read or -1 if the end of the stream 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has been reached. 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IndexOutOfBoundsException 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code offset < 0} or {@code count < 0}, or if {@code 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * offset + count} is greater than the size of {@code buffer}. 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int read(byte[] buffer, int offset, int count) throws IOException { 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // have to have four comparisions to not miss integer overflow cases 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Exception priorities (in case of multiple errors) differ from 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // RI, but are spec-compliant. 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // made implicit null check explicit, used (offset | count) < 0 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // instead of (offset < 0) || (count < 0) to safe one operation 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (buffer == null) { 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$ 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((offset | count) < 0 || count > buffer.length - offset) { 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$ 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (0 == count) { 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (int) fileSystem.read(fd.descriptor, buffer, offset, count); 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a boolean from the current position in this file. Blocks until one 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte has been read, the end of the file is reached or an exception is 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown. 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next boolean value from this file. 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeBoolean(boolean) 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final boolean readBoolean() throws IOException { 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int temp = this.read(); 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (temp < 0) { 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return temp != 0; 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads an 8-bit byte from the current position in this file. Blocks until 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one byte has been read, the end of the file is reached or an exception is 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown. 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next signed 8-bit byte value from this file. 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeBoolean(boolean) 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final byte readByte() throws IOException { 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int temp = this.read(); 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (temp < 0) { 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (byte) temp; 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a 16-bit character from the current position in this file. Blocks until 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * two bytes have been read, the end of the file is reached or an exception is 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown. 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next char value from this file. 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeChar(int) 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final char readChar() throws IOException { 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[2]; 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (read(buffer, 0, buffer.length) != buffer.length) { 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (char) (((buffer[0] & 0xff) << 8) + (buffer[1] & 0xff)); 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a 64-bit double from the current position in this file. Blocks 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * until eight bytes have been read, the end of the file is reached or an 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception is thrown. 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next double value from this file. 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeDouble(double) 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final double readDouble() throws IOException { 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Double.longBitsToDouble(readLong()); 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a 32-bit float from the current position in this file. Blocks 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * until four bytes have been read, the end of the file is reached or an 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception is thrown. 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next float value from this file. 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeFloat(float) 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final float readFloat() throws IOException { 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Float.intBitsToFloat(readInt()); 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads bytes from this file into {@code buffer}. Blocks until {@code 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * buffer.length} number of bytes have been read, the end of the file is 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reached or an exception is thrown. 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param buffer 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the buffer to read bytes into. 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code buffer} is {@code null}. 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void readFully(byte[] buffer) throws IOException { 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project readFully(buffer, 0, buffer.length); 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Read bytes from this file into {@code buffer} starting at offset {@code 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * offset}. This method blocks until {@code count} number of bytes have been 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * read. 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param buffer 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the buffer to read bytes into. 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param offset 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the initial position in {@code buffer} to store the bytes read 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * from this file. 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param count 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the maximum number of bytes to store in {@code buffer}. 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IndexOutOfBoundsException 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code offset < 0} or {@code count < 0}, or if {@code 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * offset + count} is greater than the length of {@code buffer}. 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code buffer} is {@code null}. 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void readFully(byte[] buffer, int offset, int count) 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IOException { 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (buffer == null) { 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$ 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // avoid int overflow 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Exception priorities (in case of multiple errors) differ from 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // RI, but are spec-compliant. 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // removed redundant check, used (offset | count) < 0 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // instead of (offset < 0) || (count < 0) to safe one operation 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((offset | count) < 0 || count > buffer.length - offset) { 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$ 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (count > 0) { 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int result = read(buffer, offset, count); 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (result < 0) { 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project offset += result; 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project count -= result; 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a 32-bit integer from the current position in this file. Blocks 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * until four bytes have been read, the end of the file is reached or an 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception is thrown. 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next int value from this file. 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeInt(int) 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int readInt() throws IOException { 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[4]; 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (read(buffer, 0, buffer.length) != buffer.length) { 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ((buffer[0] & 0xff) << 24) + ((buffer[1] & 0xff) << 16) 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + ((buffer[2] & 0xff) << 8) + (buffer[3] & 0xff); 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a line of text form the current position in this file. A line is 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * represented by zero or more characters followed by {@code '\n'}, {@code 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * '\r'}, {@code "\r\n"} or the end of file marker. The string does not 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * include the line terminating sequence. 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Blocks until a line terminating sequence has been read, the end of the 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file is reached or an exception is thrown. 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the contents of the line or {@code null} if no characters have 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * been read before the end of the file has been reached. 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String readLine() throws IOException { 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuilder line = new StringBuilder(80); // Typical line length 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean foundTerminator = false; 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long unreadPosition = 0; 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (true) { 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int nextByte = read(); 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (nextByte) { 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case -1: 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return line.length() != 0 ? line.toString() : null; 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case (byte) '\r': 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (foundTerminator) { 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project seek(unreadPosition); 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return line.toString(); 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project foundTerminator = true; 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* Have to be able to peek ahead one byte */ 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project unreadPosition = getFilePointer(); 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case (byte) '\n': 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return line.toString(); 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (foundTerminator) { 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project seek(unreadPosition); 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return line.toString(); 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project line.append((char) nextByte); 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a 64-bit long from the current position in this file. Blocks until 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eight bytes have been read, the end of the file is reached or an 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception is thrown. 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next long value from this file. 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeLong(long) 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final long readLong() throws IOException { 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[8]; 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (read(buffer, 0, buffer.length) != buffer.length) { 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ((long) (((buffer[0] & 0xff) << 24) + ((buffer[1] & 0xff) << 16) 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + ((buffer[2] & 0xff) << 8) + (buffer[3] & 0xff)) << 32) 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + ((long) (buffer[4] & 0xff) << 24) 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + ((buffer[5] & 0xff) << 16) 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + ((buffer[6] & 0xff) << 8) 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + (buffer[7] & 0xff); 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a 16-bit short from the current position in this file. Blocks until 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * two bytes have been read, the end of the file is reached or an exception 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is thrown. 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next short value from this file. 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeShort(int) 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final short readShort() throws IOException { 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[2]; 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (read(buffer, 0, buffer.length) != buffer.length) { 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (short) (((buffer[0] & 0xff) << 8) + (buffer[1] & 0xff)); 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads an unsigned 8-bit byte from the current position in this file and 663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returns it as an integer. Blocks until one byte has been read, the end of 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the file is reached or an exception is thrown. 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next unsigned byte value from this file as an int. 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeByte(int) 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int readUnsignedByte() throws IOException { 675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int temp = this.read(); 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (temp < 0) { 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return temp; 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads an unsigned 16-bit short from the current position in this file and 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returns it as an integer. Blocks until two bytes have been read, the end of 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the file is reached or an exception is thrown. 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next unsigned short value from this file as an int. 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeShort(int) 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int readUnsignedShort() throws IOException { 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[2]; 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (read(buffer, 0, buffer.length) != buffer.length) { 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ((buffer[0] & 0xff) << 8) + (buffer[1] & 0xff); 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a string that is encoded in {@link DataInput modified UTF-8} from 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this file. The number of bytes that must be read for the complete string 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is determined by the first two bytes read from the file. Blocks until all 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * required bytes have been read, the end of the file is reached or an 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception is thrown. 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the next string encoded in {@link DataInput modified UTF-8} from 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this file. 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws EOFException 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the end of this file is detected. 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws UTFDataFormatException 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the bytes read cannot be decoded into a character string. 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #writeUTF(String) 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String readUTF() throws IOException { 722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int utfSize = readUnsignedShort(); 723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (utfSize == 0) { 724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ""; //$NON-NLS-1$ 725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buf = new byte[utfSize]; 727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (read(buf, 0, buf.length) != buf.length) { 728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new EOFException(); 729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Util.convertFromUTF8(buf, 0, utfSize); 731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Moves this file's file pointer to a new position, from where following 735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code read}, {@code write} or {@code skip} operations are done. The 736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * position may be greater than the current length of the file, but the 737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file's length will only change if the moving of the pointer is followed 738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by a {@code write} operation. 739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param pos 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the new file pointer position. 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed, {@code pos < 0} or another I/O error 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * occurs. 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void seek(long pos) throws IOException { 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pos < 0) { 749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // seek position is negative 750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IOException(Msg.getString("K0347")); //$NON-NLS-1$ 751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fileSystem.seek(fd.descriptor, pos, IFileSystem.SEEK_SET); 755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the length of this file to {@code newLength}. If the current file is 760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * smaller, it is expanded but the contents from the previous end of the 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file to the new end are undefined. The file is truncated if its current 762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * size is bigger than {@code newLength}. If the current file pointer 763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * position is in the truncated part, it is set to the end of the file. 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param newLength 766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the new file length in bytes. 767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IllegalArgumentException 768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code newLength < 0}. 769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setLength(long newLength) throws IOException { 774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (newLength < 0) { 776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException(); 777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long position = fileSystem.seek(fd.descriptor, 0, 780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IFileSystem.SEEK_CUR); 781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fileSystem.truncate(fd.descriptor, newLength); 782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project seek(position > newLength ? newLength : position); 783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if we are in "rws" mode, attempt to sync file+metadata 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (syncMetadata) { 787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.sync(); 788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Skips over {@code count} bytes in this file. Less than {@code count} 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bytes are skipped if the end of the file is reached or an exception is 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown during the operation. Nothing is done if {@code count} is 795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * negative. 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param count 798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the number of bytes to skip. 799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the number of bytes actually skipped. 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int skipBytes(int count) throws IOException { 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (count > 0) { 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long currentPos = getFilePointer(), eof = length(); 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int newCount = (int) ((currentPos + count > eof) ? eof - currentPos 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project : count); 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project seek(currentPos + newCount); 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return newCount; 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes the entire contents of the byte array {@code buffer} to this file, 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * starting at the current file pointer. 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param buffer 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the buffer to write. 821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #read(byte[]) 824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #read(byte[],int,int) 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readFully(byte[]) 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readFully(byte[],int,int) 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void write(byte[] buffer) throws IOException { 830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(buffer, 0, buffer.length); 831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes {@code count} bytes from the byte array {@code buffer} to this 835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file, starting at the current file pointer and using {@code offset} as 836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the first position within {@code buffer} to get bytes. 837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param buffer 839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the buffer to write to this file. 840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param offset 841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the index of the first byte in {@code buffer} to write. 842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param count 843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the number of bytes from {@code buffer} to write. 844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IndexOutOfBoundsException 845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code count < 0}, {@code offset < 0} or {@code count + 846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * offset} is greater than the size of {@code buffer}. 847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #read(byte[], int, int) 850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readFully(byte[], int, int) 851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void write(byte[] buffer, int offset, int count) throws IOException { 854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Exception priorities (in case of multiple errors) differ from 856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // RI, but are spec-compliant. 857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // made implicit null check explicit, 858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // removed redundant check, used (offset | count) < 0 859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // instead of (offset < 0) || (count < 0) to safe one operation 860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (buffer == null) { 861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$ 862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((offset | count) < 0 || count > buffer.length - offset) { 864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$ 865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (count == 0) { 868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-added 871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-added 873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fileSystem.write(fd.descriptor, buffer, offset, count); 875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if we are in "rws" mode, attempt to sync file+metadata 878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (syncMetadata) { 879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.sync(); 880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a byte to this file, starting at the current file pointer. Only 885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the least significant byte of the integer {@code oneByte} is written. 886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param oneByte 888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the byte to write to this file. 889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #read() 892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void write(int oneByte) throws IOException { 895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project openCheck(); 896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] bytes = new byte[1]; 897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bytes[0] = (byte) (oneByte & 0xff); 898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized (repositionLock) { 899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fileSystem.write(fd.descriptor, bytes, 0, 1); 900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if we are in "rws" mode, attempt to sync file+metadata 903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (syncMetadata) { 904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fd.sync(); 905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a boolean to this file, starting at the current file pointer. 910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the boolean to write to this file. 913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readBoolean() 916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeBoolean(boolean val) throws IOException { 919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(val ? 1 : 0); 920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes an 8-bit byte to this file, starting at the current file pointer. 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Only the least significant byte of the integer {@code val} is written. 925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the byte to write to this file. 928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this file is closed or another I/O error occurs. 930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readByte() 931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readUnsignedByte() 932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeByte(int val) throws IOException { 935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(val & 0xFF); 936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes the low order 8-bit bytes from a string to this file, starting at 940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the current file pointer. 941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param str 943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the string containing the bytes to write to this file 944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #read(byte[]) 947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #read(byte[],int,int) 948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readFully(byte[]) 949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readFully(byte[],int,int) 950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeBytes(String str) throws IOException { 953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte bytes[] = new byte[str.length()]; 954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int index = 0; index < str.length(); index++) { 955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bytes[index] = (byte) (str.charAt(index) & 0xFF); 956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(bytes); 958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a 16-bit character to this file, starting at the current file 963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer. Only the two least significant bytes of the integer {@code val} 964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are written, with the high byte first. 965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the char to write to this file. 968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readChar() 971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeChar(int val) throws IOException { 974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[2]; 975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[0] = (byte) (val >> 8); 976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[1] = (byte) val; 977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(buffer, 0, buffer.length); 978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes the 16-bit characters from a string to this file, starting at the 982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * current file pointer. Each character is written in the same way as with 983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link #writeChar(int)}, with its high byte first. 984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param str 986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the string to write to this file. 987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readChar() 990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeChars(String str) throws IOException { 993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte newBytes[] = new byte[str.length() * 2]; 994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int index = 0; index < str.length(); index++) { 995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int newIndex = index == 0 ? index : index * 2; 996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newBytes[newIndex] = (byte) ((str.charAt(index) >> 8) & 0xFF); 997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newBytes[newIndex + 1] = (byte) (str.charAt(index) & 0xFF); 998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(newBytes); 1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a 64-bit double to this file, starting at the current file 1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer. The eight bytes returned by 1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Double#doubleToLongBits(double)} are written to this file. 1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the double to write to this file. 1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readDouble() 1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeDouble(double val) throws IOException { 1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writeLong(Double.doubleToLongBits(val)); 1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a 32-bit float to this file, starting at the current file pointer. 1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The four bytes returned by {@link Float#floatToIntBits(float)} are 1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * written to this file. 1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the float to write to this file. 1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readFloat() 1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeFloat(float val) throws IOException { 1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writeInt(Float.floatToIntBits(val)); 1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a 32-bit integer to this file, starting at the current file 1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer. The four bytes of the integer are written with the highest byte 1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * first. 1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the int to write to this file. 1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readInt() 1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeInt(int val) throws IOException { 1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[4]; 1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[0] = (byte) (val >> 24); 1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[1] = (byte) (val >> 16); 1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[2] = (byte) (val >> 8); 1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[3] = (byte) val; 1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(buffer, 0, buffer.length); 1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a 64-bit long to this file, starting at the current file 1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer. The eight bytes of the long are written with the highest byte 1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * first. 1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the long to write to this file. 1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readLong() 1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeLong(long val) throws IOException { 1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buffer = new byte[8]; 1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int t = (int) (val >> 32); 1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[0] = (byte) (t >> 24); 1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[1] = (byte) (t >> 16); 1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[2] = (byte) (t >> 8); 1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[3] = (byte) t; 1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[4] = (byte) (val >> 24); 1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[5] = (byte) (val >> 16); 1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[6] = (byte) (val >> 8); 1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer[7] = (byte) val; 1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(buffer, 0, buffer.length); 1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a 16-bit short to this file, starting at the current file 1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer. Only the two least significant bytes of the integer {@code val} 1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are written, with the high byte first. 1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param val 1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the short to write to this file. 1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readShort() 1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeShort(int val) throws IOException { 1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writeChar(val); 1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes a string encoded with {@link DataInput modified UTF-8} to this 1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * file, starting at the current file pointer. 1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param str 1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the string to write in {@link DataInput modified UTF-8} 1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * format. 1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException 1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if an I/O error occurs while writing to this file. 1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws UTFDataFormatException 1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the encoded string is longer than 65535 bytes. 1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #readUTF() 1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void writeUTF(String str) throws IOException { 1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int utfCount = 0, length = str.length(); 1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < length; i++) { 1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int charValue = str.charAt(i); 1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (charValue > 0 && charValue <= 127) { 1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfCount++; 1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (charValue <= 2047) { 1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfCount += 2; 1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfCount += 3; 1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (utfCount > 65535) { 1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new UTFDataFormatException(Msg.getString("K0068")); //$NON-NLS-1$ 1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte utfBytes[] = new byte[utfCount + 2]; 1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int utfIndex = 2; 1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < length; i++) { 1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int charValue = str.charAt(i); 1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (charValue > 0 && charValue <= 127) { 1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[utfIndex++] = (byte) charValue; 1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (charValue <= 2047) { 1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[utfIndex++] = (byte) (0xc0 | (0x1f & (charValue >> 6))); 1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[utfIndex++] = (byte) (0x80 | (0x3f & charValue)); 1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[utfIndex++] = (byte) (0xe0 | (0x0f & (charValue >> 12))); 1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[utfIndex++] = (byte) (0x80 | (0x3f & (charValue >> 6))); 1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[utfIndex++] = (byte) (0x80 | (0x3f & charValue)); 1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[0] = (byte) (utfCount >> 8); 1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utfBytes[1] = (byte) utfCount; 1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(utfBytes); 1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1146