写入 StringBuilder 时某些字符丢失
Some characters get lost while writing to StringBuilder
我正在处理 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
相对)用于读取(或写入)字节.
Scanner
处理 个字符 。如果将 InputStream
传递给 Scanner
,则需要提供字符集;否则它使用默认字符集。
但是:这假设传递给 Scanner
的字节流实际上确实代表了一个字符流,使用了一些字符集。 ZipInputStream
不一定:它是压缩文件的内容。如果您说缺少字符,我认为您的压缩文件是文本;但是,从读取zip文件的角度来看,它只是一个字节流。
如果您想要 ZipInputStream
中的 InputStream
,只需 return ZipInputStream
.
如果您想将 returned 流解释为字符,当然您仍然需要知道字符集;但是你不会在这里引入不必要的从字节到字符到字节的往返。
如果您希望在此方法中处理所有字符集编码,return Reader
,InputStream
的类似物,表示字符流。
例如,您可以 return 一个 InputStreamReader
,例如new InputStreamReader(zipIn, charset)
。这并不能免除您了解正确字符集的问题;但它使方法的调用者不必处理它。
我正在处理 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
相对)用于读取(或写入)字节.
Scanner
处理 个字符 。如果将 InputStream
传递给 Scanner
,则需要提供字符集;否则它使用默认字符集。
但是:这假设传递给 Scanner
的字节流实际上确实代表了一个字符流,使用了一些字符集。 ZipInputStream
不一定:它是压缩文件的内容。如果您说缺少字符,我认为您的压缩文件是文本;但是,从读取zip文件的角度来看,它只是一个字节流。
如果您想要 ZipInputStream
中的 InputStream
,只需 return ZipInputStream
.
如果您想将 returned 流解释为字符,当然您仍然需要知道字符集;但是你不会在这里引入不必要的从字节到字符到字节的往返。
如果您希望在此方法中处理所有字符集编码,return Reader
,InputStream
的类似物,表示字符流。
例如,您可以 return 一个 InputStreamReader
,例如new InputStreamReader(zipIn, charset)
。这并不能免除您了解正确字符集的问题;但它使方法的调用者不必处理它。