纯文本(CSV/TSV)导入导出最轻量,需注意分隔符处理与换行;序列化仅限Java内部使用,须固定serialVersionUID;POI处理Excel应选XSSFWorkbook/SXSSFWorkbook,日期读取用getDateCellValue;HTTP下载中文文件名需兼容设置Content-Disposition头。

用 BufferedReader 和 BufferedWriter 读写纯文本学生信息
纯文本(如 CSV 格式)是最轻量、兼容性最强的导入导出方式,适合快速调试或小规模数据。关键不是“能不能读”,而是字段分隔和换行处理是否鲁棒。
常见错误现象:NullPointerException(没判空)、IOException(文件路径含中文或权限不足)、字段含逗号导致解析错位。
- 学生字段建议用制表符
\t分隔,比逗号更安全;若必须用 CSV,需对字段内容做双引号包裹 + 双引号转义(如"张"三"→"张""三") - 写入时务必调用
writer.newLine()换行,不能只靠\n—— Windows 下可能显示为单行 - 读取时用
reader.readLine()循环,每行用String.split("\t", -1),加-1参数保留末尾空字段
用 ObjectInputStream / ObjectOutputStream 直接序列化学生对象
这种方式最省代码,但只适用于 Java 系统间传输,且要求类结构长期稳定。一旦 Student 类加了字段或改了包名,旧文件基本无法反序列化。
使用场景:内部工具临时存档、测试数据快照、无跨语言需求。
立即学习“Java免费学习笔记(深入)”;
-
Student类必须实现Serializable接口,且显式声明private static final long serialVersionUID = 1L;—— 否则 JVM 自动生成的 ID 每次编译都变,导致InvalidClassException - 文件后缀建议用
.ser,避免被当成普通二进制文件误操作 - 不要把
ArrayList直接序列化后反复追加——每次写入都是完整新对象流,读取时需按顺序一一反序列化,否则抛StreamCorruptedException
用 Apache POI 处理 Excel(.xlsx)导入导出
用户要的是“看起来像 Excel”,而不是真的需要公式或图表。POI 的 XSSFWorkbook 足够,别碰 HSSFWorkbook(仅支持老旧 .xls,且有 65536 行限制)。
性能影响:千条以内数据无压力;万级数据建议用 SXSSFWorkbook(流式写入),否则容易 OOM。
- 导出时,单元格值统一用
cell.setCellValue(String.valueOf(obj)),避免setCellType手动设类型——POI 5.0+ 已弃用该方法 - 导入时,用
row.getCell(colIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK)避免NullPointerException - 日期列读取务必用
cell.getDateCellValue(),别用getStringCellValue()—— Excel 内部存的是浮点数天数,直接转字符串会得乱码数字
导出文件下载到浏览器时中文文件名乱码
这不是 Java 文件操作问题,而是 HTTP 响应头编码不一致导致的。Tomcat、Spring Boot 内置容器、Nginx 对 Content-Disposition 的解析逻辑不同。
最容易被忽略的地方:不是文件内容乱码,是下载弹窗里文件名变成 %E5%AD%A6%E7%94%9F.xlsx 或一堆问号。
- Spring MVC 场景下,用
URLEncoder.encode(filename, "UTF-8")后拼接,但 IE 仅认filename*=UTF-8''xxx格式,所以得兼容写法:String encodedName = URLEncoder.encode(filename, "UTF-8").replace("+", "%20");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"; filename*=UTF-8''" + encodedName); - 非 Spring 环境(如 Servlet),注意 Tomcat 9+ 默认禁用
%解码,需在conf/catalina.properties加relaxedPathChars="|"并重启 - 测试阶段直接用 Chrome / Edge,别依赖 Firefox 或国产双核浏览器的兼容模式——它们对 RFC 5987 支持不一致










