Kopierte Dateien nicht identisch

Status
Nicht offen für weitere Antworten.

Morgyr

Aktives Mitglied
Guten Tag.

Ich möchte ein Programm schreiben, mit dem ich Dateien über Internet verschicken kann.
Weil die Dateien scheinbar nicht 1 zu 1 übertragen werden, habe ich einfach mal zum testen ein Programm geschrieben, mit dem ich eine Datei ohne Internet "verschicken" kann, also kopieren. Doch auch da sind die Dateien nicht identisch. Ich habe das ganze an .xcf und .bmp getestet. GIMP kann die kopiert Datei nicht öffnen und bei der .bmp ist das Bild nahezu identisch, doch ist auf dem kopierten Bild noch sowas, wie wenn man über GIMP mit der Sprühdose, falls das so heißen sollte, über das Bild geht. Das komische daran ist, dass das alles nach System aussieht.

Wie ich kopieren will:
Ich lese aus einer Datei den Inhalt aus, öffne eine neue Datei mit anderem Namen und schreibe dort den Inhalt der vorherigen Datei rein.

Code:
String readFile(){  
		String content = new String();
	    try{
	        File fileToLoad = new File("...und noch einer^^.bmp");
	        char contentChars[] = new char[(int)fileToLoad.length()];
	        Reader reader = new FileReader(fileToLoad);
	        reader.read(contentChars);
	        StringBuffer stringBuffer = new StringBuffer();
	        stringBuffer.append(contentChars);
	        content = stringBuffer.toString();
	        	
	        reader.close();   
	    }
	    catch(IOException io){JOptionPane.showMessageDialog(null, "Fehler beim Laden der Dateien!", "Fehler", JOptionPane.ERROR_MESSAGE);}
	    return content;
	}

Code:
boolean writeFile(String stringToWrite){
	    File fileToWrite = new File("...und noch einer^^test.bmp");
	    try{
	    	fileToWrite.createNewFile();
	    	FileWriter fileWriter = new FileWriter(fileToWrite);
	    	fileWriter.write(stringToWrite);
	    	fileWriter.flush();
	    	fileWriter.close();
	    	return true;
	    }catch(IOException io){
	        return false;
	    }
	}



Meine Überlegung wäre, ob es Zeichen gibt, die String, char oder StringBuffer nicht einlesen kann und somit irgendwas verändert. Ist das möglich und wie könnte ich es vermeiden? Denn am String wird ja kaum was verändert.

Ich hoffe, mir kann jemand helfen.
Mit freundlichen Grüßen
Morgyr
 

Wildcard

Top Contributor
Writer sind nur für Zeichenbasierte Inhalte gedacht. Bei binären Dateien musst du mit Streams arbeiten.
 

Morgyr

Aktives Mitglied
So, danke an euch 4.
Ich bekomme die Dateien verschoben, bzw. auch übers Internet verschickt. Allerdings hänge ich seit 2 Tagen an einem Problem fest. Teilweise existiert das Problem nicht, teilweise schon. Aber ich habe nicht die geringste Ahnung warum das so ist.

Ich verschicke die Bytes über eine while()-Schleife, die stoppt sobald keine Bytes mehr einzulesen sind. Das macht der Absender auch richtig. Ich schicke dem Empfänger immer noch einen integer mit, damit er weiß, ob noch Bytes geschickt werden oder nicht. 1 ist dabei true, und 0 false. Bekommt der Empfänger eine 0 bricht die while()-Schleife, die ich über einen integer regle, der 0 sein muss, um zu weiterzulaufen. Bei einer 0 wird diese Variable also auf 1 gesetzt, bzw. eine beliebige andere Zahl.
Das Problem ist allerdings, es kommt nie eine 0 an.

Hier erstmal die entsprechenden Schleifen.

Absender

Code:
	byte[] buffer = new byte[1024];
	int length = 0;
	int firstLoop = 0;

	while((length = fileIn.read(buffer)) != -1){
	    if(firstLoop == 0){
	    	output.writeInt(1);
	    	output.flush();
	    	firstLoop = 1;
	    }
	   output.writeInt(1);
      output.flush();
	   output.write(buffer, 0, length);    	
	   output.flush();
	} 			
	output.writeInt(0);
	output.flush();

Empfänger

Code:
    		  byte[] buffer = new byte[1024];
    			int endOfString = 0;

    			if(input.readInt() == 1){   
    				while(endOfString == 0){
    					int bytesSended = input.readInt();		

    					if(bytesSended == 1){
    						input.read(buffer);
    						fileOutputStream.write(buffer);	   						
    					}
    					else if(bytesSended == 0){
    						endOfString = 1;    						
    					}   			
    				}				
    			}


