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