我正在尝试通过FileOutputStream
流创建文件,如果我使用for
-loop,它会正确地执行此操作:
public class EjemploFileOutputStream {
/**
* @param args
*/
public static void main(String[] args) {
OutputStream fOut = null;
try {
fOut = new FileOutputStream("primero.dat");
for(int i = 0; i < 1000; i++) {
fOut.write(i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fOut != null)
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
但是使用Stream API和Lambda表达式时,它给出了一个错误
代码是这样的:
public class EjemploFileOutputStream {
static OutputStream fOut2 = null;
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
List<Number> cantidades = Arrays.asList(10, 20, 30, 40, 50);
try {
fOut2 = new FileOutputStream("primero3.dat");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
cantidades.stream().map(cantidad->cantidad.intValue()).forEach(cantidad -> {
try {
fOut2.write(cantidad);
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (fOut2 != null)
try {
fOut2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
控制台(Eclipse)中的错误跟踪:
调试器模式下的序列:列表的第一个值显示为OK,cantida=10
列表中的下一个值显示为OK,cantida=20:
但在处理它时,它捕捉到错误异常:
我正在尝试不同的选择,但我想知道,你们中有谁知道如何避免这个错误
1条答案
按热度按时间3ks5zfa01#
问题是,您使用Finally块来关闭流块内部的
OutputStream
,它在每次迭代后被执行。您需要将Finally移到Catch块之后,它将起作用:请注意,您还可以使用
try-with
构造来清理代码,该构造负责自动关闭流:最后一件事。使用
IntStream
而不是List
,无需调用stream()
或map()
调用: