使用流API和Lambda表达式创建FileOutputStream文件时出错

20jt8wwn  于 2022-09-21  发布在  Eclipse
关注(0)|答案(1)|浏览(151)

我正在尝试通过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:

但在处理它时,它捕捉到错误异常:

我正在尝试不同的选择,但我想知道,你们中有谁知道如何避免这个错误

3ks5zfa0

3ks5zfa01#

问题是,您使用Finally块来关闭流块内部的OutputStream,它在每次迭代后被执行。您需要将Finally移到Catch块之后,它将起作用:

public class EjemploFileOutputStream {
    static OutputStream fOut2 = null;

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {

        List<Number> cantidades = Arrays.asList(1, 2, 3, 4, 5);
        try {
            fOut2 = new FileOutputStream("primero3.dat");
            cantidades.stream().map(cantidad->cantidad.intValue()).forEach(cantidad -> {
                try {
                    fOut2.write(cantidad);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

            });
        } catch (FileNotFoundException e1) {            
            e1.printStackTrace();
        } finally {
            if (fOut2 != null)
                try {
                    fOut2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}

请注意,您还可以使用try-with构造来清理代码,该构造负责自动关闭流:

public class EjemploFileOutputStream {

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {

        List<Number> cantidades = Arrays.asList(1, 2, 3, 4, 5);
        try (OutputStream fOut2 = new FileOutputStream("primero3.dat")){
            cantidades.stream().map(cantidad->cantidad.intValue()).forEach(cantidad -> {
                try {
                    fOut2.write(cantidad);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

最后一件事。使用IntStream而不是List,无需调用stream()map()调用:

public class EjemploFileOutputStream {

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {

        IntStream cantidades = IntStream.of(10, 20, 30, 40, 50);
        try (OutputStream fOut2 = new FileOutputStream("primero3.dat")){
            cantidades.forEach(cantidad -> {
                try {
                    fOut2.write(cantidad);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

相关问题