2016-06-18 99 views
-1

我正在访问插入Android的USB闪存驱动器上的大文件。由于文件很大,我需要在文件内部“寻找”而不是加载整个文件。Java随机访问文件输入流

在C语言中,seek只是一行代码,但要在android上完成,似乎需要一些史诗编码。

我在互联网上看到了这个类,它允许你在流中寻找,但它需要传递一个“文件对象”给它的构造函数。

https://github.com/vitalidze/justdlna/blob/master/src/main/java/su/litvak/justdlna/util/RandomAccessFileInputStream.java

眼下的代码,我访问USB驱动器上的文件有:

InputStream in=getContentResolver().openInputStream(uri); 

ParcelFileDescriptor pfd= getContentResolver().openFileDescriptor(uri,"rw"); 

但我如何从一开始一个文件对象ContentResolver,所以我可以把它传递给RandomAccessFileInputStream类(在上面的链接处)

回答

0

进出口访问USB闪存驱动器上的一个大文件插入到安卓

这可能是一个问题。

由于文件很大,我需要在文件内部“查找”而不是加载整个文件。

这可能是一个更大的问题。

在C语言中,追求的是代码

不一定只是一条线。

眼下的代码,我访问USB驱动器上的文件是

我假设你得到这个UriACTION_OPEN_DOCUMENT或一些类似的API捆绑到存储访问架构。如果是这样,如果你认为Uri是一个真正的URI,那么你会有更好的运气。诸如URL之类的URI不一定代表本地资源,并且不一定代表“寻求只是一行代码”的东西。

InputStream优惠mark()reset(),这是你最真实的随机搜索能力。并且,并非每个流都支持那些—例如,您不一定reset()由TCP/IP套接字支持的流。

但我如何得到一个文件对象从ContentResolver的

你不是使用InputStreamUri所代表的整个内容读,写出来的一些不这样做,其他FileOutputStream为您控制的File(例如,在internal storage通过getFilesDir()),然后使用生成的文件。

或者,看看你能不能用mark()reset()度日,还呼吁markSupported(),看看是否是可能的InputStream(它应该是你的情况,但我不能保证这一点)。

或者,建立文件由其他人从USB闪存驱动器复制到可以直接访问的设备板载闪存文件系统的一部分(如external storage)的先决条件。

或者,建立您的应用可以直接访问文件系统的先决条件,该文件位于一个特定位置上removable storage(即getExternalFilesDirs(),其中数组中的第二和随后的条目是可移动媒体上的位置,你可以读写)。

+0

您好,感谢您的帮助,是的,我可以将文件放置在外部USB驱动器的固定位置(根目录)。据我了解,如果我把文件放在usb的固定位置,我将如何找到该文件(ex挂载点等)我将使用哪个api来获取它的位置,并打开文件以查找? – programmer3

+0

@dreadlocks:“是的,我可以将文件放置在外部USB驱动器上的固定位置(根目录)” - 您无法通过文件系统直接访问USB驱动器的根目录。您必须将该文件放置在** Android **告诉您您的应用有权访问的位置。这可能因设备和设备用户而异。通过插入驱动器,在Context中调用'getExternalFilesDirs()',并查看第二个(和后续)位置是什么,您可以找到该设备和用户的位置。这是为应用程序将自己的东西写入该位置而设计的,然后在稍后阅读,而不是针对您的场景。 – CommonsWare