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