Java StatFs返回与设置不同的大小
我正在尝试在Android上获得存储空间。这是我找到的解决办法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
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.