【问题标题】:Java InputReader. Detect if file being read is binary?Java 输入阅读器。检测正在读取的文件是否是二进制文件?
【发布时间】:2009-12-20 04:49:54
【问题描述】:

我发布了一个关于此代码的问题。我发现 JTextArea 不支持加载的二进制类型数据。

所以我的新问题是如何检测“坏”文件并取消文件 I/O 并告诉用户他们需要选择一个新文件?

class Open extends SwingWorker<Void, String>
{
    File file;
    JTextArea jta;

    Open(File file, JTextArea jta)
    {
        this.file = file;
        this.jta = jta;
    }

    @Override
    protected Void doInBackground() throws Exception
    {
        BufferedReader br = null;

        try
        {
            br = new BufferedReader(new FileReader(file));

            String line = br.readLine();

            while(line != null)
            {
                publish(line);
                line = br.readLine();
            }
        }
        finally
        {
            try
            {
                br.close();
            } catch (IOException e) { }
        }
        return null;
    }

    @Override
    protected void process(List<String> chunks)
    {
        for(String s : chunks)
            jta.append(s + "\n");
    }
}

【问题讨论】:

标签: java validation nullpointerexception swingworker jtextarea


【解决方案1】:

您可以通过根据文件扩展名嗅探 MIME 类型,或者更好的是,根据实际文件 内容 嗅探 MIME 类型。您可以在 jMimeMagic (Maven coords here) 的帮助下做到这一点。如果 mime 类型不以“text”开头,那么它肯定不是文本文件。

String mimeType = Magic.getMagicMatch(file, false).getMimeType();
boolean text = mimeType.startsWith("text");

【讨论】:

  • 你能解释更多关于你评论的解决方案吗?如何配置(使用 ide 或终端/cmd)并使用您提到的库?
  • @Marlon:我已经更新了当前主页的链接,为了完整起见,添加了一个指向 Maven 坐标的链接。
【解决方案2】:

我发现 MIME 类型确实可以帮助解决这个问题! JAF

【讨论】:

  • 它不会根据内容检查 mime 类型。它仅根据扩展名检查它。这样一来,您仍然可以将 foo.exe 重命名为 foo.txt 并导致您的应用程序发疯。
  • 你链接的文章甚至提到了!这是一个引用:“检查文件扩展名并不是确定文件类型的一种非常有效的方法。使用 JMimeMagic 库可以提供更强大的解决方案。JMimeMagic 是一个 Java 库(LGLP 许可证),它通过检查来检索文件和流 mime 类型魔术头。”这正是我建议的图书馆。
【解决方案3】:

对于那些阅读本文并对我为解决文件读取问题所做的工作感到好奇的人......我已经实现了一个 FileReader,并且在 Windows 上没有遇到任何问题。然而,我注意到在 Linux 上存在一些容易导致崩溃的问题。我还注意到,在通过 Netbeans 等 IDE 运行时,我在尝试加载二进制文件时收到各种运行时错误,并且速度大幅下降;但是当我将 .jar 作为可执行文件而不是从 IDE 执行时,它可以正常工作。

这是我没有遇到问题的相关代码(即使加载二进制文件类型,如 .mp3、.exe 等)

/*...*/
@Override
protected Void doInBackground() throws Exception {
    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader(file));
        int ch = br.read();

        while(ch != -1) {
            publish(ch);
            ch = br.read();
        }
    }
    finally {
        try {
            br.close();
        } catch (IOException e) {}
    }
    System.gc();
    return null;
}
/*...*/

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 2013-05-21
    • 2017-01-19
    • 2018-01-21
    • 2021-07-26
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多