Java 在android sdk中获取文件大小?

Java 在android sdk中获取文件大小?,java,android,file,Java,Android,File,我在获取文件大小时遇到问题。我有以下代码: File file = new File("/sdcard/lala.txt"); long length = file.length(); 长度始终为零,是的,为零 我使用的是Android SDK(不确定是什么版本),代码在活动中运行,我已经创建了SD卡 也许这是一个许可问题?是否缺少任何内容?File.length()方法返回以下内容: 由该抽象路径名表示的文件长度(字节),如果该文件不存在,则为0L。某些操作系统可能会为表示系统相关实体(如设

我在获取文件大小时遇到问题。我有以下代码:

File file = new File("/sdcard/lala.txt");
long length = file.length();
长度始终为零,是的,为零

我使用的是Android SDK(不确定是什么版本),代码在活动中运行,我已经创建了SD卡

也许这是一个许可问题?是否缺少任何内容?

File.length()方法返回以下内容:

由该抽象路径名表示的文件长度(字节),如果该文件不存在,则为0L。某些操作系统可能会为表示系统相关实体(如设备或管道)的路径名返回0L

如您所见,可以返回零:

  • 如果文件存在但包含零字节
  • 如果文件不存在,或
  • 如果文件是特定于操作系统的特殊文件
我的钱在第二个案子上;i、 e.您的文件名/路径名错误。尝试调用文件名上的
File.exists()
,查看这会告诉您什么。我想其他两种情况也是可能的


(作为记录,基于Linux的系统上的大多数
/proc/..
文件的表观文件大小也为零。Android是基于Linux的。)

如果您想获得以KbMb为单位的文件夹/文件大小,请使用以下代码。这将有助于找到文件的准确大小

public static String getFolderSizeLabel(File file) {
    long size = getFolderSize(file) / 1024; // Get size and convert bytes into Kb.
    if (size >= 1024) {
        return (size / 1024) + " Mb";
    } else {
        return size + " Kb";
    }
}
此函数将以字节形式返回大小:

public static long getFolderSize(File file) {
    long size = 0;
    if (file.isDirectory()) {
        for (File child : file.listFiles()) {    
            size += getFolderSize(child);
        }
    } else {
        size = file.length();
    }
    return size;
}   
你应使用:

File file = new File(Uri.parse("/sdcard/lala.txt").getPath());
而不是:

File file = new File("/sdcard/lala.txt");

我建议您使用以下代码,而不是硬编码路径(“/sdcard/lala.txt”):

Kotlin扩展解决方案 您应该对该文件做的第一件事是确认它存在:

val File?.exists get() = this?.exists() ?: false
如果需要字符串或Uri中的文件,请尝试添加这些文件以使使用它们更具声明性:

fun Uri.asFile(): File = File(toString())

fun String?.asUri(): Uri? {
    try {
        return Uri.parse(this)
    } catch (e: Exception) {
    }
    return null
}
要读取实际文件大小,请将这些文件添加到某个位置,然后调用
myFile.sizeInMb
或任何您需要的命令

val File.size get() = if (!exists()) 0.0 else length().toDouble()
val File.sizeInKb get() = size / 1024
val File.sizeInMb get() = sizeInKb / 1024
val File.sizeInGb get() = sizeInMb / 1024
val File.sizeInTb get() = sizeInGb / 1024
如果您想轻松地将值显示为字符串,这些是简单的包装。可以自定义显示的默认小数

fun File.sizeStr(): String = size.toString()
fun File.sizeStrInKb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInKb)
fun File.sizeStrInMb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInMb)
fun File.sizeStrInGb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInGb)

fun File.sizeStrWithBytes(): String = sizeStr() + "b"
fun File.sizeStrWithKb(decimals: Int = 0): String = sizeStrInKb(decimals) + "Kb"
fun File.sizeStrWithMb(decimals: Int = 0): String = sizeStrInMb(decimals) + "Mb"
fun File.sizeStrWithGb(decimals: Int = 0): String = sizeStrInGb(decimals) + "Gb"

我看不到问题中的“uri.toString()”如果知道路径正确,新文件(“/sdcard/lala.txt”)就可以了。为什么会有什么不同
“/sdcard/lala.txt”
是一个路径名。。。不是URL。@Stephen C URI!=是的,我知道。这就是我说URL的原因。请试着理解我在评论中所说的话。
fun File.sizeStr(): String = size.toString()
fun File.sizeStrInKb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInKb)
fun File.sizeStrInMb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInMb)
fun File.sizeStrInGb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInGb)

fun File.sizeStrWithBytes(): String = sizeStr() + "b"
fun File.sizeStrWithKb(decimals: Int = 0): String = sizeStrInKb(decimals) + "Kb"
fun File.sizeStrWithMb(decimals: Int = 0): String = sizeStrInMb(decimals) + "Mb"
fun File.sizeStrWithGb(decimals: Int = 0): String = sizeStrInGb(decimals) + "Gb"