【问题标题】:Stream Closed IO Exception Java - android studio流关闭 IO 异常 Java - android studio
【发布时间】:2022-02-03 20:15:04
【问题描述】:

我正在尝试压缩子文件夹并收到 Stream Closed 异常

private static void zipSubFolder(ZipOutputStream out, File folder, int basePathLength) throws IOException{
            final int BUFFER = 2048;
    
            File[] fileList = folder.listFiles();
            BufferedInputStream origin = null;
            for (File file : fileList) {
                if (file.isDirectory()) {
                    zipSubFolder(out, file, basePathLength);
                } else {
                    byte[] data = new byte[BUFFER];
                    String unmodifiedFilePath = file.getPath();
                    String relativePath = unmodifiedFilePath
                            .substring(basePathLength);
                    try (FileInputStream fi = new FileInputStream(unmodifiedFilePath)) {
                        origin = new BufferedInputStream(fi, BUFFER);
                    }
                    ZipEntry entry = new ZipEntry(relativePath);
                    entry.setTime(file.lastModified()); // to keep modification time after unzipping
                    out.putNextEntry(entry);
                    int count;
                    while ((count = origin.read(data, 0, BUFFER)) != -1) {
                        out.write(data, 0, count);
                    }
                    origin.close();
                }
            }
        }

在这行出现错误: while ((count = origin.read(data, 0, BUFFER)) != -1)

: java.io.IOException: Stream Closed
        at java.io.FileInputStream.read(FileInputStream.java:313)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)

【问题讨论】:

    标签: java android android-studio ioexception fileinputstream


    【解决方案1】:

    只要您离开 {} 括号,您的 try 资源语句就会关闭 FileInputStream fi。尝试将整个代码放在 try 资源括号内。

    来自 java 文档: BufferedInputStream 将功能添加到另一个输入流,即缓冲输入并支持标记和重置方法的能力。创建 BufferedInputStream 时,会创建一个内部缓冲区数组。当流中的字节被读取或跳过时,内部缓冲区会根据需要从包含的输入流中重新填充,一次很多字节。标记操作会记住输入流中的一个点,并且重置操作会导致在从包含的输入流中获取新字节之前重新读取自最近一次标记操作以来读取的所有字节。

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 2017-01-05
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多