我需要从URI中获取一个File对象,使用Java工作,但保持长度为零 - 尽管我知道文件大小不为零。
我需要将File对象传递给another constructor。
我不确定是不是因为我以错误的方式构建它?这是我的代码:
File videoFile = new File(videoURI.getPath());
if (videoFile == null) {
Log.d(LOG_TAG, "File not found!");
return false;
}
Log.d(LOG_TAG, "about to upload, filepath: " + videoFile.getPath());
Log.d(LOG_TAG, "File length: " + String.valueOf(videoFile.length()));
日志输出没有吐出'找不到文件!',并打印一个非空路径,但显示长度为0.
答案 0 :(得分:0)
确保您的URI指向文件。
videoFile不会为null,因为您可能正在创建新文件。因此,videoFile并不代表您认为的实际文件,这就是您获得0长度的原因。
File videoFile = new File(videoURI.getPath()); // videoFile != null
尝试使用带有URI的File constructor。
答案 1 :(得分:0)
如果文件存在,但其长度“意外”为零,那么您在同一程序(或在同一上下文中运行的另一个程序)中预先创建/写入此文件的可能性很大,但是没有关闭其OutputStream
。普通的Java IO习惯用法是在使用后关闭流。另请参阅this Sun tutorial以获取示例。
答案 2 :(得分:0)
需要注意的一件重要事情是你从
获得的文件对象File videoFile = new File(videoURI.getPath());
永远不会为null,就像从构造函数调用中获取的任何对象一样。如果构造函数抛出异常,那么从构造函数中获取对象的唯一方法就是这样。所以null检查返回值作为检查以查看文件是否存在实际上对你没有任何作用,如果你真的想知道文件是否退出,你应该使用videoFile.exists()
代替。直接获取URI的File构造函数可能是一个更好的选择,因为它将执行所有必要的检查以确保uri可以用作文件并正确地从uri中提取文件路径。
答案 3 :(得分:0)
我也曾经打了4个小时。找到了与机器无关的解决方案:
File mFile = new File(new Path(mUri.getPath()).toString);
mFile在win / linux / mac中有正确的路径,可以正常工作。