我无法读取压缩文件

时间:2015-11-30 14:35:26

标签: java inputstream

我们必须首先使用DeflaterOutputStream编写压缩文件,然后我们必须使用InflaterInputStream将其读回。当我尝试阅读该行时,我总是得到一个EOFException。

这是我的java代码:

package oef5;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;

public class oef5 {

    public static void main(String[] args) {
        Path pad =Paths.get("C:\\Users\\11402457\\Desktop\\school\\java advanced\\H05 - Lezen en schrijven\\oef5.txt");
        FileOutputStream out;
        try {
            out = new FileOutputStream("C:\\Users\\11402457\\Desktop\\school\\java advanced\\H05 - Lezen en schrijven\\oef5.txt");
        DeflaterOutputStream file = new DeflaterOutputStream(out);
        PrintStream print = new PrintStream(file);
        ObjectOutputStream out2 = new ObjectOutputStream(print);
        out2.writeObject("Dries");

        FileInputStream in = new FileInputStream("C:\\Users\\11402457\\Desktop\\school\\java advanced\\H05 - Lezen en schrijven\\oef5.txt");
        InflaterInputStream file2 = new InflaterInputStream(in);
        InputStreamReader reader = new InputStreamReader(file2);
        BufferedReader br = new BufferedReader(reader);
        StringBuilder sb = new StringBuilder();
        sb.append(br.readLine());
        String string = sb.toString();
        System.out.println(string);
        } 
        catch (IOException e) {
            e.printStackTrace();
        }

这些是我的例外:

java.io.EOFException: Unexpected end of ZLIB input stream
    at java.util.zip.InflaterInputStream.fill(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at oef5.oef5.main(oef5.java:33)

我已经尝试了很多,但似乎没有任何效果,我想我的流有问题。

1 个答案:

答案 0 :(得分:4)

这里有三个问题:

  • 您无缘无故地使用PrintStream,这会吞下例外。
  • 您正在使用ObjectOutputStream编写数据,即创建Java序列化对象的二进制文件,但您尝试使用InputStreamReader读取它,如如果它是纯文本文件(但压缩)
  • 在您尝试阅读
  • 之前,您没有关闭任何流

如果您只是尝试阅读和撰写文本,您应该只使用OutputStreamWriter(或BufferedWriter包装它)来写入,而不是ObjectOutputStream。使用try-with-resources语句自动关闭流:

try (FileOutputStream file = new FileOutputStream(out),
    DeflaterOutputStream deflater = new DeflaterOutputStream(file),
    OutputStreamWriter writer = new OutputStreamWriter(deflater, StandardCharsets.UTF_8),
    BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
  // Write to bufferedWriter here
}

然后以类似的方式阅读它,但使用输入流和阅读器。