abstract class Files { public <R extends Readable & Closeable> void copy(InputSupplier<R> from) { CharStreams.copy(from, newWriterSupplier()); } public <W extends Appendable & Closeable> void copy(OutputSupplier<W> to) { CharStreams.copy(newReaderSupplier(), to); } abstract OutputSupplier<OutputStreamWriter> newWriterSupplier(); abstract InputSupplier<InputStreamReader> newReaderSupplier(); }