Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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:从URI构造文件?_Java_Android - Fatal编程技术网

Java:从URI构造文件?

Java:从URI构造文件?,java,android,Java,Android,我需要从一个URI中获取一个文件对象,使用Java,但是保持长度为零——尽管我知道文件大小不是零 我需要传递到的文件对象 我不确定这是否是因为我以错误的方式构造它?这是我的密码: File videoFile = new File(videoURI.getPath()); if (videoFile == null) { Log.d(LOG_TAG, "File not found!"); return false; } Log.

我需要从一个URI中获取一个文件对象,使用Java,但是保持长度为零——尽管我知道文件大小不是零

我需要传递到的文件对象

我不确定这是否是因为我以错误的方式构造它?这是我的密码:

    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

确保您的URI指向文件

视频文件不会为空,因为您可能正在创建新文件。所以videoFile并不代表您认为的实际文件,这就是为什么您得到0长度

File videoFile = new File(videoURI.getPath()); // videoFile != null

尝试使用接收URI的。

如果文件存在,但其长度“出乎意料”为零,则很有可能您事先在同一程序(或在同一上下文中运行的另一程序)中创建/编写了此文件,但没有关闭其
输出流。通常的JavaIO习惯用法是在使用后关闭流。另请参见示例。

需要注意的一件重要事情是,从中获取的文件对象

File videoFile = new File(videoURI.getPath());

永远不会为null,就像从构造函数调用返回的任何对象一样。不从构造函数中获取对象的唯一方法是构造函数引发异常。因此,null检查返回值作为检查文件是否存在实际上对您没有任何帮助,如果您确实想知道文件是否存在,您应该使用
videoFile.exists()
。直接获取URI的文件构造函数对您来说可能是一个更好的选择,因为它将执行所有必要的检查,以确保URI可以用作文件,并将正确地从URI提取文件路径。

我也为此奋斗了4个小时。找到了一种与机器无关的解决方案:

File mFile = new File(new Path(mUri.getPath()).toString);

mFile将在win/linux/mac中具有正确的路径,并且可以正常工作。

如果尝试使用FileInputStream打开它,会发生什么情况?唉,我真的需要拿出一个文件对象(传递给另一个构造函数,一个MediaFileSource:)。奇怪的是,Java定义建议您可以单独从URI创建一个文件——但我似乎无法在没有错误的情况下执行File videoFile=new File(videoURI)。即使文件不存在,videoFile也永远不会为null。“new”永远不会返回null。。。曾经如果要查看文件是否存在,应该询问file对象:videoFile.exists()。关于另一个问题,直接调用新文件(viewURI)时会出现什么错误?编译错误还是运行时错误?解决方案不是通用的。在windows videoURI上,getPath()在开始处再加一个斜杠。