0

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

我在这里使用了这个例子。 在 Android 中将原始文件移动到 SD 卡

问题是 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();
}
4

1 回答 1

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;
}

此外,请确保明确关闭缓冲区。

于 2012-12-03T05:18:13.880 回答