FileInputStream(file)); // 建立缓冲区对象BufferedInputStream bis = new BufferedInputStream(fis); // 设置response的内容类型response.setContentType("application/x-msdownload"); // 这里可以修改为其他后缀,比如jpg、txt等response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8")); // 建立缓冲区输出流BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); // 读取文件内容并输出到浏览器byte[] buffer = new byte[1024]; int length = -1; while ((length = bis.read(buffer)) != -1) { bos.write(buffer, 0, length); } // 关闭流bis.close(); fis.close(); } catch (IOException e) { log.error("下载文件出错:" + e.getMessage()); e.printStackTrace(); } return response; }
在Java开发中,生成和下载Word文档是一项常见的需求。本示例代码主要展示了如何使用FreeMarker模板引擎结合Java技术来生成Word文件,并通过HttpServletResponse实现文件下载。以下是相关的知识点:
1. **FreeMarker模板引擎**:
FreeMarker是一个基于Java的模板引擎,它能够将模板和数据模型结合起来生成输出,如HTML、XML、Word文档等。在本示例中,`createWord`方法使用了FreeMarker来生成Word文件。创建一个`Configuration`对象设置编码为UTF-8,然后加载模板文件(如`test.ftl`),最后将数据模型(`Map<String, Object> dataMap`)与模板合并,生成`.doc`文件。
2. **文件操作**:
在Java中,文件操作主要通过`java.io`包中的类完成。例如,`File`用于表示文件或目录,`FileInputStream`和`FileOutputStream`分别用于读写文件。在`createWord`方法中,使用`FileOutputStream`将生成的文件写入指定路径,而`downFile`方法则使用`FileInputStream`读取文件以供下载。
3. **字符编码**:
为了确保正确处理中文字符,Java代码中多次设置了字符编码为UTF-8,如`setDefaultEncoding("UTF-8")`和`"UTF-8"`参数传递给`OutputStreamWriter`。这确保了在生成和读取文件时,中文字符能够被正确地解析和显示。
4. **流的使用**:
Java的I/O操作通常涉及到流(Stream)。在本代码中,`BufferedInputStream`和`BufferedOutputStream`被用来提高读写文件的效率,它们提供了缓冲区,减少了对磁盘的直接访问次数。`BufferedWriter`和`OutputStreamWriter`用于在内存中处理文本数据,转换为适合输出的格式。
5. **HTTP响应**:
`downFile`方法通过`HttpServletResponse`接口来实现文件下载。首先设置响应的content-type为`"application/x-msdownload"`,表明这是一个可下载的文件,然后设置`Content-disposition`头来指定文件的下载名称。接着,从文件中读取内容并写入到响应输出流中,完成文件的下载。
6. **异常处理**:
在整个过程中,代码使用了`try-catch`语句来捕获可能出现的异常,如`IOException`,并在日志中记录错误信息,确保程序的健壮性。
7. **目录创建**:
当输出文件的父目录不存在时,通过`mkdirs()`方法创建所需的文件结构,确保文件能被正确地保存。
这段代码提供了一个完整的Java生成Word文件并下载的解决方案,结合了FreeMarker模板引擎和Java I/O操作,同时考虑了文件下载过程中的各种细节。开发者可以根据自己的实际需求,调整数据模型和模板内容,以满足不同的文档生成场景。