Java随机访问文件输入流
我正在访问插入Android的USB闪存驱动器上的一个大文件。由于文件很大,我需要在文件中“查找”,而不是加载整个文件 在C语言中,seek只是一行代码,但要在android上实现这一点,似乎需要一些史诗般的编码 我在internet上看到这个类,它允许您在流中搜索,但它需要将“文件对象”传递给它的构造函数 现在,我必须访问usb驱动器上的文件的代码是:Java随机访问文件输入流,java,android,Java,Android,我正在访问插入Android的USB闪存驱动器上的一个大文件。由于文件很大,我需要在文件中“查找”,而不是加载整个文件 在C语言中,seek只是一行代码,但要在android上实现这一点,似乎需要一些史诗般的编码 我在internet上看到这个类,它允许您在流中搜索,但它需要将“文件对象”传递给它的构造函数 现在,我必须访问usb驱动器上的文件的代码是: InputStream in=getContentResolver().openInputStream(uri); 或 但是如何从Cont
InputStream in=getContentResolver().openInputStream(uri);
或
但是如何从ContentResolver获取文件对象,以便将其传递给RandomAccessFileInputStream类(在上面的链接处)
我正在访问插入Android的USB闪存驱动器上的一个大文件
这可能是个问题
由于文件很大,我需要在文件中“查找”,而不是加载整个文件
这可能是一个更大的问题
在C语言中,seek只是一行代码
不一定
现在,我必须访问usb驱动器上的文件的代码是
我假设您是从ACTION\u OPEN\u文档
或绑定到存储访问框架中的类似API获取此Uri
。如果是这样,那么如果您认为Uri
是一个实际的Uri,您的运气会更好。URI(例如URL)不一定表示本地资源,也不一定表示“seek只是一行代码”的内容
InputStream
提供了mark()
和reset()
,这是与真正的随机搜索功能最接近的功能。而且,并不是每个流都支持这些-例如,您不一定要reset()
由TCP/IP套接字支持的流
但是如何从ContentResolver获取文件对象呢
除了使用InputStream
读入Uri
表示的整个内容,将其写入您控制的文件的FileOutputStream
(例如,通过getfiledir()
打开),然后使用生成的文件之外,您不需要这样做
或者,查看您是否可以使用mark()
和reset()
,也可以调用markSupported()
,查看是否可以使用InputStream
(这应该是您的情况,但我不能保证)
或者,建立一个先决条件,让其他人将文件从USB闪存驱动器复制到设备的板载闪存文件系统中您可以直接访问的部分,例如
或者,建立一个先决条件,使文件位于应用程序可以直接访问文件系统的特定位置(即getExternalFilesDirs()
,其中数组中的第二个和后续条目是可移动介质上的位置,您可以从中读写)。您好,感谢您的帮助,是的,我可以将文件放置在外部usb驱动器上的固定位置(根)。据我所知,如果我将文件放在usb中的固定位置,我将如何找到该文件(如挂载点等)我将使用什么api获取其位置,并打开该文件进行查找?@dreadlocks:“是的,我可以将该文件放在外部usb驱动器上的固定位置(根位置)。”--您将无法通过文件系统直接访问USB驱动器的根目录。你必须把文件放在Android告诉你你的应用程序可以访问的地方。这可能因设备和设备用户而异。通过插入驱动器,在上下文中调用getExternalFilesDirs()
,并查看第二个(以及后续)位置,可以找到该设备和用户的位置。这是为应用程序设计的,用于将其自己的内容写入该位置,然后稍后将其读回,而不是用于您的场景。您可以将此代码示例用于USB
ParcelFileDescriptor pfd= getContentResolver().openFileDescriptor(uri,"rw");