转换Spool文件为文本时,如何避免FileOutputStream写入空行?
解决Spool文件转文本后每行自动添加空行的问题
你遇到的这个每行后自动加空行的问题,大概率是换行符格式不匹配导致的——Spool文件转换后的字节流里,换行可能是Windows风格的\r\n,而你直接写入文件时没有做处理,或者转换过程中额外生成了重复的换行标记。你的代码现在是把字节流原封不动写入文件,相当于完全保留了转换后的换行格式,所以才会出现多余空行。
给你两种可行的解决思路:
思路1:读取时统一处理换行符
通过把字节流转换成字符流,逐行读取并重新写入统一格式的换行符,这样就能消除多余空行。修改后的代码如下:
PrintObjectTransformedInputStream txtInStream = spooledFile.getTransformedInputStream(plist); if(txtInStream != null) { // 获取文件编码,避免乱码 String codepage = spooledFile.getStringAttribute(PrintObject.ATTR_CODEPAGE); // 用指定编码包装输入流,逐行读取 BufferedReader reader = new BufferedReader(new InputStreamReader(txtInStream, codepage)); FileWriter writer = new FileWriter(fileName); String line; while ((line = reader.readLine()) != null) { // 写入当前行,然后添加你需要的换行符(比如Unix风格的\n) writer.write(line); writer.write("\n"); } // 记得关闭流 writer.close(); reader.close(); }
readLine()方法会自动识别任何类型的换行符(\r\n、\r、\n)并将其剔除,之后我们手动添加统一的换行符,就能保证每行后不会出现多余空行。
思路2:检查转换参数plist
你调用getTransformedInputStream(plist)时,这个参数列表里可能有控制输出换行格式的配置项。比如部分Spool转换工具允许指定输出的换行类型(比如LF或CRLF),如果能找到对应的配置,直接在转换阶段就指定正确的换行格式,会比事后处理更高效。你可以查一下对应API的文档,看看有没有类似ATTR_LINE_ENDING这类的属性可以设置。
内容的提问来源于stack exchange,提问作者Raframi
相关产品推荐
相关产品推荐

