Java如何将For循环中的2D数组数据写入压缩.txt文件
解决方案
核心问题:ZipOutputStream的write()方法仅支持传入字节、字节数组类型参数,你现有代码直接传入字符串会编译报错,只需将待写入内容转为指定编码的字节数组即可正常写入。
修改步骤
- 引入字符编码常量,指定UTF-8编码避免跨环境乱码,需要导入包
java.nio.charset.StandardCharsets - 将待写入的字符串调用
getBytes(StandardCharsets.UTF_8)方法转为字节数组 - 建议提前把固定的逗号、换行符的字节数组在循环外定义,减少重复对象创建,提升大数量写入性能
修改后完整代码示例
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class WriteArrToZipTxt { public static void main(String[] args) throws IOException { // 替换为你实际的二维数组,示例默认按String数组处理,数值类型可按下方说明调整 String[][] arr = new String[1048577][25]; String zipOutputPath = "你的压缩包输出路径.zip"; String txtInnerPath = "压缩包内的txt文件名.txt"; FileOutputStream fos = new FileOutputStream(zipOutputPath); ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(fos)); ZipEntry zipEntry = new ZipEntry(txtInnerPath); zipOut.putNextEntry(zipEntry); // 循环外提前定义固定字符的字节数组,提升性能 byte[] commaBytes = ",".getBytes(StandardCharsets.UTF_8); byte[] newLineBytes = "\n".getBytes(StandardCharsets.UTF_8); for (int r = 0; r < 1048577; r++) { for (int c = 0; c < 25; c++) { // 如果arr元素是int/long等数值类型,替换为String.valueOf(arr[r][c])即可 zipOut.write(arr[r][c].getBytes(StandardCharsets.UTF_8)); zipOut.write(commaBytes); } zipOut.write(newLineBytes); } zipOut.closeEntry(); zipOut.close(); fos.close(); } }
优化建议:使用try-with-resources自动关流
可以使用Java 7+支持的try-with-resources语法自动关闭IO流,避免手动关闭遗漏导致的流泄漏,写法如下:
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class WriteArrToZipTxt { public static void main(String[] args) { String[][] arr = new String[1048577][25]; String zipOutputPath = "你的压缩包输出路径.zip"; String txtInnerPath = "压缩包内的txt文件名.txt"; // try-with-resources会自动关闭括号内定义的所有流资源 try (FileOutputStream fos = new FileOutputStream(zipOutputPath); ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(fos))) { ZipEntry zipEntry = new ZipEntry(txtInnerPath); zipOut.putNextEntry(zipEntry); byte[] commaBytes = ",".getBytes(StandardCharsets.UTF_8); byte[] newLineBytes = "\n".getBytes(StandardCharsets.UTF_8); for (int r = 0; r < 1048577; r++) { for (int c = 0; c < 25; c++) { zipOut.write(arr[r][c].getBytes(StandardCharsets.UTF_8)); zipOut.write(commaBytes); } zipOut.write(newLineBytes); } zipOut.closeEntry(); } catch (IOException e) { // 自定义异常处理逻辑 e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者JOAO12
相关产品推荐
相关产品推荐

