【问题标题】:HttpServletResponse PrintWriter to write an InputStreamHttpServletResponse PrintWriter 写一个 InputStream
【发布时间】:2012-01-27 16:20:58
【问题描述】:

我有一个 HttpServletResponse 对象,需要编写一个包含在 jar 中的文件。以下代码段对我不起作用。

URI uri = <myclass>.class.getResource("/" + filename).toURI(); 
PrintWriter out = response.getWriter();
File f = new File(uri); 
FileReader bis = new FileReader(f);
char[] buff = new char[1024];
int bytesRead;
// Simple read/write loop.
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    out.write(buff, 0, bytesRead);
}

我知道这会奏效

InputStream inputStream = <myclass>.class.getResourceAsStream("/" + filename);

但我无法让 PrintWriter out.write 写入 inputStream。

谁能告诉我如何做到这一点。

谢谢

【问题讨论】:

  • 抱歉,需要读取jar中的一个文件,一个资源文件。

标签: servlets inputstream printwriter


【解决方案1】:

使用以下方法解决

InputStream inputStream = KCSSchemaController.class.getResourceAsStream("/" + schemaname);

OutputStream output = response.getOutputStream();

ByteStreams.copy(inputStream, output);

output.flush();

【讨论】:

    【解决方案2】:

    需要写一个包含在jar中的文件。

    这是不可能的。您基本上需要获取 JAR 文件的绝对磁盘文件系统路径,使用 JarInputStream 提取它(JAR 基本上是一个 ZIP 文件,它遵循特定的文件夹结构并得到 Java 的特殊处理),编辑/添加解压后的文件夹结构中的文件,然后使用JarOutputStream 再次打包。如果您稍后在运行时需要更改的 JAR 内容,您可能需要在之后使用(自定义)ClassLoader 重新加载它。

    然而,这非常复杂并且没有意义。作为一个完全不同的选择,不要尝试更改 JAR,而只是将数据存储在其他地方,例如在磁盘文件系统上的固定位置,或在数据库中,或作为用户/系统首选项等。选择哪种方式取决于问题中不清楚的具体功能要求。

    【讨论】:

    • 抱歉,需要读取jar中的一个文件,一个资源文件。
    • 如果您只需要读取它(而不是写它!),只需按照通常的方式使用ClassLoader#getResourseAsStream()即可。
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2011-12-08
    • 2016-12-19
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多