2017-02-27 7 views
0

ファイルを読み込んで同じファイルを書き込んでいますが、ダウンロードしたファイルが入力元のファイルより2kb大きいという問題があります。出力ファイルが入力(オリジナル)ファイルより大きなサイズになっています

コード

@Override 
    public void run() { 
     try { 
     BufferedInputStream bis; 
      ArrayList<byte[]> al =new ArrayList<byte[]>(); 

     File file = new File(Environment.getExternalStorageDirectory(), "test.mp3"); 
     byte[] bytes = new byte[2048]; 

     bis = new BufferedInputStream(new FileInputStream(file)); 
     OutputStream os = socket.getOutputStream(); 
      int read ; 

      int fileSize = (int) file.length(); 
      int readlen=1024; 

       while (fileSize>0) { 
        if(fileSize<1024){ 
         readlen=fileSize; 
         System.out.println("Hello........."); 
        } 
        bytes=new byte[readlen]; 
        read = bis.read(bytes, 0, readlen); 
        fileSize-=read; 

        al.add(bytes); 

       } 

      ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory()+"/newfile.mp3")); 

      for(int ii=1;ii<al.size();ii++){ 
        out1.write(al.get(ii)); 
       // out1.flush(); 
      } 
      out1.close(); 
      File file1 = new File(Environment.getExternalStorageDirectory(), "newfile.mp3"); 
+1

まずアレイリストに入れないでください。同じループ内のFileOutputSteamにバイトを直接書き込んでください。 – greenapps

答えて

0
  1. を必要とtry-catchディレクティブを使用することを忘れないでください。 FileOutputStreamまたはBufferedOutputStreamを使用してください。

  2. 次のようにJavaでのストリームをコピーするための正しい方法は次のとおりです。あなたが入力のバッファサイズは必要ありませんし、あなたが入力全体を読む必要はありません

    byte[] buffer = new byte[8192]; // or more, or even less, anything > 0 
    int count; 
    while ((count = in.read(buffer)) > 0) 
    { 
        out.write(buffer, 0, count); 
    } 
    out.close(); 
    

    注意いずれかの出力を書き込む前に

    私はこれを投稿したたびに$ 1を持っていました。

+0

ありがとうございますが、ファイルは元のファイルより1kb少なくなっています。 –

+0

あなたは 'out'をクローズしていないか、このコードを使用していないか、あなた自身のコピーコードのいくつかを使っています。 – EJP

+0

先生、どのように分割file.pleaseのためのマルチスレッドを使用して私はマルチスレッドについての詳細を知ってはいけない。おかげで! –

-1

のいくつかの作品は、私はあなたがByteArrayOutputStreamにないのObjectOutputStreamを使用すべきだと思います。 私はこれが生のコードではないことを信じますが、コードの部分は異なる手続きに置かれます。さもなければ意味がありません。 たとえば、ファイルから一部のデータをストリーミングしてこのデータを処理し、そのデータを別のファイルに書き込む場合に使用します。

BufferedInputStream bis = null; 
    ByteArrayOutputStream al = new ByteArrayOutputStream(); 
    FileOutputStream out1 = null; 
    byte[] bytes; 
    try { 
     File file = new File("testfrom.mp3"); 
     bis = new BufferedInputStream(new FileInputStream(file)); 
     int fileSize = (int) file.length(); 
     int readLen = 1024; 
     bytes = new byte[readLen]; 
     while (fileSize > 0) { 
      if (fileSize < readLen) { 
       readLen = fileSize;    
      }   
      bis.read(bytes, 0, readLen); 
      al.write(bytes, 0, readLen); 
      fileSize -= readLen; 
     } 
     bis.close();    
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 

    //proceed the data from al here 
    //... 
    //finish to proceed 

    try { 
     out1 = new FileOutputStream("testto.mp3"); 
     al.writeTo(out1); 
     out1.close();   
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 

は、それがObjectOutputStreamを使用しないでください

http://codeinventions.blogspot.ru/2014/08/creating-file-from-bytearrayoutputstrea.html

+0

私はお世話になりましたが、throwingエラーのByteArrayOutputStreamを(java.io.FileOutputStream)に適用することはできません。私はもっ​​と混乱しているので、この行を修正する方法を教えてください。ありがとう –

+0

なぜですか? 'ByteArrayOutputStream'に時間とスペースを浪費するのではなく、' FileOutputStream'を使うべきです。 – EJP

+0

'ByteArrayOutputStream byteArrayOutputStream = getByteStreamMethod(); try(OutputStream outputStream =新しいFileOutputStream( "thefilename")){ byteArrayOutputStream.writeTo(outputStream); } ' – user3811082

関連する問題