0

ファイルを外部ストレージの一時ディレクトリに保存できるようにする必要があります。保存しているファイルは、アプリのR.rawディレクトリです。

ここではこの例を使用しました。 AndroidのSDカードにRawファイルを移動する

問題は1です。アプリは必要な.m4aファイルを読み取っているようです(ここで間違ったバイトを読み取る可能性があります)。2.ファイルが/tmpdirに保存されるとき、ファイルサイズは完全に間違っています。たとえば、1つのファイルが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

あなたがしているように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 に答える