2013年5月28日火曜日

[Java]ストリームを転送する

ファイルからファイルであれば、[Java]ファイルを簡単にコピーするでOKですが、適当な入力ストリームから出力ストリームに出力したい。みたいな時があります。
たとえば、特定のURLからファイルをダウンロードしてファイルに保存したいみたいなケースですね。単純なのでその場で書いてしまうケースが多いですが、それをクラス化してみました。

// try-with-resourcesをサポートするためにjava.io.Closeableをインプリメント
public class StreamTransmitter implements Closeable {

    final private InputStream input;
    final private OutputStream output;
    final int bufSize;

    public StreamTransmitter(InputStream is, OutputStream os) {
        input = is;
        output = os;
        bufSize = 2048;
    }

    public void transfer() throws IOException {
        byte[] buf = new byte[bufSize];

        int read;
        while ((read = input.read(buf)) != -1) {
            output.write(buf, 0, read);
        }
        output.flush();
    }

    @Override
    public void close() throws IOException {

        // 内包するStreamもCloseableなのでtry-with-resourcesでOK
        try (InputStream in = input; OutputStream out = output;) {
        }
    }
}

このクラスを利用した例。
public static void main(String[] args) {

    String in = "/temp/LICENSE.txt";
    String out = "/temp/LICENSE_OUT.txt";

    try (StreamTransmitter st = new StreamTransmitter(new FileInputStream(
            in), new FileOutputStream(out))) {

        st.transfer();

        // try-with-resourcesなので、明示しなくてもOK
        st.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

比較的簡単ですね。

0 件のコメント :