Java openrawsource()问题

Java openrawsource()问题,java,android,Java,Android,我在res/raw/文件夹中有一个数据库文件。我正在调用Resources.openRawResource(),文件名为R.raw.FileName,我得到一个输入流,但我在设备中有另一个数据库文件,因此要将该数据库的内容复制到我使用的设备数据库中: BufferedInputStream bi = new BufferedInputStream(is); 和FileOutputStream,但我得到一个异常,即数据库文件已损坏。我怎样才能继续? 我尝试使用file和FileInputStr

我在
res/raw/
文件夹中有一个数据库文件。我正在调用
Resources.openRawResource()
,文件名为
R.raw.FileName
,我得到一个输入流,但我在设备中有另一个数据库文件,因此要将该数据库的内容复制到我使用的设备数据库中:

 BufferedInputStream bi = new BufferedInputStream(is);
和FileOutputStream,但我得到一个异常,即数据库文件已损坏。我怎样才能继续?
我尝试使用
file
FileInputStream
读取文件,路径为
/res/raw/fileName
,但这也不起作用。

是的,您应该能够使用
openrawsource
将二进制文件从原始资源文件夹复制到设备

基于API演示(content/ReadAsset)中的示例代码,您应该能够使用以下代码片段的变体来读取db文件数据

InputStream ins = getResources().openRawResource(R.raw.my_db_file);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
int size = 0;
// Read the entire resource into a local byte buffer.
byte[] buffer = new byte[1024];
while((size=ins.read(buffer,0,1024))>=0){
  outputStream.write(buffer,0,size);
}
ins.close();
buffer=outputStream.toByteArray();
您的文件副本现在应该存在于
缓冲区中
,因此您可以使用
文件输出流
将缓冲区保存到新文件中

FileOutputStream fos = new FileOutputStream("mycopy.db");
fos.write(buffer);
fos.close();

InputStream.available具有严重的限制,不应用于确定可用于流式传输的内容的长度

(): “[…]返回在不阻止更多输入的情况下可以读取或跳过的估计字节数。[…]请注意,此方法提供的保证太弱,在实践中不是很有用。”

您有3种解决方案:

  • 检查内容两次,第一次只是计算内容长度,第二次是实际读取数据
  • 由于Android资源是由开发人员您准备的,因此需要硬编码它的预期长度
  • 将文件放在/asset目录中,并通过AssetManager读取该文件,通过AssetManager可以访问AssetFileDescriptor及其内容长度方法。但是,这可能会为您提供未知的长度值,这并没有多大用处

  • 是否有人遇到了与我使用openFileInput方法相同的问题,但它检查的是设备路径而不是项目路径……嗨,这现在仍然有效吗?@elect自API中删除了保证后,我仍然会在实践中避免使用该方法。好的,关于3),为什么可能会返回未知的