当前位置: 首页 > 面试题库 >

FileInputStream.available可能会使我愚蠢吗?

吴鸿彩
2023-03-14
问题内容

这个FileInputStream.available()javadoc说:

返回可以从此输入流读取(或跳过)而不会被该输入流的方法的下一次调用阻塞的剩余字节数的估计值。下一个调用可能是同一线程或另一个线程。仅读取或跳过此多个字节不会阻塞,但可能会读取或跳过较少的字节。

在某些情况下,非阻塞读取(或跳过)可能仅在速度较慢时(例如,在速度较慢的网络上读取大文件时)就被阻塞。

我不确定是否在此检查中:

if (new FileInputStream(xmlFile).available() == 0)

我可以依靠空文件始终返回零吗?

-

感谢@SB,他没有完全回答问题,但是第一个提出最佳选择的人:

如果xmlFile是一个java.io.File对象,则可以使用length()方法获取其大小。


问题答案:

可以 依靠new FileInputStream(fileName).available(),如果指定的文件是空回零。

不能 依赖new FileInputStream(fileName).available() == 0该文件为空的确定测试。如果fileName是本地文件系统上的常规文件,则可能会起作用。但是,如果fileName是设备文件,或者如果它是远程文件系统上的文件,则available()可能返回零以报告a
read()必须阻塞一段时间。(或者如果是远程文件系统,则可能不是。)

测试常规文件长度的一种更可靠的方法是使用new File(fileName).length() == 0。但是,对于设备文件或管道,length()无论最终可以读取的字节数如何,调用都可能返回零。请记住,new File(fileName).length()如果文件不存在,该参数也将返回零。

编辑 如果要进行可靠的测试以查看文件是否为空,则必须进行多次调用:

public static isEmptyFile(String fileName) {
    File file = new File(fileName);
    if (!file.exists()) {
        return false;
    } else if (file.length() != 0L) {
        return false;
    } else if (file.isFile()) {
        return true;
    } else if (file.isDirectory()) {
        return false;
    } else {
        // It may be impossible to tell that a device file / named pipe is
        // "empty" without actually reading it.  This is not a failing of
        // Java: it is a logical consequence of the way that certain
        // devices, etc work.
        throw new CannotAnswerException(...);
    }
}

但是,建议您在运行应用程序的所有平台上使用多种“文件”类型对此进行仔细测试。一些文件谓词的行为被记录为特定于平台的;参见javadoc。



 类似资料:
  • 我是C的新手,目前我正在尝试编写一个Brainfuck解释器。到目前为止,我已经尝试过了。 它只在没有循环(“[”和“]”)的情况下工作。当我尝试时: 它给我输出 预期产出:

  • 问题内容: 首先,我将解释如何理解和使用: 是为了批量加载对象的关系,从而减少对数据库的SQL请求。这对 LAZY 关系特别有用。 但是,它在 LAZY 关系上甚至还很有用:如果从数据库中加载实体列表并要求加载懒惰的实体,即使我只是使用测试来加载第一个实体的关系,它也会按批加载实体名单。 请注意是否有人要测试:仅显示是否尚未加载实体:例如,如果您有一个具有经理的用户列表并列出了所有用户,则当您访问

  • 问题内容: 这是一个非常简单的问题,但是我需要另一只眼睛来查看我的代码: 输出为: 这些字符是什么, 您有什么想法 吗? 问题答案: 这就是数组的实现方式。 的是字符数组表示,是它的哈希码。 您可能想看看 如果您想再次看到原始的String,则需要:

  • 问题内容: 这是一个非常简单的问题,但是我需要另一只眼睛来查看我的代码: 输出为: 这些字符是什么, 您有什么想法 吗? 问题答案: 这就是数组的实现方式。 的是字符数组表示,是它的哈希码。 您可能想看看 如果您想再次看到原始的String,则需要:

  • 有人能帮助我为什么过渡没有得到应用吗? HTML 萨斯 我在这里有一个工作代码:https://codepen.io/loganlee/pen/rwnjpdz?editors=1100 我希望.box__faces-front和.box__faces-back的rotateY转换都要转换,并且我将转换放在父元素上,在本例中是.box__faces。 多谢了。

  • 我最近开始使用android Studio3.1.2和SDK19(Android4.4)编写我真正的第一个android项目。