2017-01-14 5 views
0

Ich schreibe ein Dateiübertragungsprotokoll, in dem die Dateien zwischen Server und Client in Paketen von je 512 Bytes gesendet werden. Wenn eine Datei größer als diese Größe ist, wird die Datei in mehrere Pakete aufgeteilt. Ich mache das Teilen ok ich denke, aber ich habe Probleme beim Zusammensetzen der Dateien. Wenn die Datei kleiner als 512 Byte ist (ein Paket), funktioniert der Assembly-Prozess. Wenn die Datei jedoch größer ist, wird nur das letzte Paket in die Datei geschrieben.Mehrere byte [] Arrays zu einer einzigen Datei kombinieren

Hier ist der Code des FileAssembler ist:

public class FileAssambler { 

List<byte[]> bytesList; 
private String name; 
boolean finished=false; 
private FileOutputStream fileOutputStream; 

public FileAssambler(String name){ 
    bytesList = new ArrayList<byte[]>(); 
    this.name = name; 
} 

public void addBytes(byte[] bytes){ 
    if(bytes.length<512) 
     finished=true; 
    bytesList.add(bytes); 
} 

public boolean isFinished(){ 
    return finished; 
} 

public void createFile() throws IOException{ 
    Iterator<byte[]> it = bytesList.iterator(); 
    while(it.hasNext()) 
     writeBytesToFile(it.next()); 
} 

private void writeBytesToFile(byte[] bytes){ 

    try{ 
     fileOutputStream = new FileOutputStream(name); 
     fileOutputStream.write(bytes); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 

}

Ich denke, dass die fileOutputStream.write (Bytes) einfach das vorhandene Bytes mit dem neuen ersetzt, was ist die Alternative zum Schreiben in eine Datei?

Wie kombiniere ich mehrere byte [] Arrays in einer einzigen Datei?

Vielen Dank im Voraus :)

+0

Es ist nicht das 'write'; creating 'FileOutputStream' mit dem 1-arg String (oder File) ctor ** schneidet jede existierende Datei ** ab. Sie sollten _one_ stream in 'createFile' erstellen und dann' _all_ buffers in diesen einen Stream schreiben und dann 'close' oder zumindest' flush' es; In einigen Dateisystemen können Daten nicht gelöscht oder geschlossen werden. –

+0

Sie können sich nicht auf '<512' als EOF-Anzeige verlassen. Ein kurzer Lesevorgang kann jederzeit stattfinden und eine Datei kann ein Vielfaches von 512 Byte sein. Sie benötigen kein überlagertes Paketierungsprotokoll, nur um eine Datei zu übertragen: Die standardmäßige Java-Kopierschleife reicht aus. Und Sie müssen nicht alle Bytes einer Datei zusammenfügen, bevor Sie etwas davon schreiben. Unklar, was du verlangst. – EJP

+0

Siehe meine Antwort [hier] (http://stackoverflow.com/questions/10367698/java-multiple-file-transfer-over-socket) für den richtigen Weg. – EJP

Antwort

0

Sie erstellen ein neues FileOutputStream für jedes Element in Ihrem bytesList. Jeder dieser Ausgabestrom beginnt mit dem Schreiben in die Datei am Anfang der Datei. Sie überschreiben also alle Bytes bis zum letzten Element Ihrer Byte-Liste.

Was Sie tun möchten, ist nur einFileOutputStream erstellen und es für alle write(bytes) Anrufe verwenden. Auf diese Weise wird jeder write an die bereits geöffnete Datei angehängt. So etwas Ähnliches:

public void createFile() throws IOException{ 
    FileOutputStream fos = new FileOutputStream(name); 
    Iterator<byte[]> it = bytesList.iterator(); 
    while (it.hasNext()) 
     fos.write(it.next()); 
} 

auch abhängig von Ihrer Java-Version der Iterator unter Verwendung des für jede Schleife vermeiden:

public void createFile() throws IOException { 
    FileOutputStream fos = new FileOutputStream(name); 
    for (byte[] data: bytesList) 
     for.write(data); 
} 
+0

Danke :) das hat es gelöst! – Dolav

0

Antwort auf „Outputstream einfach ersetzt das bestehende Bytes mit dem neuen, Was ist die Alternative zum Schreiben in eine Datei? "

FileOutputStream(File file, boolean append) 

Dies ist die Syntax für Fileoutputstream, so dass Sie als wahr :)

anhängen setzen können

Antwort zu „Wie kann ich mehrere byte [] Arrays in einer einzigen Datei kombinieren?“

Sie können die addAll-Methode verwenden. Hier ist ein Beispiel:

List<byte[]> listFinal = new ArrayList<byte[]>(); 
    listFinal.addAll(listA); 
    listFinal.addAll(listB); 
Verwandte Themen