Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StatFs返回与设置不同的大小_Java_Android_Filesystems - Fatal编程技术网

Java StatFs返回与设置不同的大小

Java StatFs返回与设置不同的大小,java,android,filesystems,Java,Android,Filesystems,我正在尝试在Android上获得存储空间。这是我找到的解决办法 StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath()) stat.getTotalBytes() 当设置应用程序显示1 GB时,它返回774 MB。在AVD管理器中,磁盘大小为1 GB。是否可以像设置应用程序一样获得相同的值?以下是检查外部sd卡是否可用、内部存储和外部sd卡中的总空间和可用空间的方法 public

我正在尝试在Android上获得存储空间。这是我找到的解决办法

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath())
stat.getTotalBytes()

当设置应用程序显示
1 GB时,它返回
774 MB
。在AVD管理器中,磁盘大小为
1 GB
。是否可以像设置应用程序一样获得相同的值?

以下是检查外部sd卡是否可用、内部存储和外部sd卡中的总空间和可用空间的方法

public boolean isExternalSDCardAvailable() {
    String secStore = System.getenv("SECONDARY_STORAGE");
    if (secStore != null) {
        File f_secs = new File(secStore);
        return f_secs.exists();
    } else return false;
}

public long getAvailableInternalMemorySize() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
        long bytesAvailable = stat.getBlockSizeLong() * stat.getFreeBlocksLong();
        return bytesAvailable / (1024 * 1024);
    } else {
        StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
        long bytesAvailable = (long) stat.getBlockSize() * (long) stat.getFreeBlocks();
        return bytesAvailable / (1024 * 1024);
    }
}

public long getTotalInternalMemorySize() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
        long bytesAvailable = stat.getBlockSizeLong() * stat.getBlockCountLong();
        return bytesAvailable / (1024 * 1024);
    } else {
        StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
        long bytesAvailable = (long) stat.getBlockSize() * (long) stat.getAvailableBlocks();
        return bytesAvailable / (1024 * 1024);
    }
}

public long getAvailableExternalMemorySize() {
    String secStore = System.getenv("SECONDARY_STORAGE");
    File f_secs = new File(secStore);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        StatFs stat = new StatFs(f_secs.getPath());
        long bytesAvailable = stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
        return bytesAvailable / (1024 * 1024);
    } else {
        StatFs stat = new StatFs(f_secs.getPath());
        long bytesAvailable = stat.getBlockSize() * stat.getAvailableBlocks();
        return bytesAvailable / (1024 * 1024);
    }

}

public Long getTotalExternalMemorySize() {
    String secStore = System.getenv("SECONDARY_STORAGE");
    File f_secs = new File(secStore);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        StatFs stat = new StatFs(f_secs.getPath());
        long bytesAvailable = stat.getBlockSizeLong() * stat.getBlockCountLong();
        long megAvailable = bytesAvailable / (1024 * 1024);
        return megAvailable;
    } else {
        StatFs stat = new StatFs(f_secs.getPath());
        long bytesAvailable = stat.getBlockSize() * stat.getBlockCount();
        long megAvailable = bytesAvailable / (1024 * 1024);
        return megAvailable;
    }

}
试试看


我的箱子里有确切的可用存储空间。

请在回答之前阅读问题(复制粘贴)。我知道
StatFs
。我在问为什么它与设置应用程序中显示的值不同。
getTotalBytes()
getBlockCountLong()*getBlockCountLong()
,如果您阅读源代码。另外,我正在Android 8 Emulator上运行代码。您应该首先尝试在其上运行代码。@Joshua您的意思是getBlockSizeLong()*getBlockCountLong()是如何在源代码中实现getTotalBytes()的?@itisravi那么,这似乎就是问题所在。如果您想要总大小,您需要按照
man 2 statfs
中的定义确定f_块*f_bsize。好的,我在linux机器上得到了与
buf.f_块*buf.f_bsize
buf.f_块*buf.f_frsize
相同的结果,所以不确定这里发生了什么。ExternalStorageDirectory是什么文件系统类型?
StatFs stat1 = new StatFs("YOUR PATH HERE");
    long bytesAvailable1 = (long) stat1.getAvailableBlocks() * (long) stat1.getBlockSize();
    double spaceAvailableInSD1 = Double.parseDouble(new DecimalFormat("##.##").format(bytesAvailable1 / 1073741824d));  //return MB.