【问题标题】:How to read zero-length file from /sys/fs/cgroup/ in Java? [duplicate]如何在 Java 中从 /sys/fs/cgroup/ 读取零长度文件? [复制]
【发布时间】:2018-03-26 10:02:18
【问题描述】:

我想从 Java 中读取 /sys/fs/cgroup/ 文件(例如 cpuacct.usage)的内容。我已经实现了基于this 答案的阅读算法。 问题是 cgroup 文件的长度默认为 0。链接答案中列出的每个算法都会在开始读取文件之前确定文件的大小,并且由于 file.length() 返回 0,它将尝试从文件中读取 0 个字节。

这里是读取算法:

private String readFile(File file) {
    DataInputStream stream = null;
    String content = "";

    try {
        stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
        final byte[] data = new byte[(int) file.length()]; // new byte[1024] throws exception

        stream.readFully(data);
        content = new String(data);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return content;
}

【问题讨论】:

    标签: java datainputstream cgroups


    【解决方案1】:

    即使操作系统将文件长度报告为0,以下方法(使用Java NIO)仍然有效:

    String file = "/sys/fs/cgroup/cpu,cpuacct/cpuacct.usage";
    String content = new String(Files.readAllBytes(Paths.get(file)));
    
    System.out.println(content); // 972897369764987
    

    【讨论】:

      【解决方案2】:

      我推荐Apache Commons IO 库中的IOUtils 类。

      由于这些文件的内容是文本,您可以使用IOUtils.toString 方法。

      String content = IOUtils.toString(new FileInputStream(file), "UTF-8");
      

      【讨论】:

        猜你喜欢
        • 2018-06-04
        • 2019-07-28
        • 1970-01-01
        • 2013-11-11
        • 1970-01-01
        • 2020-02-03
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多