Das was also passieren sollte ist, dass der Absender beim ersten Schleifen-Durchlauf eine 1 sendet, wenn die Datei überhaupt bytes hat (Z.7). Dies nimmt der Empfänger in Zeile 4 auf. Hat die Datei keinen Inhalt, wird eine 0 gesendet (Z.17). Damit wird die Schleife nie betreten.
Wie bereits beschrieben wird ein weiterer Integer gesendet, der dem Empfänger mitteilt, ob noch Bytes gesendet werden. Eine 0 wird also nur gesendet, wenn die Schleife beendet ist, somit alle Bytes gesendet sind, und das Programm in Zeile 17 angelangt ist. Darüber wird dann die Schleife beim Empfänger beendet (Z.12).
Aber wieso kommt keine 0 an? Ich habe über System.out.println(bytesSended); getestet, ob irgendwann mal eine 0 ankommt, aber es kommt lediglich durchgängig 1 an, somit werden weitere bytes erwartet, da diese nicht gesendet werden, bleibt das Programm hängen. Die Datei ist letztlich komplett, doch kann ich keine mehreren Dateien verschicken und die Verbindung wird auch nicht geschlossen. Ein Abbruch ist nur über den Task-Manager möglich.

Wahrscheinlich wird das irgendein dummer Fehler sein, auf den ich seit 2 Tagen nicht komme.
Ich hoffe, mir kann jemand helfen.

Mit freundlichen Grüßen
Morgyr
 

Morgyr

Aktives Mitglied
Hat keiner eine Idee?
Oder hatte nur noch keiner die Zeit/Lust sich das anzugucken?

Mit freundlichen Grüßen
Morgyr
 

KSG9|sebastian

Top Contributor
Warum machst du das überhaupt so kompliziert?

Die einfachste Variante wäre wohl folgende:

Client-Seite (Empfänger der Datei):

- Verbindung zum Server aufbauen
- am InputStream byte-für-byte lesen

Server-Seite (Sender der Datei)

- an nem Port hören (ServerSocket)
- sobald ne Verbindung besteht nen neuen Thread mit dem Socket aufmachen und im Thread die zu sendende Datei Byte-für-Byte übertragen

Sieht dann so aus:

Client:
Code:
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws Exception{
		Socket socket = new Socket("localhost", 5511);
		InputStream input = socket.getInputStream();
		File outputFile = new File("C:\\file_received.zip");
		if(outputFile.exists()){
			outputFile.delete();
		}
		FileOutputStream output = new FileOutputStream(outputFile);
		
		byte[] buffer = new byte[1024];
		int len = -1;
		
		while((len = input.read(buffer)) != -1){
			output.write(buffer, 0, len);
		}
		output.flush();
		output.close();
		input.close();
		socket.close();
	}
}

