Ich habe diese Klasse zu kodieren und zu dekodieren eine Datei. Wenn ich die Klasse mit TXT-Dateien ausführen, ist das Ergebnis erfolgreich. Aber wenn ich den Code mit .jpg oder .doc ausführe, kann ich die Datei nicht öffnen oder sie ist nicht gleich dem Original. Ich weiß nicht, warum das passiert. Ich habe diese Klasse http://myjeeva.com/convert-image-to-string-and-string-to-image-in-java.html geändert. Aber ich möchte diese Zeile ändernFehler beim Kodieren von Dateien in Base64 Java
byte imageData[] = new byte[(int) file.length()];
für
byte example[] = new byte[1024];
und lesen Sie die Datei so oft, wie wir brauchen. Vielen Dank.
import java.io.*;
import java.util.*;
public class Encode {
Input = Eingabe Stammdatei - Output = Ausgabe-Datei root - imageDataString = String codiert
String input;
String output;
String imageDataString;
public void setFileInput(String input){
this.input=input;
}
public void setFileOutput(String output){
this.output=output;
}
public String getFileInput(){
return input;
}
public String getFileOutput(){
return output;
}
public String getEncodeString(){
return imageDataString;
}
public String processCode(){
StringBuilder sb= new StringBuilder();
try{
File fileInput= new File(getFileInput());
FileInputStream imageInFile = new FileInputStream(fileInput);
Ich habe in den Beispielen zu sehen, dass die Menschen ein byte [] mit derselben Länge als die Datei zu erstellen. Ich will das nicht, weil ich nicht weiß, welche Länge die Datei haben wird.
byte buff[] = new byte[1024];
int r = 0;
while ((r = imageInFile.read(buff)) > 0) {
String imageData = encodeImage(buff);
sb.append(imageData);
if (imageInFile.available() <= 0) {
break;
}
}
} catch (FileNotFoundException e) {
System.out.println("File not found" + e);
} catch (IOException ioe) {
System.out.println("Exception while reading the file " + ioe);
}
imageDataString = sb.toString();
return imageDataString;
}
public void processDecode(String str) throws IOException{
byte[] imageByteArray = decodeImage(str);
File fileOutput= new File(getFileOutput());
FileOutputStream imageOutFile = new FileOutputStream(fileOutput);
imageOutFile.write(imageByteArray);
imageOutFile.close();
}
public static String encodeImage(byte[] imageByteArray) {
return Base64.getEncoder().withoutPadding().encodeToString(imageByteArray);
}
public static byte[] decodeImage(String imageDataString) {
return Base64.getDecoder().decode( imageDataString);
}
public static void main(String[] args) throws IOException {
Encode a = new Encode();
a.setFileInput("C://Users//xxx//Desktop//original.doc");
a.setFileOutput("C://Users//xxx//Desktop//original-copied.doc");
a.processCode();
a.processDecode(a.getEncodeString());
System.out.println("C O P I E D");
}
}
Ich versuchte
ÄndernString imageData = encodeImage(buff);
für
String imageData = encodeImage(buff,r);
und das Verfahren encodeImage
public static String encodeImage(byte[] imageByteArray, int r) {
byte[] aux = new byte[r];
for (int i = 0; i < aux.length; i++) {
aux[i] = imageByteArray[i];
if (aux[i] <= 0) {
break;
}
}
return Base64.getDecoder().decode( aux);
}
Aber ich habe den Fehler:
Exception in thread "main" java.lang.IllegalArgumentException: Last unit does not have enough valid bits
Danke für Ihre Zeit, um die Antwort zu machen. Ich habe das Base64 besser verstanden. Ich werde meine Klasse mit Ihren Ratschlägen ändern. – JGG
@JGG Schauen Sie sich die Methode 'Base64.Encoder.wrap (OutputStream)' an. Es erstellt einen Ausgabestream, in dem Sie die Bytes in Chunks schreiben können, ohne das Problem zu haben, das ich erwähnte (z. B. können Sie jedes Mal 1024 Bytes schreiben, und nachdem Sie den Stream geschlossen haben, haben Sie die richtigen codierten Daten in seiner Ausgabe). – RealSkeptic