Why stream from BufferedReader::lines is not closing the reader?
Gernot Neppert
mcnepp02 at googlemail.com
Tue Nov 19 08:22:58 UTC 2013
Another idea to solve the long-standing issue with checked IOExceptions in
"close()" calls is to
add a method to java.io.Closeable, now possible thanks to default methods:
/**
* Invokes #close() and wraps IOExceptions with UncheckedIOExceptions.
*/
default void closeUnchecked() {
try { close(); } catch(IOException e) { throw new
UncheckedIOException(e); }
}
This would at least make it possible to pass
"closeableInstance::closeUnchecked" to Stream.onClose(Runnable).
2013/11/18 Peter Levart <peter.levart at gmail.com>
> On 11/18/2013 03:28 PM, Brian Goetz wrote:
>
>> Which means that, if your stream holds non-memory resources, the
>> flatMapper should create a stream that closes the underlying stream, like:
>>
>> blah.flatMap(path -> {
>> BufferedReader br = new BufferedReader(path);
>> return br.lines.onClose(br::close);
>> }
>> ...
>>
>
> ...the only problem with above code is that it doesn't compile, because of
> IOException declared on BufferedReader (FileReader actually!) constructor
> and BufferedReader.close() method. The solutions to this have already been
> discussed on the list some time ago, and one of the propositions was to
> create interfaces like:
>
>
> public interface IOFunction<T, R> extends Function<T, R> {
> default R apply(T t) {
> try {
> return applyIO(t);
> } catch (IOException e) {
> throw new UncheckedIOException(e);
> }
> }
>
> R applyIO(T t) throws IOException;
> }
>
>
> public interface IORunnable extends Runnable {
> default void run() {
> try {
> runIO();
> } catch (IOException e) {
> throw new UncheckedIOException(e);
> }
> }
>
> void ruinIO() throws IOException;
> }
>
>
> ...etc, and use them in code like this:
>
>
> List<String> paths = ...
> paths
> .stream()
> .flatMap((IOFunction<String, Stream<String>>) path -> {
> BufferedReader br = new BufferedReader(new FileReader(path));
> return br.lines().onClose((IORunnable) br::close);
> })
> .forEach(System.out::println);
>
>
>
> Regards, Peter
>
>
>
More information about the core-libs-dev
mailing list