我需要能够将文件保存到外部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();
}
答案 0 :(得分:1)
你可以在一个完整的缓冲区中读取文件,就像你正在做的那样,但这通常是不好的做法,除非你知道文件很小,并且InputStream会提前知道完整的大小并且能够加载所有数据马上。
如果您不确定最大文件大小,尤其是在移动设备上,请不要尝试在内存中加载完整的内容。
请参阅经典示例的IOUtils代码:
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;
}
另外,请务必明确关闭缓冲区。