我想做的事情:
在服务器上生成一个txt文件并在客户端下载。 我使用struts 2,这里是代码部分:
AwesomeAction.java
InputStream fileInputStream;
public InputStream getFileInputStream(){
return fileInputStream;
}
public String execute() {
res = "toto";
fileInputStream = new StringInputStream(res);
return SUCCESS;
}
struts.xml中
<action name="awesomeAction" class="pathtomyawesomeaction">
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">fileInputStream</param>
<param name="contentDisposition">attachment;filename="id_opp.txt"</param>
<param name="bufferSize">1024</param>
</result>
<result name="error" type="redirect">/erreur.do</result>
</action>
什么不行:
当我点击触发动作的链接时,会出现一个名为&#34; id_opp.txt&#34;的文件。实际上是下载的,它包含所有文本(&#34; toto&#34;)但它在每个字符前添加一个空格。
&#34; t o t o&#34;
通过服务器调试,我确定我的变量包含&#34; toto&#34;服务器端,所以它必须是我想念的配置......
有什么想法吗?
使用import org.hsqldb.lib.StringInputStream;对于InputStream,由于String是在该类中构建的,我无法使用FileInputStream或其他任何东西,我不知道有任何其他方法可以做到这一点吗?
检查编码,一旦我得到一些结果就会更新
感谢Thomas:
使用StringInputStream是问题的根源,而是将其切换为: fileInputStream = new ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8));
为&#34; res&#34;构建一个inputStream。变量,实际编码等...
答案 0 :(得分:1)
由于编码不同,可能会出现这样的问题。内部Java使用16位字符存储字符串,当您将它们转换为字节表示形式(例如,用于写入流)时,它将使用一些编码(调用者提供的编码或默认编码,通常是系统编码)。 / p>
因此,它取决于StringInputStream
对字符串的作用,即它如何将字符串转换为字节以及使用哪种编码(如果有的话)。
此外,如果您不添加任何指示编码的信息(如UTF-8的BOM(字节顺序标记)),则可能取决于读者如何解释txt文件。
像你一样这样做,即使用ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8))
,至少可以在写作时解决问题。编辑器可能会正确解释数据,即使缺少BOM(UTF-8代表常见字符,如ISO-Latin 1(ASCII),因此即使读者中的“错误”编码也可能不是问题)。