JDK

java.io.Readerクラス

java.io.Readerクラスは入力関係を扱うクラスであるBufferedReaderクラス,InputStreamReaderクラス,StringReaderクラスなどのスーパークラスとなる抽象クラスである。

 まず,nullReader()メソッドでほぼ何もしないReadderクラスのインスタンスを作成する。.

 中段ではlockというprotectedなインスタンス変数で,排他制御を行っている。

read()メソッドはいくつかオーバーロードされており,read(char cbuf[], inf off, int len)は抽象メソッドになっている。オーバーロードされた他のメソッドはこの抽象メソッドを呼び出すようになっている。
  • read(java.nio.CharBuffer target) throws IOException
  • public int read() throws IOException
  • public int read(char cbuf[]) throws IOException
  • public int read(char cbuf[]) throws IOException
  • public abstract int read(char cbuf[], int off, int len) throws IOException

 このほか,読み飛ばすためのskip()メソッドや,リソースをクローズするためのclose()メソッド,そしてWriterへそのまま転送するtrnasfer(Writer)メソッドが定義されている。

/*
 * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package java.io;
import java.nio.CharBuffer;
import java.util.Objects;
public abstract class Reader implements Readable, Closeable {
    private static final int TRANSFER_BUFFER_SIZE = 8192;
    public static Reader nullReader() {
        return new Reader() {
            private volatile boolean closed;
            private void ensureOpen() throws IOException {
                if (closed) {
                    throw new IOException("Stream closed");
                }
            }
            @Override
            public int read() throws IOException {
                ensureOpen();
                return -1;
            }
            @Override
            public int read(char[] cbuf, int off, int len) throws IOException {
                Objects.checkFromIndexSize(off, len, cbuf.length);
                ensureOpen();
                if (len == 0) {
                    return 0;
                }
                return -1;
            }
            @Override
            public int read(CharBuffer target) throws IOException {
                Objects.requireNonNull(target);
                ensureOpen();
                if (target.hasRemaining()) {
                    return -1;
                }
                return 0;
            }
            @Override
            public boolean ready() throws IOException {
                ensureOpen();
                return false;
            }
            @Override
            public long skip(long n) throws IOException {
                ensureOpen();
                return 0L;
            }
            @Override
            public long transferTo(Writer out) throws IOException {
                Objects.requireNonNull(out);
                ensureOpen();
                return 0L;
            }
            @Override
            public void close() {
                closed = true;
            }
        };
    }
    protected Object lock;
    protected Reader() {
        this.lock = this;
    }
    protected Reader(Object lock) {
        if (lock == null) {
            throw new NullPointerException();
        }
        this.lock = lock;
    }
    public int read(java.nio.CharBuffer target) throws IOException {
        int len = target.remaining();
        char[] cbuf = new char[len];
        int n = read(cbuf, 0, len);
        if (n > 0)
            target.put(cbuf, 0, n);
        return n;
    }
    public int read() throws IOException {
        char cb[] = new char[1];
        if (read(cb, 0, 1) == -1)
            return -1;
        else
            return cb[0];
    }
    public int read(char cbuf[]) throws IOException {
        return read(cbuf, 0, cbuf.length);
    }
    public abstract int read(char cbuf[], int off, int len) throws IOException;
    private static final int maxSkipBufferSize = 8192;
    private char skipBuffer[] = null;
    public long skip(long n) throws IOException {
        if (n < 0L)
            throw new IllegalArgumentException("skip value is negative");
        int nn = (int) Math.min(n, maxSkipBufferSize);
        synchronized (lock) {
            if ((skipBuffer == null) || (skipBuffer.length < nn))
                skipBuffer = new char[nn];
            long r = n;
            while (r > 0) {
                int nc = read(skipBuffer, 0, (int)Math.min(r, nn));
                if (nc == -1)
                    break;
                r -= nc;
            }
            return n – r;
        }
    }
    public boolean ready() throws IOException {
        return false;
    }
    public boolean markSupported() {
        return false;
    }
    public void mark(int readAheadLimit) throws IOException {
        throw new IOException("mark() not supported");
    }
    public void reset() throws IOException {
        throw new IOException("reset() not supported");
    }
     public abstract void close() throws IOException;
    public long transferTo(Writer out) throws IOException {
        Objects.requireNonNull(out, "out");
        long transferred = 0;
        char[] buffer = new char[TRANSFER_BUFFER_SIZE];
        int nRead;
        while ((nRead = read(buffer, 0, TRANSFER_BUFFER_SIZE)) >= 0) {
            out.write(buffer, 0, nRead);
            transferred += nRead;
        }
        return transferred;
    }
}