友
我必须使用BOM(字节顺序标记)来确保以UTF-8格式正确显示cvs和excel中的下载文件。
**
我的问题是可以将BOM应用于FileOutputStream而不是 OutputStream如下所示?
**
String targetfileName = reportXMLFileName.substring(0, reportXMLFileName.lastIndexOf(".") + 1);
targetfileName += "xlsx";
File tmpFile=new File((filePath !=null?filePath.trim():"")+"/"+templateFile);
FileOutputStream out = new FileOutputStream((filePath !=null?filePath.trim():"")+"/"+targetfileName);
/* Here is the example*/
out.write(new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF });
substitute(tmpFile, tmp, sheetRef.substring(1), out);
out.close();
答案 0 :(得分:1)
是。 BOM位于任何数据流的开头,无论是通过网络还是通过文件。只需以相同的方式将BOM写入文件的开头,只需FileOutputStream
即可。无论如何,请记住FileOutputStream 是一种OutputStream。
答案 1 :(得分:1)
(正如评论中所述。)
以下file
可能是文件,(文件)OutputStream或String(文件名)。
final String ENCODING = "UTF-8";
PrintWriter out = new PrintWriter(file, ENCODING))));
try {
out.print("\ufffe"); // Write the BOM
out.println("<?xml version=\"1.0\" encoding=\"" + ENCODING + "\"?>");
...
} finally {
out.close();
}
或者从Java 7开始:
try (PrintWriter out = new PrintWriter(f, ENCODING))))) {
out.print("\ufffe"); // Write the BOM
out.println("<?xml version=\"1.0\" encoding=\"" + ENCODING + "\"?>");
...
}
使用文本,使用Writer更自然,因为不需要自己用String.getBytes("UTF-8")
转换字符串。