2016-07-12 6 views
0
import java.io.*; 
import java.nio.*; 
import java.util.Base64; 
import java.util.UUID; 
import java.io.UnsupportedEncodingException; 

public class Abc { 

public static String readFileAsString(String filePath) throws IOException { 
    DataInputStream dis = new DataInputStream(new FileInputStream(filePath)); 
    try { 
     long len = new java.io.File(filePath).length(); 
     if (len > Integer.MAX_VALUE) throw new IOException("File " + filePath + " too large") 
     byte[] bytes = new byte[(int) len]; 
     dis.readFully(bytes); 
     String ans = new String(bytes, "UTF-8"); 
     return ans; 


    } finally { 
     dis.close(); 
    } 
} 

public static void main(String args[]) throws IOException { 

    String base64encodedString = null; 
    FileOutputStream stream = new FileOutputStream("C:\\Users\\EMP142738\\Desktop\\New folder\\Readhjbdsdsefd.pdf"); 


    String filePath = new String("C:\\Users\\EMP142738\\Desktop\\New folder\\Readers Quick Ref Card.pdf"); 
    try { 

     base64encodedString = java.util.Base64.getUrlEncoder().encodeToString(new Abc().readFileAsString(filePath).getBytes("utf-8")); 



    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 

     byte[] base64decodedBytes = java.util.Base64.getUrlDecoder().decode(base64encodedString); 
     stream.write(base64decodedBytes); 

    } catch(IOException e){ 
    e.printStackTrace();}  
    finally { 
stream.close(); 
}//catch (FileNotFoundException e) { 
    //   e.printStackTrace(); 
     } 
    } 

Ich versuche, eine PDF-Datei mit Base64 zu kodieren und zu dekodieren. Ich konvertiere eine PDF (Binärdatei) in ein ByteArray und gebe das ByteArray als String zurück. Ich codiere dann diese Zeichenfolge in Base64 mit java.util.Base64. Wenn ich versuche, den Prozess zurückzuverfolgen, kann ich eine PDF (Binärdatei) konvertieren, aber die Datei ist beschädigt/beschädigt. Auch die Ausgabedatei nach dem gesamten Prozess (Encode-Decode) ist deutlich größer als die Eingabedatei. Ich hatte erwartet, dass beide gleich groß sein würden. Was mache ich hier falsch?Warum funktioniert Base64 Encoding eines Bytes [] in Java nicht?

Bearbeiten 1 (7/13/16): In der Hauptmethode habe ich den Code nach Jims Vorschlag geändert. Ich versuchte mit Base64.encode (byte [] src) nach dem Lesen der Dokumentation der gleichen. Jedoch gibt es weiterhin den Fehler "Kann das Symbol Base64.encode (byte []) nicht finden". Aber ich habe die encodetoString-Methode aus der gleichen Klasse (java.util.Base64.Encoder) verwendet. Ich kann das Problem hier nicht verstehen. Hier ist die modifizierte Hauptmethode, die nach dem Zurückgeben eines byte [] von der readFileAsString-Methode verwendet wird.

public void main(String args[]) throws IOException { 

    String filePath = new String("C:\\Users\\EMP142738\\Desktop\\New folder\\Readers Quick Ref Card.pdf"); 
    byte[] src = new Abc().readFileAsString(filePath); 
    byte[] destination = Base64.encode(src); 

    } 
+0

Ich nehme an, die Klasse 'Zul', die Sie in' main() 'verwenden, wurde aus irgendeinem Grund in' Abc' umbenannt, als Sie diese Frage geschrieben haben. Da 'encodeToString()' '' byte [] 'als Parameter verwendet, kann man einfach' byte [] 'aus' readFileAsString() 'zurückgeben (und den Namen entsprechend dieser Änderung ändern), anstatt unnötigerweise einen neuen' String zu erzeugen 'Objekt nur um es zu verwerfen. Ich bin mir nicht 100% sicher, aber ich denke, dass das Erstellen des 'String' als UTF-8 das Problem verursachen könnte. Nur eine Schätzung, nicht getestet und ich habe keine Quellen. Da 'readFileAsString()' statisch ist, können Sie 'Abc.readFileAsString()' auch tun – jonhopkins

Antwort

2

Das Problem ist in Ihrem Flow

byte[] -> String -> base64 string 

Sie müssen die Umstellung auf String und gehen direkt verzichten:

byte[] -> base64 string 

zu String Konvertierung wird korrupt ein Binärstroms wie es geht eine Dekodieroperation aus dem Eingabezeichensatz auf 16-Bit-Unicode-Zeichen.