从R.raw.some_file.m4a将文件保存到外部临时目录

时间:2012-12-03 04:52:49

标签: android

我需要能够将文件保存到外部storgage临时目录。我保存的文件是我的应用程序的R.raw目录。

我在这里使用过这个例子。 Move Raw file to SD card in Android

问题是 1.应用程序似乎读取了我想要的.m4a文件(可能在这里读取错误的字节)。 2.当文件保存到/ tmp目录时,文件大小完全错误。 例如,一个文件从30kb变为300kb,另一个文件从25kb变为.25kb。

任何建议

public String saveAs(int ressound, String whipName){  

     byte[] buffer=null;  
     InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
     int size=0;  

     try {  
      size = fIn.available();  
      buffer = new byte[size];  
      fIn.read(buffer);  
      fIn.close();  
     } catch (IOException e) {  
      // TODO Auto-generated catch block
         Log.i("saveas", "did not save1");
      //return false;  
     }  

     String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/tmp/.pw2";
     String filename="/"+whipName+".m4a";  
     Log.i("path", "file path is " + path);
     boolean exists = (new File(path)).exists();  
     if (!exists){new File(path).mkdirs();}  

     FileOutputStream save;  
     try {  
      save = new FileOutputStream(path+filename);  
      save.write(buffer);  
      save.flush();  
      save.close();  
     } catch (FileNotFoundException e) {  
      // TODO Auto-generated catch block  
         Log.i("saveas", "did not save2");
         //return false;  
     } catch (IOException e) {  
      // TODO Auto-generated catch block
         Log.i("saveas", "did not save3");
      //return false;  
     }      

     File k = new File(path, filename);  

     return  k.getAbsolutePath();
}

1 个答案:

答案 0 :(得分:1)

你可以在一个完整的缓冲区中读取文件,就像你正在做的那样,但这通常是不好的做法,除非你知道文件很小,并且InputStream会提前知道完整的大小并且能够加载所有数据马上。

如果您不确定最大文件大小,尤其是在移动设备上,请不要尝试在内存中加载完整的内容。

请参阅经典示例的IOUtils代码:

http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.copyLarge%28java.io.InputStream%2Cjava.io.OutputStream%29

public static long copyLarge(InputStream input, OutputStream output)
        throws IOException {
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    long count = 0;
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

另外,请务必明确关闭缓冲区。