2017-03-13 4 views
0

ビデオファイルをRPiホットスポットから私の電話機のディレクトリにWiFi経由で転送しようとしています。ストレージにフォルダを作成し、RPiサーバーに接続してデータを受信できました。ただし、書き込まれた後に表示されるファイルが正しくありません。実際に、私がそれを開こうとすると、私の電話で別の無関係なアプリが開かれるだけです。非常に奇妙な!ここAndroid FileOutputStreamが失敗すると思われる

は、問題のコードである:

try { 
      BufferedInputStream myBis = new BufferedInputStream(mySocket.getInputStream()); 
      DataInputStream myDis = new DataInputStream(myBis); 

      byte[] videoBuffer = new byte[4096*2]; 
      int i = 0; 

      while (mySocket.getInputStream().read(videoBuffer) != -1) { 
       Log.d(debugStr, "while loop"); 
       videoBuffer[videoBuffer.length-1-i] = myDis.readByte(); 
       Log.d(debugStr, Arrays.toString(videoBuffer)); 
       i++; 
      } 

      Log.d(debugStr, "done with while loop"); 
      // create a File object for the parent directory 

      File testDirectory = new File(Environment.getExternalStorageDirectory()+File.separator, "recordFolder"); 
      Log.d(debugStr, "path made?"); 
      if(!testDirectory.exists()){ 
       testDirectory.mkdirs(); 
      } 
      Log.d(debugStr, "directory made"); 
      // create a File object for the output file 
      File outputFile = new File(testDirectory.getPath(), "recording1"); 

      Log.d(debugStr, "outputfile made"); 
      // now attach the OutputStream to the file object, i 

      FileOutputStream fileOutputStream = new FileOutputStream(outputFile); 
      Log.d(debugStr, "write to file object made"); 


      fileOutputStream.write(videoBuffer); 
      Log.d(debugStr, "video written"); 
      fileOutputStream.close(); 

      Log.d(debugStr, "done"); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

ビデオ.h264フォーマットで最初であり、バイト配列として送信されています。ファイルのサイズは10MBです。私のwhileループでは、配列の値を文字列として出力し、多くのデータを出力します。すべてのデータが送信されていると思うほどのデータ。そのフォルダに移動するとき、私が与えた名前のファイル "recording1"がありますが、それはわずか8KBです。

何が起こっているかについてのアイデアはありますか?どんな助けでも大歓迎です!

答えて

1

アンドロイドFileOutputStreamなし、それはないん

を失敗しているようです。あなたのコードは失敗するようです。これは、コードが意味をなさないためです。あなたは大量のデータを投げ捨てています。多かれ少なかれ、8192バイトごとに1つしか蓄積されません。バッファリングされた読み込みとバッファされていない読み込みの両方を使用しています。入力を8192バイトに制限しています。あなたは決して入力を閉じることはありません。入力が8192 * 8193より大きい場合、ArrayIndexOutOfBoundsExceptionを得ることができます。

捨ててそれをすべてと、この使用:あなたは物事が行われる必要がありますどのように表示したい場合は、あなたも試し-と、リソースを使用して、優れたリソースの取り扱いを示すべきである、または少なくともしようと、最終的には

try { 
     File testDirectory = new File(Environment.getExternalStorageDirectory()+File.separator, "recordFolder"); 
     if(!testDirectory.exists()){ 
      testDirectory.mkdirs(); 
     } 
     File outputFile = new File(testDirectory, "recording1"); 
     try (OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile)); 
      BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream())) { 
      byte[] buffer = new byte[8192]; // or more, whatever you like > 0 
      int count; 
      // Canonical Java copy loop 
      while ((count = in.read(buffer)) > 0) 
      { 
       out.write(buffer, 0, count); 
      } 
     } 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
+0

を。 – Andreas

+0

なぜ 'InputStream'をバッファしますが、' OutputStream'をバッファしませんか?ソケットの 'InputStream'がバッファリングされているかどうかにかかわらず、バッファサイズよりも少ないデータを返すことがあるならば、それは別の方法です。 – Andreas

+0

@アンドレアスあなた自身の答えを投稿することを禁じてはいけません。実際の問題に対処するべきであり、そのような副題ではありません。 – EJP

関連する問題