0

我已经发布了关于此代码的问题。我发现 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");
    }
}
4

3 回答 3

2

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

String mimeType = Magic.getMagicMatch(file, false).getMimeType();
boolean text = mimeType.startsWith("text");
于 2009-12-20T04:59:34.440 回答
1

我发现 MIME 类型真的可以帮助解决这个问题! 日航

于 2009-12-20T05:26:09.757 回答
0

对于那些阅读本文并对我为解决文件读取问题所做的工作感到好奇的人......我已经实现了一个 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;
}
/*...*/
于 2010-03-18T03:23:35.800 回答