java - 我可以使用 FileReader 读取包含图像和视频(例如 epub 文件)和文本的文件吗?在性能方面是否建议这样做?

标签 java file fileinputstream epub

我需要解析 epub 文件的内容,我想看看什么是最有效的方法。 epub 文件可能包含图像、大量文本,有时还包含视频。我应该选择 FileInputStream 还是 FileReader?

最佳答案

由于 epub 使用 ZIP 存档结构,我建议这样处理它。下面找到一个小片段,其中列出了 epub 文件的内容。

Map<String, String> env = new HashMap<>();
env.put("create", "true");

Path path = Paths.get("foobar.epub");
URI uri = URI.create("jar:" + path.toUri());
FileSystem zipFs = FileSystems.newFileSystem(uri, env);
Path root = zipFs.getPath("/");
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file,
            BasicFileAttributes attrs) throws IOException {
        print(file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult preVisitDirectory(Path dir,
            BasicFileAttributes attrs) throws IOException {
        print(dir);
        return FileVisitResult.CONTINUE;
    }

    private void print(Path file) throws IOException {
        Date lastModifiedTime = new Date(Files.getLastModifiedTime(file).toMillis());
        System.out.printf("%td.%<tm.%<tY %<tH:%<tM:%<tS %9d %s\n", 
                lastModifiedTime, Files.size(file), file);
    }
});

示例输出

01.01.1970 00:59:59         0 /META-INF/
11.02.2015 16:33:44       244 /META-INF/container.xml
11.02.2015 16:33:44      3437 /logo.jpg
...

编辑如果您只想根据文件名提取文件,您可以像 visitFile(...) 方法的代码片段中所示那样进行操作。

public FileVisitResult visitFile(Path file,
    BasicFileAttributes attrs) throws IOException {
    // if the filename inside the epub end with "*logo.jpg"
    if (file.endsWith("logo.jpg")) {
        // extract the file in directory /tmp/
        Files.copy(file, Paths.get("/tmp/",
            file.getFileName().toString()));
    }
    return FileVisitResult.CONTINUE;
}

根据您想要如何处理 epub 中的文件,您还可以查看 ZipInputStream

try (ZipInputStream in = new ZipInputStream(new FileInputStream("foobar.epub"))) {
    for (ZipEntry entry = in.getNextEntry(); entry != null; 
        entry = in.getNextEntry()) {
        System.out.printf("%td.%<tm.%<tY %<tH:%<tM:%<tS %9d %s\n",
                new Date(entry.getTime()), entry.getSize(), entry.getName());
        if (entry.getName().endsWith("logo.jpg")) {
            try (FileOutputStream out = new FileOutputStream(entry.getName())) {
                // process the file
            }
        }
    }
}

示例输出

11.02.2013 16:33:44       244 META-INF/container.xml
11.02.2013 16:33:44      3437 logo.jpg

关于java - 我可以使用 FileReader 读取包含图像和视频(例如 epub 文件)和文本的文件吗?在性能方面是否建议这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226668/

相关文章:

java - 我如何在 libgdx 中将图像旋转到其 x 轴上?

java - 生成类之间转换的代码

java - 写入特定索引处的文件

java - 除非我调用 os.close(),否则不会收到文件

java - 如何比较两个文件是否相同?

android - fileinputstream 抛出 filenotfoundexception?

java - 生成图像的 base64 字符串以在数据 URI 中使用

java - 套接字超时不起作用,InputStream 读取 block

C++ 从文件中获取数据以记住上次 session

bash - 如何在 bash 循环中读取标准输入,然后将文本附加到文件中?