tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
428
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Hallo,

    ich lade per Java Dateien runter. Bei normalen .csv Dateien ist das kein Problem, dort habe ich bis jetzt immer den FileWriter benutzt. Nur ist mir jetzt aufgefallen das die .zip Dateien Probleme machen. Die Datei wird zwar erstellt, beim öffnen kommt jedoch dieser Fehler:

    C:\data\RoughData.zip: Unerwartetes Archivende.
    Ich nehm mal an das liegt daran das Zip-Dateien nun mal keine Zeichenketten sind, wie zum Beispiel CSV-Dateien.

    Ich habe folgenden HTTP Header:
    HTTP/1.1 200 OK
    Server: Sun-Java-System-Web-Server/7.0
    Date: Wed, 12 Oct 2011 11:59:55 GMT
    Content-type: application/octet-stream
    Content-Disposition: attachment; filename=RoughData.zip
    Cache-Control: max-age=0
    Transfer-encoding: chunked
    Connection: Keep-Alive
    Jetzt weiß ich das der Inhalt des HTTP Response die Zip-Datei ist, wie behandel ich das nun? Kann ich das ganze in ein String umwandeln und erst beim schreiben in die Datei darauf achten ein besonderen Writer zu nehmen? Wie schreibe ich Zip-Dateien?
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,

    also den Typ der Datei erkennst du (normalerweiße) an der Endung. Demnach musst du bei deinem HTTP Header den 'filenamen=...' rausfiltern und die FileExtension ermitteln.
    Ist die Datei eine Zip-Datei, schreibst du diese über den ZipOutputStream.

    Gruß

    Fabio
    zer0 bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das Ganze hat überhaupt nichts mit dem Dateityp zu tun. Mal abgesehen davon, das man den Typ einer Datei besser am MIME Type erkennt, als an der Endung.

    Der FileWriter ist dafür ungeeignet, verwende einfach einen FileOutputStream.

    Gruß
    zer0 bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    SE Tutorials.de Gastzugang
    FileWriter ist wie alle Writer und Reader Klassen NUR für Strings/darstellbare Zeichen geeignet. Ein ZIP ist jedoch eine Binärdatei ... hier brauchst du eine von InputStream/OutputStream abgeleitete Klasse ... auch für das lesen vom Server ... wenn du hier schon mit einem Reader arbeitest , also darauf vertraust das nur darstellbare Zeichen kommen ist das schon der falsche Ansatz.
    Benutz mal unsere SuFu ... da solltest du einen HTTP-Downloader finden. Alternativ kannst du dich auch mal mit der Apache-Commons-Lib auseinandersetzen *Hilfe dazu sollten dir hier einige geben können*.

    Wenn du von einem HTTP-Server laden willst kannst du auch mit URL.openConnection() arbeiten und mit instanceof auf HttpURLConnection prüfen. Die nimmt dir einiges ab was HTTP angeht.
    zer0 bedankt sich. 

  5. #5
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Zitat Zitat von deepthroat Beitrag anzeigen
    Hi.

    Das Ganze hat überhaupt nichts mit dem Dateityp zu tun. Mal abgesehen davon, das man den Typ einer Datei besser am MIME Type erkennt, als an der Endung.

    Der FileWriter ist dafür ungeeignet, verwende einfach einen FileOutputStream.

    Gruß
    Ich habe jetzt folgende Lösung die sowohl für CSV als auch ZIP Dateien funktioniert:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
        public void saveContent(String fileName, String content) throws HttpCommunicationException {
            if (fileName == null) {
                throw new NullPointerException("fileName is null!");
            }
     
            Writer writer = null;
     
            try {
                File file = new File(getDirectory(), fileName);
                writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-1"));
                writer.write(content);
     
                System.out.println(content.getBytes().length + " Bytes geschrieben in " + file.getAbsolutePath());
            } catch (FileNotFoundException ex) {
                throw new HttpCommunicationException(ex);
            } catch (IOException ex) {
                throw new HttpCommunicationException(ex);
            } finally {
                try {
                    if (writer != null) {
                        writer.close();
                    }
                } catch (IOException ex) {
                    throw new HttpCommunicationException(ex);
                }
            }
        }

    Stellt es ein Problem dar, wenn ich den FileOutputStream auch für Stringbasierte-Formate benutze? Sollte ich zwischen sollen Formaten unterscheiden beim Schreiben?
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Warum hast du den Inhalt denn jetzt als String? Warum verwendest du nicht ein byte Array?

    Warum kodierst du das als iso-8859-1? Vermutlich hast du vorher die Daten von der Webseite gelesen, als iso-8859-1 interpretieren lassen und in einen String (welcher UTF-16 ist) gespeichert. Das ist nicht gerade sinnvoll, oder?!
    Zitat Zitat von zer0 Beitrag anzeigen
    Stellt es ein Problem dar, wenn ich den FileOutputStream auch für Stringbasierte-Formate benutze? Sollte ich zwischen sollen Formaten unterscheiden beim Schreiben?
    Wenn du von einer URL Daten 1:1 in eine Datei schreiben willst, solltest du überhaupt keine Strings verwenden.

    Wenn es sich dabei um text/* handelt, kannst du den Inhalt in einen String konvertieren.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Hallo,

    ich arbeite mit dem Apache HTTP Client. Dort gebe ich einen Response Handler an, der den Response erhält und verarbeitet. Dieser Response Handler ist generisch, ich erbe von ihm setzte den Rückgabetyp entweder zu String, wie bisher oder etwas anderem.

    Denkst du der Rückgabetyp byte[] wäre sinvoller? Ich müsste dann halt auch Textdateien damit schreiben!
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von zer0 Beitrag anzeigen
    ich arbeite mit dem Apache HTTP Client. Dort gebe ich einen Response Handler an, der den Response erhält und verarbeitet. Dieser Response Handler ist generisch, ich erbe von ihm setzte den Rückgabetyp entweder zu String, wie bisher oder etwas anderem.

    Denkst du der Rückgabetyp byte[] wäre sinvoller?
    Allerdings. Wenn du da irgendwas als String interpretierst, mußt du dich auf ein bestimmtes Encoding festlegen. Das führt im ungünstigen Fall zu Fehlern.
    Zitat Zitat von zer0 Beitrag anzeigen
    Ich müsste dann halt auch Textdateien damit schreiben!
    Es ist völlig egal was für Dateien das sind.

    getResponseBody()

    oder

    getResponseBodyAsStream()

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Das wäre in der Tat am sinvollsten, da muss ich deepthroat recht geben.
    Das byte[] kannst du dann über die writer.write(byte[], 0, byte[].length) schreiben.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  10. #10
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Hallo,

    ich arbeite mit dem HTTP Client, dort gibt es die Methoden getResponseBody etc. nicht!

    Muss ich den mit Fehlern rechnen wenn ich den Inhalt als String "zwischenspeicher"? Selbst wenn ich ihn beim Schreiben zuerst in ein Byte-Array umwandle, undzwar mit dem selben Charset wie beim erstellen des Strings?

    Mein Problem ist das ich im Reponse Handler die Daten verarbeite, und manchmal auch untersuche. Denn die Daten sind ja auch HTML Text, wo ich dann nach bestimmten Informationen suche. Das ist in einem Byte-Array nich so einfach möglich :P
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  11. #11
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Dann würde ich es an deiner Stelle so machen, dass du ein byte[] übergeben bekommst und um dieses zu untersuchen in einen String umwandelst. Dann wirst du meiner Ansicht nach keine Probleme bekommen. Aber das du auf Byte-Ebene arbeitest ist hier nunmal von Nöten.
    zer0 bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von zer0 Beitrag anzeigen
    ich arbeite mit dem HTTP Client, dort gibt es die Methoden getResponseBody etc. nicht!
    Code java:
    1
    
    response.getEntity().writeTo(new FileOutputStream(...));
    Zitat Zitat von zer0 Beitrag anzeigen
    Muss ich den mit Fehlern rechnen wenn ich den Inhalt als String "zwischenspeicher"?
    Wenn du ein falsches Encoding wählst und sich einige Zeichen nicht übersetzen lassen oder nicht eindeutig übersetzen lassen, ja.
    Zitat Zitat von zer0 Beitrag anzeigen
    Mein Problem ist das ich im Reponse Handler die Daten verarbeite, und manchmal auch untersuche. Denn die Daten sind ja auch HTML Text
    response.getEntity().getContentType()
    response.getEntity().getContentEncoding()

    Damit kannst du feststellen, ob es sich überhaupt um Text handelt. Und welches Encoding da verwendet wird um dann die Daten in einen (UTF-16) String zu konvertieren.

    Gruß
    zer0 bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Ok, so langsam wirds mir klarer!

    Ich fasse es mal zusammen:

    Ich soll den FileOutputStream() verwenden wo ich kein Charset angebe um meine Daten zu schreiben. Die Daten übergebe ich als byte-Array. Das sollte sowohl bei Binär als auch Stringdaten klappen. Wenn ich die Daten in meinem Response Handler untersuchen will wandle ich sie in einen String um, mit dem Zeichensatz der mir die Seite im Header mitteilt. Ist das korrekt so?

    Sollte im Header/Entity kein Zeichensatz vorhanden sein verwende ich UTF-8 oder einen anderen als Standard?
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

  14. #14
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von zer0 Beitrag anzeigen
    Ich soll den FileOutputStream() verwenden wo ich kein Charset angebe um meine Daten zu schreiben.
    Ja.
    Zitat Zitat von zer0 Beitrag anzeigen
    Die Daten übergebe ich als byte-Array.
    Noch besser wäre ein Stream (falls du die Daten nicht untersuchen mußt), da dann nicht erst die ganze Datei runtergeladen werden muss. Oder du nutzt gleich die bequeme writeTo Methode.
    Zitat Zitat von zer0 Beitrag anzeigen
    Wenn ich die Daten in meinem Response Handler untersuchen will wandle ich sie in einen String um, mit dem Zeichensatz der mir die Seite im Header mitteilt. Ist das korrekt so?
    Ja.
    Zitat Zitat von zer0 Beitrag anzeigen
    Sollte im Header/Entity kein Zeichensatz vorhanden sein verwende ich UTF-8 oder einen anderen als Standard?
    Du könntest versuchen festzustellen um welches Encoding es sich handelt: http://jchardet.sourceforge.net/

    Und ansonsten, halt raten...

    Gruß
    zer0 bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  15. #15
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    So, danke erstmal für die schnelle und gute Hilfe!

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
        // verarebitet den Http Response und setzt den Inhalt
        @Override
        public void processResponse(HttpResponse httpResponse) throws IOException {
            setHttpResponse(httpResponse);
            
            HttpEntity entity = httpResponse.getEntity();
            String charset = EntityUtils.getContentCharSet(entity);
     
            if(charset == null) {
                charset = HTTP.DEFAULT_CONTENT_CHARSET;
            }
     
            setContent(EntityUtils.toByteArray(entity));
            setContentAsString(new String(content, charset));
            EntityUtils.consume(entity);
        }
     
        // Speichert die Datei
        public void saveContent(String fileName, byte[] content) throws HttpCommunicationException {
            OutputStream out = null;
     
            try {
                File file = new File(getConfiguration().getDirectory(), fileName);
                out = new FileOutputStream(file);
                out.write(content);
     
                System.out.println(content.length + " Bytes geschrieben in " + file.getAbsolutePath());
            } catch (FileNotFoundException ex) {
                throw new HttpCommunicationException(ex);
            } catch (IOException ex) {
                throw new HttpCommunicationException(ex);
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException ex) {
                    throw new HttpCommunicationException(ex);
                }
            }
        }

    Ist dies nun die korrekte Lösung?
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

Ähnliche Themen

  1. Problem beim Auslesen von ini-files
    Von fredlllll im Forum .NET Windows Forms
    Antworten: 12
    Letzter Beitrag: 19.02.10, 07:57
  2. Problem beim abspielen von AVI Files
    Von Starfear im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 5
    Letzter Beitrag: 06.04.08, 14:24
  3. MD5sum ändert sich beim Kopieren grosser Files, vorallem über USB
    Von lukelukeluke im Forum Microsoft Windows
    Antworten: 5
    Letzter Beitrag: 01.01.08, 17:58
  4. Antworten: 1
    Letzter Beitrag: 27.12.07, 13:57
  5. [C++]Problem beim laden von *.x-Files
    Von MSAB im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 21.08.06, 16:54