Kopieren von Datei führt zu Beschädigung

sabine01

Mitglied
Hallo zusammen,

folgendes Problem lässt sich von mir einfach nicht beheben:

Ich habe mehrere Dateien, die im Internet verfügbar sind. Den Pfad zu den Dateien speichere ich in einem Vector ab. Über ein Dialog wähle ich den Zielordner, in dem die Dateien gespeichert werden sollen.

Der Speichervorgang etc funktioniert auch einwandfrei. Mein Problem besteht jedoch darin, dass sowohl Exceldateien, PDFs etc durch den Speichervorgang scheinbar beschädigt werden. Lade ich einfache Textdateien herunter, so funktioniert es einwandfrei. Da ich die Dateien zeilenweise auslesen und dann per write in die Datei schreibe, vermute ich an dieser Stelle den Fehler. Ich erzwinge nach jeder Zeile einen Umbruch über \n bzw. \r\n (beide Varianten sind scheinbar fehlerhaft).

Vielleicht hat von euch jemand eine Idee??

Anbei mein Quellcode:
Java:
try {

                        for (int i = 0; i < vecSaveDocs.size(); i++ ) {

                           URL urlFile = new URL(vecSaveDocs.elementAt(i));

                           InputStreamReader inputRead = new InputStreamReader(urlFile.openStream());

                           BufferedReader buffReader = new BufferedReader(inputRead);

                           File tmpFile = new File(vecSaveDocs.elementAt(i));

                           String sFileStored = jFileDirectory.getPath() + "\\" + tmpFile.getName();

                           FileWriter fileWrite = new FileWriter(sFileStored);

                           BufferedWriter bufWriter = new BufferedWriter(fileWrite);

                           String sTmpLine = "";

                           while ((sTmpLine = buffReader.readLine()) != null) {

                              bufWriter.write(sTmpLine + "\n\r"); // NUR \n FUNKTIONIERT AUCH NICHT
                           }

                           bufWriter.close();
                           fileWrite.close();
                           buffReader.close();
                           inputRead.close();

                           deftabDocuments.setValueAt(new Boolean(false), i, 0);
                        }

                        JOptionPane.showMessageDialog(jContentPanel, "Auswahl erfolgreich gespeichert!", "Speichervorgang erfolgreich", JOptionPane.INFORMATION_MESSAGE);

                     }
                     catch (Exception e) {
                        JOptionPane.showMessageDialog(jContentPanel, "Auswahl kann nicht gespeichert werden..\r\n\r\nDatei möglicherweise nicht verfügbar oder keine\r\n Schreibrechte für das gewählte Laufwerk?", "Fehler beim schreiben", JOptionPane.INFORMATION_MESSAGE);

                        e.printStackTrace();
                     }
 
Encodingprobleme vielleicht? Binärdateien würde ich auch byteweise lesen und schreiben, z.B: mit ByteArrayInputStream usw.
 
Wenn du mit Binärformaten rumspielst kannst du doch nicht zeilenbasiert arbeiten? Und erst recht nicht beim rauschreiben noch einen Zeilenumbruch einfügen?

Einzige und richtige Lösung ist wie fastjack schon sagte direkt bytes lesen und schreiben.
 
Irgendwie so in diese Richtung (ungetestet):

Java:
URL u = new URL("name");
    InputStream openStream = u.openStream();
    java.io.OutputStream out = null;
    try {
      out = new FileOutputStream(new java.io.File("out_filename"));
      byte[] bytes = new byte[1024];
      int i = 0;
      while ((i = openStream.read(bytes)) != -1) {
        out.write(bytes, 0, i);
      }
    } finally {
      if ( out != null ) {
        out.close();
      }
      if ( openStream != null ) {
        openStream.close();
      }
    }
 
Hatte ein vergleichbares Problem, als ich von meinem Servelt Files als Bytes zu meiner Python Anwendung gesendet habe.

Gelösst habe ich das nur, indem ich die Daten eindeutig codiert habe.

Ich hab damals base64 genommen, und ja das hat auch Nachteile 🙂

Das deutsche Python-Forum &bull; Thema anzeigen - Konvertierungsfehler

Hier liegts eindeutig am Reader/Writer. "Normale Dateien" sind nunmal nicht einfach Textdateien, also darf man sie auch nicht wie Text verarbeiten, sonst entstehen solche Fehler.
Hab jetzt deinen Python-Thread nur kurz überflogen, aber da hast du ja auch eine Datei als String eingelesen, wenn das keine Textdatei ist, dann dürfte das zu den selben Problemen führen wie hier.
Der richtige Weg ist direkt die Bytes zu verarbeiten mittels Input-/Outputstream
 
Vielen Dank für eure Hilfe. Das binäre Kopieren ist bzw. war der Weg zur Lösung.

@AlexSpritze, danke für das Beispiel. Es hat auf anhieb funktioniert.

Schönen Tag euch!
 

Zurück
Oben