我正在处理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.io
相对的java.util.stream
种类的流是用于读取(或写入)bytes。
Scanner
处理字符。如果将InputStream
传递给Scanner
,则需要提供一个字符集;否则,它将使用默认字符集。
但是:假设传递给Scanner
的字节流实际上使用某些字符集表示一个字符流。 ZipInputStream
不一定:压缩文件的内容如何。如果您说缺少字符,我想您的压缩文件是文本;但是,从读取zip文件的角度来看,它只是字节流。
如果要从InputStream
中获取ZipInputStream
,只需返回ZipInputStream
。
如果您要将返回的流解释为字符,当然,您仍然需要知道字符集;但您只是不会在此处引入从字节到字符再到字节的不必要的往返。
如果要在此方法中处理所有字符集编码,请返回Reader
,它是Reader
的类似物,代表字符流。
例如,您可以返回InputStream
,例如InputStreamReader
。这不会使您免于了解正确的字符集的问题。但它使方法的调用者不必处理它。