【问题标题】:Java: what is the class for the isBinary-method?Java:isBinary 方法的类是什么?
【发布时间】:2010-04-03 16:33:20
【问题描述】:

我习惯 java.io.* 和 java.util.* 但不习惯树:

com.starbase.util
Class FileUtils

java.lang.Object

  |

  +--com.starbase.util.FileUtils

Source.

那么我应该导入哪个类来使用 isBinary 方法?我做“import java.lang.Object;”吗?还是“导入 java.lang.Object.com.starbase.util.FileUtils;”?

【问题讨论】:

    标签: java class binary methods


    【解决方案1】:

    您可以使用import com.starbase.util.FileUtils;import static com.starbase.util.FileUtils.*。层次结构只是显示类 FileUtils 扩展了 Object(所有类也是如此)。

    您还必须拥有 .jar 文件/API 才能访问此类。

    编辑:添加了可能的独立实现:

    如果你想自己实现这个(我注意到你自己的“微不足道”的答案),你可以这样做:

        public static boolean isBinary(String fileName) throws IOException {
            return isBinary(new File(fileName));
        }
    
        public static boolean isBinary(File file) throws IOException {
            InputStream is = new FileInputStream(file);
            try {
                byte[] buf = new byte[4096];
                int bytesRead;
                while ((bytesRead = is.read(buf)) >= 0)
                {
                    for (int i = 0; i < bytesRead; i++) {
                        if (buf[i] == (byte) 0)
                            return true;
                    }
                }
    
                return false;
            } finally {
                is.close();
            }
        }
    

    请注意,我没有对此进行测试。

    我应该补充一点,这是一个简单的实现。有多种文本文件可以被视为二进制文件。如果您允许文本为 Unicode 和/或 UTF-8(或其他文本编码),那么这很快就会变得非常困难。然后,您需要开发一些启发式方法来区分文件类型,这不会 100% 准确。所以,这真的取决于你想用这个做什么。

    【讨论】:

      【解决方案2】:

      您永远不必导入 java.lang.Object,它是隐式导入的,并且是所有其他类的派生类。当你导入另一个类时,你会根据它所在的包来导入它。所以对于你想要使用的类来说:

      import com.starbase.util.FileUtils;
      

      【讨论】:

        【解决方案3】:

        com.starbase.util.FileUtils 不在标准打包的 Java SDK 中,而是在 StarTeam SDK 中,您需要下载它才能使用 FileUtils#isBinary 方法。

        安装后,您只需添加:

        import com.starbase.util.FileUtils;
        

        但是,如果您不想使用第三方 SDK,请告诉我们isBinary 对您有何帮助,我们可以找到标准的 Java 等效项。

        另外澄清一下,import.java.lang.Object.com.starbase.util.FileUtils 不是有效的导入,您将两个不同的包连接在一起。

        必须是import java.lang.Objectimport com.starbase.util.FileUtils

        【讨论】:

        • 看起来完全是微不足道的实现。要知道一个文件是否是二进制文件,目的不是做解析器。
        • 据我所知,没有一种简单的方法可以检查文件是否为二进制文件,我从未使用过 StarTeam SDK,但如果他们有你需要的东西,试试看你会得到什么结果。
        【解决方案4】:

        完全微不足道,也许最简单但非常不可靠!

        if( filename.toLowerCase().trim().endsWith(".bin"))
             return "Binary";
        

        【讨论】:

        • 假设文件名确实与内容匹配,但是还有很多其他类型的文件可以是二进制文件。该 API 中的 isBinary 方法将检查一些内容以区分二进制和文本。
        • 我重新阅读了您引用的 API javadoc,它指出“二进制的定义是文件至少有一个空 (0x0) 字符。”所以它打开并扫描文件,如果它发现一个字节是 0x0 二进制,它认为它是一个二进制文件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 2023-01-22
        相关资源
        最近更新 更多