Ho questa classe per codificare e decodificare un file. Quando eseguo la classe con file .txt, il risultato è riuscito. Ma quando eseguo il codice con .jpg o .doc non posso aprire il file o non è uguale a originale. Non so perché questo sta accadendo. Ho modificato questa classe http://myjeeva.com/convert-image-to-string-and-string-to-image-in-java.html. Ma voglio cambiare questa lineaErrore nella codifica dei file in base64 java
byte imageData[] = new byte[(int) file.length()];
per
byte example[] = new byte[1024];
e leggere il file così tante volte come abbiamo bisogno. Grazie.
import java.io.*;
import java.util.*;
public class Encode {
Input = Ingresso root file - uscita = radice del file di output - imageDataString = stringa codificata
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);
ho visto negli esempi che le persone creano un byte [] con la stessa lunghezza rispetto al file. Non voglio questo perché non saprò quale lunghezza avrà il file.
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");
}
}
Ho provato a cambiare
String imageData = encodeImage(buff);
per
String imageData = encodeImage(buff,r);
e il metodo 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);
}
ma ho l'errore:
0.123.Exception in thread "main" java.lang.IllegalArgumentException: Last unit does not have enough valid bits
Grazie per il tuo tempo per dare la risposta. Ho capito meglio la base64. Im andando a modificare la mia classe con i tuoi consigli. – JGG
@JGG Dai un'occhiata al metodo 'Base64.Encoder.wrap (OutputStream)'. Crea un flusso di output dove puoi scrivere i byte in blocchi senza avere il problema che ho menzionato (ad esempio puoi scrivere 1024 byte ogni volta, e dopo aver chiuso il flusso avrai i dati codificati corretti nel suo output). – RealSkeptic