Server
Code:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(5511);
		Socket socket = null;
		while (true) {
			socket = serverSocket.accept();
			ServerRunner runner = new ServerRunner(socket);
			new Thread(runner).start();
		}
	}

	static class ServerRunner implements Runnable {
		private Socket clientSocket;

		public ServerRunner(Socket clientSocket) {
			this.clientSocket = clientSocket;
		}

		public void run() {
			try {
				OutputStream output = clientSocket.getOutputStream();
				// hier den InputStream der zu senden Datei holen
				InputStream input = Server.class
						.getResourceAsStream("testSend.zip");
				byte[] buffer = new byte[1024];
				int len = -1;
				while ((len = input.read(buffer)) != -1) {
					output.write(buffer, 0, len);
				}
				output.flush();
				output.close();
				clientSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Gruß Sebastian
 

Morgyr

Aktives Mitglied
Okay. Dank dir. Habe es jetzt nach einigen, leider unmotivierten, Tagen geschafft, das ganze mit Dateinamen zu verschicken und insgesamt auch mehrere Dateien zu verschicken.

KSG9|sebastian hat gesagt.:
Warum machst du das überhaupt so kompliziert?

Weil ich immer dachte, dass ein read()-Befehl nunmal blockend ist und ich 1. nicht die dokumentation richtig gelesen habe, und somit nicht wusste, dass der Stream bei -1 gestoppt ist, und 2. nicht wusste, dass ich bei output.close() diese -1 mitschicke.

Gibt es eine Lösung, mehrere Dateien zu verschicken, ohne für jede neue Datei ein neue Verbindung zu öffnen? Wenn ich den Stream schließe, kann ich über die selber Verbindung keinen neuen Öffnen. Da ich in aber schließen müsste, damit der Empfänger nicht in der while()-Schleife hängen bleibt, blieb mir erstmal nichts anderes übrig, als pro Datei eine Verbindung einzugehen.

Und noch eine kurze, allgemeine Frage. Ist die Blockierung von accept() und read() von der Zeit her unbegrenzt, oder wird es irgendwann nach x-Sekunden zu einem Abbruch kommen, wenn in dieser Zeit nichts zu lesen ist?


Danke an alle die mir soweit schonmal geholfen haben.

Mit freundlichen Grüßen
Morgyr
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Vergleichstool für xml-Dateien Tortoise-svn Verknüpfung Allgemeine Java-Themen 2
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
N Temporäre Dateien Allgemeine Java-Themen 3
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
V Eclipse .class Dateien Allgemeine Java-Themen 9
B Download von dateien Allgemeine Java-Themen 2
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
C Dateien in Jar aufrufen Allgemeine Java-Themen 14
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
X Dateien für Benutzer Sperren Allgemeine Java-Themen 4
D Dateien aus den Internet herunterladen Allgemeine Java-Themen 6
L Methoden Dateien älter als 30 Tage? Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
RalleYTN Classpath Native Dateien(DLL, SO, JNILIB) Allgemeine Java-Themen 2
J Java .jar Dateien zusammenführen Allgemeine Java-Themen 1
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
F Platzsparende Alternative zu .txt-Dateien Allgemeine Java-Themen 12
X Dateien von der Jar zum Ordner kopieren. Allgemeine Java-Themen 4
Ananaskirsche Input/Output Dateien im Ordner Allgemeine Java-Themen 8
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
X Herunterladen von Dateien aus dem Internet Allgemeine Java-Themen 2
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
H PDFBox akzeptiert Dateien nicht Allgemeine Java-Themen 1
B Java - einlesen von Dateien und herausschneiden von XML Dokumenten Allgemeine Java-Themen 5
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
Maxim6394 Jar Dateien starten nicht Allgemeine Java-Themen 7
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
GUI-Programmer Mp3 Dateien bearbeiten und speichern Allgemeine Java-Themen 3
S Exklusive Sperre auf Dateien: FileChannel, FileLock Allgemeine Java-Themen 0
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
OnDemand Dateien einlesen und vergleichen Allgemeine Java-Themen 1
T Ordner samt Dateien kopieren Allgemeine Java-Themen 11
R Importieren von Txt-Dateien in AbstractTableModel Allgemeine Java-Themen 0
C Dateien komprimieren und verschlüsseln Allgemeine Java-Themen 3
F Eclipse Eclipse kompiliert nicht mehr die aktuellen Dateien Allgemeine Java-Themen 2
R Java Dateien "verschlüsseln" Allgemeine Java-Themen 2
L Passwortgeschützte Dateien Allgemeine Java-Themen 6
A Datentypen Dateien umbenennen mit Dateiendungen - Dateiendungen ausgeben Allgemeine Java-Themen 2
L Reparieren beschädigter PDF Dateien Allgemeine Java-Themen 3
F Dateien ins Array lagern und Optionen zur Auswahl, Allgemeine Java-Themen 5
J XML Dateien vergleichen Allgemeine Java-Themen 9
B Umbenennen von Dateien Allgemeine Java-Themen 2
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
W Best Practice Dateien parsen Allgemeine Java-Themen 3
B Dateien verschwinden aus bin Ordner?! Allgemeine Java-Themen 5
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
M Java Dateien verschieben Allgemeine Java-Themen 2
R Wav-Dateien wiederholt abspielen Allgemeine Java-Themen 2
L Methoden Verarbeitung von Größen Dateien Allgemeine Java-Themen 9
B Alt-Griechisch Zeichen in Dateien Allgemeine Java-Themen 2
M JAR Dateien nur mit Compiler Level 1.6 ausführbar Allgemeine Java-Themen 8
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
M Datentypen Jar-Dateien öffnen nicht mit Java Allgemeine Java-Themen 4
C Mit Java PDF Dateien bearbeiten. Allgemeine Java-Themen 2
B Input/Output .java-Dateien auslesen Allgemeine Java-Themen 17
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
E Vorschläge, effizientes Hashing von Dateien für vergleich Allgemeine Java-Themen 7
W Vergleich eines Datenträgers auf neue Dateien Allgemeine Java-Themen 14
C Java-Dateien in einheitlichen Zeichensatz umwandeln Allgemeine Java-Themen 10
E Dateien aus / im JAR Allgemeine Java-Themen 2
K LibreOffice Tabelle Dateien im Format .ods bearbeiten Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben