2017-02-27 1 views
0

ich beim Lesen eine Datei arbeite und dieselbe Datei schreiben, aber das Problem ist die heruntergeladene Datei ist 2kb größer als Eingabeoriginaldatei.Ausgabedatei wird immer groß als Eingang (Original) Datei

Einige Stück Code

@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

Sie sie nicht zuerst in einer Array-Liste setzen. Schreiben Sie die Bytes in das FileOutputSteam direkt in derselben Schleife. – greenapps

Antwort

0
  1. keine ObjectOutputStream Verwenden Sie benötigt. Verwenden Sie einfach die oder eine BufferedOutputStream umwickelt.

  2. Der richtige Weg Ströme in Java zu kopieren, ist wie folgt:

    Hinweis
    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(); 
    

    , dass Sie ein, die Größe des Eingangspuffers nicht benötigen, und Sie brauchen nicht die gesamte Eingabe lesen bevor Sie irgendwelche Ausgaben schreiben.

    Ich wünschte, ich hätte $ 1 für jedes Mal, wenn ich dies gepostet habe.

+0

Danke Sir, aber jetzt Datei wird 1kb weniger als die ursprüngliche Datei. –

+0

Sie schließen also nicht aus, oder Sie verwenden diesen Code nicht oder Sie verwenden immer noch Ihren eigenen Kopiercode. – EJP

+0

Herr, wie Multi-Threading für das Aufspalten von Datei zu verwenden. Bitte helfen Sie mir, ich weiß nicht mehr über Multi Threading. Danke !! –

-1

Ich denke, Sie sollten ByteArrayOutputStream keine Object verwenden. Ich glaube, das ist kein Rohcode, sondern die Teile des Codes, in verschiedenen Verfahren platziert, sonst ist es bedeutungslos. Wenn Sie beispielsweise Daten aus einer Datei streamen möchten, verarbeiten Sie diese Daten und schreiben Sie die Daten dann in eine andere Datei.

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

Vergessen Sie nicht try-catch Richtlinien zu verwenden, wo es

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

+0

Ich habe versucht, Herr, aber seine Wurf Fehler in ByteArrayOutputStream kann nicht angewendet werden (java.io.FileOutputStream). Bitte können Sie mir helfen, diese Linie zu ändern, weil ich frischer bin ich verwirrt. Danke –

+0

Warum? Er sollte den "FileOutputStream" verwenden, anstatt Zeit und Speicherplatz für einen ByteArrayOutputStream zu verschwenden. – EJP

+0

'ByteArrayOutputStream byteArrayOutputStream = getByteStreamMethod(); Versuch (Outputoutput = new Fileoutputstream ("thefilename")) { byteArrayOutputStream.writeTo (output); } ' – user3811082

Verwandte Themen