I/O
Handling existing InputStreams and OutputStreams
Reading the content of an InputStream
as a byte
array:
// Reading from a file
try (InputStream in = new FileInputStream("in.dat")) {
byte[] content = ByteStreams.toByteArray(in);
// do something with content
}
Copying an InputStream
to an OutputStream
:
// Copying the content from a file in.dat to out.dat.
try (InputStream in = new FileInputStream("in.dat");
OutputStream out = new FileOutputStream("out.dat")) {
ByteStreams.copy(in, out);
}
Note: to copy files directly, it’s better to use Files.copy(sourceFile, destinationFile)
.
Reading an entire predefined byte
array from an InputStream
:
try (InputStream in = new FileInputStream("in.dat")) {
byte[] bytes = new byte[16];
ByteStreams.readFully(in, bytes);
// bytes is totally filled with 16 bytes from the InputStream.
} catch (EOFException ex) {
// there was less than 16 bytes in the InputStream.
}
Skipping n
bytes from the InputStream
:
try (InputStream in = new FileInputStream("in.dat")) {
ByteStreams.skipFully(in, 20);
// the next byte read will be the 21st.
int data = in.read();
} catch (EOFException e) {
// There was less than 20 bytes in the InputStream.
}
Creating an OutputStream
that discards everything that is written to it:
try (InputStream in = new FileInputStream("in.dat");
OutputStream out = ByteStreams.nullOutputStream()) {
ByteStreams.copy(in, out);
// The whole content of in is read into... nothing.
}
Handling existing Readers and Writers
Reading the content of a Reader
as a String
:
// Reading from a file
try (Reader reader = new FileReader("in.txt")) {
String content = CharStreams.toString(reader);
// do something with content
}
Reading the content of a Reader
as a list of line contents:
try (Reader reader = new FileReader("in.txt")) {
List<String> lines = CharStreams.readLines(reader);
for (String line: lines) {
// Do something with line
}
}
Copying a Reader
to a Writer
:
try (Reader reader = new FileReader("in.txt");
Writer writer = new FileWriter("out.txt")) {
CharStreams.copy(reader, writer);
}
Note: to copy files directly, it’s better to use Files.copy(sourceFile, destinationFile).
Skipping n
bytes from the Reader
:
try (Reader reader = new FileReader("in.txt")) {
CharStreams.skipFully(reader, 20);
// The next char read will be the 21st.
} catch (EOFException e) {
// There was less than 20 chars in the Reader.
}
Creating a Writer
that discards everything that is written to it:
try (Reader reader = new FileReader("in.txt");
Writer writer = CharStreams.nullWriter()) {
CharStreams.copy(reader, writer);
// The whole content of reader is read into... nothing.
}
Sources and sinks
Sources and sinks are objects that know how to open streams.
Bytes | Chars | |
---|---|---|
Reading | ByteSource |
CharSource |
Writing | ByteSink |
CharSink |
Creating sources and sinks
Note: for all examples, consider UTF_8
as if the following import is set:
import static java.nio.charset.StandardCharsets.UTF_8;
Reading from a file
ByteSource dataSource = Files.asByteSource(new File("input.dat"));
CharSource textSource = Files.asCharSource(new File("input.txt"), UTF_8);
Writing to a file
ByteSink dataSink = Files.asByteSink(new File("output.dat"));
CharSink textSink = Files.asCharSink(new File("output.txt"), UTF_8);
Reading from a URL
ByteSource dataSource = Resources.asByteSource(url);
CharSource textSource = Resources.asCharSource(url, UTF_8);
Reading from in memory data
ByteSource dataSource = ByteSource.wrap(new byte[] {1, 2, 3});
CharSource textSource = CharSource.wrap("abc");
Converting from bytes to chars
ByteSource originalSource = ...
CharSource textSource = originalSource.asCharSource(UTF_8);
Converting from chars to bytes
(From Guava 20 onwards)
CharSource originalSource = ...
ByteSource dataSource = originalSource.asByteSource(UTF_8);
Using sources and sinks
Common operations
Opening a stream
InputStream inputStream = byteSource.openStream();
OutputStream outputStream = byteSink.openStream();
Reader reader = charSource.openStream();
Writer writer = charSink.openStream();
Opening a buffered stream
InputStream bufferedInputStream = byteSource.openBufferedStream();
OutputStream bufferedOutputStream = byteSink.openBufferedStream();
BufferedReader bufferedReader = charSource.openBufferedStream();
Writer bufferedWriter = charSink.openBufferedStream();
Source operations
Reading from a source:
ByteSource source = ...
byte[] bytes = source.read();
CharSource source = ...
String text = source.read();
Reading lines from a source:
CharSource source = ...
ImmutableList<String> lines = source.readLines();
Reading the first line from a source:
CharSource source = ...
String firstLine = source.readFirstLine();
Copying from a source to a sink:
ByteSource source = ...
ByteSink sink = ...
source.copyTo(sink);
CharSource source = ...
CharSink sink = ...
source.copyTo(sink);
Typical usage
CharSource source = ...
try (Reader reader = source.openStream()) {
// use the reader
}