Eine Binärdatei in eine Zeichenfolge lesen

Es muss offensichtlich sein, aber ich kann es nicht herausfinden. Ich verbrachte fast einen ganzen Tag dafür. Ich werde gerne ein Bier an jemanden kaufen, der mich aufhellen kann.

File file = new File(filePath); byte[] bytes = new byte[(int)file.length()]; DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); dataInputStream.readFully(bytes); dataInputStream.close(); return new String(bytes); 

Das ist mein Code. Ich sehe, dass die Byte-Array-Größe nicht OK ist, aber ich kann die richtige Größe nicht herausfinden. Außerdem sind die Inhalte nicht inkorrekt. Es scheint, dass nur die Textzeichen in Ordnung sind.

Es scheint, die Daten aus einer Binärdatei rauszubekommen ist ein echter Schmerz, ich bin wirklich deprimiert.

Noch etwas: Der Inhalt der Datei ist kein Text, sondern kann ein Bild, Video oder PDF sein.

Wenn Sie eine Binärdatei lesen, sollten Sie nicht versuchen, sie so zu behandeln, als wäre sie ein codierter Text. Es ist unangemessen, es in eine solche Zeichenfolge zu konvertieren – Sie sollten es als Byte-Array behalten. Wenn Sie es wirklich als Text benötigen, sollten Sie base64 oder hex verwenden, um die Binärdaten darzustellen – andere Ansätze verlieren wahrscheinlich Daten.

Wenn readFully ohne eine Ausnahme zurückgegeben wird, zeigt es an, dass es so viele Daten liest, wie Sie angefordert haben. readFully sollte die gesamte Datei sein. Sie haben es recht einfach geschafft, die Daten aus einer Binärdatei zu erhalten (obwohl der Aufruf von close() in einem finally-Block enthalten sein sollte) – er konvertiert ihn nur in Text, was eine schlechte Idee ist.

Wie Jon Skeet es dir gesagt hat (und du solltest immer jemanden mit 347k hören!), Wenn es kein Text ist, speichere es nicht in einem String und behalte es als Byte-Array. Probieren Sie auch commons-io und verwenden Sie seine Hilfsklassen.

 File file = new File(filePath); InputStream is = null; byte[] bytes = null; try{ bytes = IOUtils.toByteArray(is); }finally{ IOUtils.closeQuietly(is) }