写入StringBuilder时某些字符丢失

问题描述 投票:0回答:1

我正在处理Java代码,这里是:

public InputStream unzip(InputStream inputStream) throws IOException {
        ZipInputStream zipIn = new ZipInputStream(inputStream);
        zipIn.getNextEntry();
        Scanner sc = new Scanner(zipIn);
        StringBuilder sb = new StringBuilder();
        while (sc.hasNextLine()) {
            sb.append(sc.nextLine());
            sb.append("\n");
        }
        System.out.println(sb);
        zipIn.close();
        InputStream is = fromStringBuffer(sb);
        return (InputStream)is;
    }

    public static InputStream fromStringBuffer(StringBuilder sb) {
          return new ByteArrayInputStream(sb.toString().getBytes());
        }

虽然我正在解压缩文件,但某些土耳其字符的格式却很奇怪(例如Ü变为Ãœ)。

如何将它们正确写入StringBuilder?

java zip stringbuilder zipfile
1个回答
1
投票

(与java.io相对的java.util.stream种类的流是用于读取(或写入)bytes

Scanner处理字符。如果将InputStream传递给Scanner,则需要提供一个字符集;否则,它将使用默认字符集。

但是:假设传递给Scanner的字节流实际上使用某些字符集表示一个字符流。 ZipInputStream不一定:压缩文件的内容如何。如果您说缺少字符,我想您的压缩文件是文本;但是,从读取zip文件的角度来看,它只是字节流。

如果要从InputStream中获取ZipInputStream,只需返回ZipInputStream

如果您要将返回的流解释为字符,当然,您仍然需要知道字符集;但您只是不会在此处引入从字节到字符再到字节的不必要的往返。

如果要在此方法中处理所有字符集编码,请返回Reader,它是Reader的类似物,代表字符流。

例如,您可以返回InputStream,例如InputStreamReader。这不会使您免于了解正确的字符集的问题。但它使方法的调用者不必处理它。

© www.soinside.com 2019 - 2024. All rights reserved.