我想做的是:
在服务器上生成一个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>
不起作用的东西:
当我单击触发该操作的链接时,实际上下载了一个名为"id_opp.txt“的文件,它包含所有文本("toto"),但它在每个字符之前添加了一个空格。
“t o o”
在服务器调试中,我确信我的变量包含"toto“服务器端,所以它必须是我错过的配置。
知道吗?
使用导入org.hsqldb.lib.StringInputStream;对于InputStream,由于字符串是在该类中生成的,所以我不能使用FileInputStream或其他任何东西,所以我不知道有什么其他方法可以做到这一点?
检查编码,一旦得到一些结果,就会更新。
感谢托马斯:
使用StringInputStream是问题的根源,取而代之的是: fileInputStream =新的fileInputStream
它为"res“变量构建一个inputStream,并使用实际的编码等.
发布于 2016-08-09 06:25:30
像这样的问题可能会由于不同的编码而发生。在内部,Java使用16位字符存储字符串,当您将这些字符转换为字节表示(例如写入流)时,它将使用一些编码(调用方提供的编码或默认编码(通常是系统编码)。
因此,它将取决于StringInputStream
对字符串做了什么,即它如何将字符串转换为字节,以及使用了哪种编码(如果有的话)。
此外,如果不添加任何信息来指示编码(如UTF-8的BOM (字节顺序标记)),则可能取决于读者如何解释txt文件。
正如您所做的那样,即使用ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8))
,至少可以在编写时解决问题。编辑器可能会正确地解释数据,即使缺少BOM ( UTF-8表示像ISO-拉丁文1 (ASCII)这样的通用字符,因此即使是读取器中的“错误”编码也可能不是问题)。
https://stackoverflow.com/questions/38853061
复制相似问题