FileOutputStream.java revision 63fcdd7e833df417cfbd60961a5167ce637f3071
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20ae704b984c10a63883cc366e823d53902d6ac7a9Elliott Hughesimport java.nio.NioUtils; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.FileChannel; 2299a89dd6f0a0e1396aa9b3feebf15ea31f703d3aElliott Hughesimport libcore.io.IoUtils; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.IFileSystem; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 27024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * An output stream that writes bytes to a file. If the output file exists, it 28024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * can be replaced or appended to. If it does not exist, a new file will be 29024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * created. 30024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * <pre> {@code 31024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * File file = ... 32024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * OutputStream out = null; 33024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * try { 34024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * out = new BufferedOutputStream(new FileOutputStream(file)); 35024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * ... 36024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * } finally { 37024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * if (out != null) { 38024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * out.close(); 39024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * } 40024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * } 41024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * }</pre> 42024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * 43024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * <p>This stream is <strong>not buffered</strong>. Most callers should wrap 44024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * this stream with a {@link BufferedOutputStream}. 45024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * 46024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * <p>Use {@link FileWriter} to write characters, as opposed to bytes, to a file. 47f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see BufferedOutputStream 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see FileInputStream 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class FileOutputStream extends OutputStream implements Closeable { 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53024784c977a744708ab0bcefc4337d491e429937Jesse Wilson private final FileDescriptor fd; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55024784c977a744708ab0bcefc4337d491e429937Jesse Wilson private final boolean shouldCloseFd; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57024784c977a744708ab0bcefc4337d491e429937Jesse Wilson /** The unique file channel. Lazily initialized because it's rarely needed. */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private FileChannel channel; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60024784c977a744708ab0bcefc4337d491e429937Jesse Wilson /** File access mode */ 61024784c977a744708ab0bcefc4337d491e429937Jesse Wilson private final int mode; 62024784c977a744708ab0bcefc4337d491e429937Jesse Wilson 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 64024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Constructs a new {@code FileOutputStream} that writes to {@code file}. 65f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 66024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @param file the file to which this stream writes. 67024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @throws FileNotFoundException if file cannot be opened for writing. 68024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @throws SecurityException if a {@code SecurityManager} is installed and 69024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * it denies the write request. 70f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see java.lang.SecurityManager#checkWrite(FileDescriptor) 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public FileOutputStream(File file) throws FileNotFoundException { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(file, false); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 77024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Constructs a new {@code FileOutputStream} that writes to {@code file}, 78024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * creating it if necessary. If {@code append} is true and the file already 79024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * exists, it will be appended to. Otherwise a new file will be created. 80f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 81024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @param file the file to which this stream writes. 82024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @param append true to append to an existing file. 83024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @throws FileNotFoundException if the file cannot be opened for writing. 84024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @throws SecurityException if a {@code SecurityManager} is installed and 85024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * it denies the write request. 86f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see java.lang.SecurityManager#checkWrite(FileDescriptor) 87f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see java.lang.SecurityManager#checkWrite(String) 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public FileOutputStream(File file, boolean append) 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws FileNotFoundException { 91024784c977a744708ab0bcefc4337d491e429937Jesse Wilson SecurityManager securityManager = System.getSecurityManager(); 92024784c977a744708ab0bcefc4337d491e429937Jesse Wilson if (securityManager != null) { 93024784c977a744708ab0bcefc4337d491e429937Jesse Wilson securityManager.checkWrite(file.getPath()); 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.fd = new FileDescriptor(); 96024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.mode = append ? IFileSystem.O_APPEND : IFileSystem.O_WRONLY; 97024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.fd.descriptor = Platform.FILE_SYSTEM.open(file.getAbsolutePath(), mode); 98024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.shouldCloseFd = true; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 102024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Constructs a new {@code FileOutputStream} that writes to {@code fd}. 103f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 104024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @param fd the FileDescriptor to which this stream writes. 105024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @throws NullPointerException if {@code fd} is null. 106024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * @throws SecurityException if a {@code SecurityManager} is installed and 107024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * it denies the write request. 108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @see java.lang.SecurityManager#checkWrite(FileDescriptor) 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public FileOutputStream(FileDescriptor fd) { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (fd == null) { 112b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new NullPointerException(); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114024784c977a744708ab0bcefc4337d491e429937Jesse Wilson SecurityManager securityManager = System.getSecurityManager(); 115024784c977a744708ab0bcefc4337d491e429937Jesse Wilson if (securityManager != null) { 116024784c977a744708ab0bcefc4337d491e429937Jesse Wilson securityManager.checkWrite(fd); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fd = fd; 119024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.shouldCloseFd = false; 120024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.channel = NioUtils.newFileChannel(this, fd.descriptor, IFileSystem.O_WRONLY); 121024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this.mode = IFileSystem.O_WRONLY; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 125024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Equivalent to {@code new FileOutputStream(new File(path), false)}. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127024784c977a744708ab0bcefc4337d491e429937Jesse Wilson public FileOutputStream(String path) throws FileNotFoundException { 128024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this(path, false); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 132024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Equivalent to {@code new FileOutputStream(new File(path), append)}. 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 134024784c977a744708ab0bcefc4337d491e429937Jesse Wilson public FileOutputStream(String path, boolean append) throws FileNotFoundException { 135024784c977a744708ab0bcefc4337d491e429937Jesse Wilson this(new File(path), append); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (this) { 141024784c977a744708ab0bcefc4337d491e429937Jesse Wilson if (channel != null) { 142024784c977a744708ab0bcefc4337d491e429937Jesse Wilson channel.close(); 143024784c977a744708ab0bcefc4337d491e429937Jesse Wilson } 144024784c977a744708ab0bcefc4337d491e429937Jesse Wilson if (shouldCloseFd && fd.valid()) { 14599a89dd6f0a0e1396aa9b3feebf15ea31f703d3aElliott Hughes IoUtils.close(fd); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Frees any resources allocated for this stream before it is garbage 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * collected. This method is called from the Java Virtual Machine. 153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs attempting to finalize this stream. 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 157e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom @Override protected void finalize() throws IOException { 158024784c977a744708ab0bcefc4337d491e429937Jesse Wilson try { 159e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom close(); 160e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } finally { 161e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom try { 162e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom super.finalize(); 163e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } catch (Throwable t) { 16463fcdd7e833df417cfbd60961a5167ce637f3071Brian Carlstrom // for consistency with the RI, we must override Object.finalize() to 16563fcdd7e833df417cfbd60961a5167ce637f3071Brian Carlstrom // remove the 'throws Throwable' clause. 166e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom throw new AssertionError(t); 167e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } 168024784c977a744708ab0bcefc4337d491e429937Jesse Wilson } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 172024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Returns a write-only {@link FileChannel} that shares its position with 173024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * this stream. 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public FileChannel getChannel() { 176024784c977a744708ab0bcefc4337d491e429937Jesse Wilson synchronized (this) { 177024784c977a744708ab0bcefc4337d491e429937Jesse Wilson if (channel == null) { 178024784c977a744708ab0bcefc4337d491e429937Jesse Wilson channel = NioUtils.newFileChannel(this, fd.descriptor, mode); 179024784c977a744708ab0bcefc4337d491e429937Jesse Wilson } 180024784c977a744708ab0bcefc4337d491e429937Jesse Wilson return channel; 181024784c977a744708ab0bcefc4337d491e429937Jesse Wilson } 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 185024784c977a744708ab0bcefc4337d491e429937Jesse Wilson * Returns the underlying file descriptor. 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final FileDescriptor getFD() throws IOException { 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return fd; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void write(byte[] buffer) throws IOException { 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project write(buffer, 0, buffer.length); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void write(byte[] buffer, int offset, int count) throws IOException { 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (buffer == null) { 199b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new NullPointerException("buffer == null"); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((count | offset) < 0 || count > buffer.length - offset) { 202b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new IndexOutOfBoundsException(); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count == 0) { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 207024784c977a744708ab0bcefc4337d491e429937Jesse Wilson checkOpen(); 2083db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.FILE_SYSTEM.write(fd.descriptor, buffer, offset, count); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void write(int oneByte) throws IOException { 213024784c977a744708ab0bcefc4337d491e429937Jesse Wilson checkOpen(); 214024784c977a744708ab0bcefc4337d491e429937Jesse Wilson byte[] buffer = { (byte) oneByte }; 215024784c977a744708ab0bcefc4337d491e429937Jesse Wilson Platform.FILE_SYSTEM.write(fd.descriptor, buffer, 0, 1); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 218024784c977a744708ab0bcefc4337d491e429937Jesse Wilson private synchronized void checkOpen() throws IOException { 219024784c977a744708ab0bcefc4337d491e429937Jesse Wilson if (!fd.valid()) { 220024784c977a744708ab0bcefc4337d491e429937Jesse Wilson throw new IOException("stream is closed"); 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 224