You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac环境下如何读取ZIP压缩包中文本文件并按行获取内容?

解决Mac系统下Java读取ZIP中文本文件分行显示的问题

我在Mac系统上用Java读取ZIP压缩包里的文本文件时,遇到了一个问题——原本分行存储的文本内容,被现有代码全部打印在了同一行。想请教怎么修改代码,实现按行获取并显示这些文本内容?

现有代码片段:

public static void main(String[] args) throws IOException { 
    QuickTest mfe = new QuickTest(); 
    ZipFile zip = new ZipFile("test.txt.zip"); 
    for (Enumeration e = zip.entries(); e.hasMoreElements(); ) { 
        ZipEntry entry = (ZipEntry) e.nextElement(); 
        System.out.println(entry.getName()); 
        if (!entry.isDirectory()) { 
            if (FilenameUtils.getExt... // 原代码未完成的读取逻辑
        }
    }
}

问题根源是你当前的读取逻辑(应该是一次性读取全部字节转成字符串)没有处理换行符。Mac系统传统换行符是\r,不过现代场景也兼容\n,但核心是要按行读取内容,而不是一次性加载全部。下面给你两种实用的修改方案:

方案1:用BufferedReader逐行读取(兼容所有Java版本)

BufferedReader的readLine()方法会自动识别不同操作系统的换行符(Mac的\r、Windows的\r\n、Linux的\n),是最稳妥的方式。修改后的完整代码:

import org.apache.commons.io.FilenameUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class QuickTest {
    public static void main(String[] args) throws IOException {
        ZipFile zip = new ZipFile("test.txt.zip");
        // 泛型优化枚举类型,避免强制转换
        for (Enumeration<? extends ZipEntry> e = zip.entries(); e.hasMoreElements(); ) {
            ZipEntry entry = e.nextElement();
            System.out.println("正在读取:" + entry.getName());
            if (!entry.isDirectory()) {
                // 过滤文本文件(可根据需求调整后缀)
                if ("txt".equalsIgnoreCase(FilenameUtils.getExtension(entry.getName()))) {
                    // 使用try-with-resources自动关闭流,避免资源泄漏
                    try (BufferedReader reader = new BufferedReader(
                            new InputStreamReader(zip.getInputStream(entry), "UTF-8"))) {
                        String line;
                        // 逐行读取直到文件末尾
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                    }
                }
            }
        }
        zip.close();
    }
}

方案2:用Files.lines简化代码(Java 8+)

如果你的项目基于Java 8或更高版本,可以用NIO的Files.lines方法,代码更简洁,同样支持自动识别换行符:

import org.apache.commons.io.FilenameUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.io.InputStreamReader;
import java.util.stream.Stream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class QuickTest {
    public static void main(String[] args) throws IOException {
        ZipFile zip = new ZipFile("test.txt.zip");
        for (Enumeration<? extends ZipEntry> e = zip.entries(); e.hasMoreElements(); ) {
            ZipEntry entry = e.nextElement();
            System.out.println("正在读取:" + entry.getName());
            if (!entry.isDirectory() && "txt".equalsIgnoreCase(FilenameUtils.getExtension(entry.getName()))) {
                try (InputStreamReader reader = new InputStreamReader(
                        zip.getInputStream(entry), StandardCharsets.UTF_8);
                     Stream<String> lines = reader.lines()) {
                    lines.forEach(System.out::println);
                }
            }
        }
        zip.close();
    }
}

几个重要提醒:

  • 字符编码必须指定:Mac系统默认编码可能不是UTF-8,明确指定UTF-8能避免中文或特殊字符乱码。
  • 自动关闭资源:用try-with-resources语法包裹流,不用手动调用close(),防止资源泄漏。
  • 换行符兼容:上述两种方案都不需要手动判断换行符类型,Java会自动处理不同系统的换行规则。

内容的提问来源于stack exchange,提问作者user697911

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:57:07