在Struts2下载期间插入自动空间

时间:2016-08-09 14:06:22

标签: java text download inputstream

我想做的事情:

在服务器上生成一个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。变量,实际编码等...

1 个答案:

答案 0 :(得分:1)

由于编码不同,可能会出现这样的问题。内部Java使用16位字符存储字符串,当您将它们转换为字节表示形式(例如,用于写入流)时,它将使用一些编码(调用者提供的编码或默认编码,通常是系统编码)。 / p>

因此,它取决于StringInputStream对字符串的作用,即它如何将字符串转换为字节以及使用哪种编码(如果有的话)。

此外,如果您不添加任何指示编码的信息(如UTF-8的BOM(字节顺序标记)),则可能取决于读者如何解释txt文件。

像你一样这样做,即使用ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8)),至少可以在写作时解决问题。编辑器可能会正确解释数据,即使缺少BOM(UTF-8代表常见字符,如ISO-Latin 1(ASCII),因此即使读者中的“错误”编码也可能不是问题)。