如果您所关心的只是将字符串打印到文件中,请使用 aPrintStream
或PrintWriter
代替其他Writer
类。PrintStream
和的显着特点PrintWriter
是它们的打印操作不会抛出IOException
. 它们还自动调用toString
对象,这让事情变得非常方便:
public void write1(Iterable<?> objects) {
try (PrintStream ps = new PrintStream("printout.txt", "UTF-8")) {
objects.forEach(ps::println);
} catch (IOException ioe) {
// handle
}
}
如果您担心错误,可以致电PrintStream.checkError
,尽管这并没有告诉您任何可能发生的错误的细节。
但是,一般问题仍然存在,如果您想从forEach
不允许的上下文(例如 )中调用抛出异常的方法,该怎么办。这只是烦人的处理,虽然只是适度的。但是,它确实需要一些设置。假设我们要编写一个Consumer
抛出一个IOException
. 我们必须声明我们自己的功能接口:
interface IOConsumer<T> {
void accept(T t) throws IOException;
}
现在我们需要编写一个将 a 转换为 a 的IOConsumer
函数Consumer
。它通过将IOException
捕获的任何内容转换为UncheckedIOException
,为此目的创建的异常来做到这一点。
static <T> Consumer<T> wrap(IOConsumer<? super T> ioc) {
return t -> {
try {
ioc.accept(t);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
};
}
有了这些,我们现在可以重写原始示例如下:
public void write2(Iterable<?> objects) {
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("out.txt"), "UTF-8"))) {
objects.forEach(wrap(o -> bw.write(o.toString())));
} catch (IOException|UncheckedIOException e) {
//handle exception
}
}