का उपयोग करके अवैध अर्ग्यूमेंट अपवाद, मैं बेस 64.java फ़ाइलों को एन्कोड और डीकोड करने के लिए उपयोग करना चाहता था। Encode.wrap(InputStream)
और decode.wrap(InputStream)
काम किया लेकिन धीरे-धीरे चलाया। तो मैंने निम्नलिखित कोड का इस्तेमाल किया।Java8 Base64 डिकोडर
public static void decodeFile(String inputFileName,
String outputFileName)
throws FileNotFoundException, IOException {
Base64.Decoder decoder = Base64.getDecoder();
InputStream in = new FileInputStream(inputFileName);
OutputStream out = new FileOutputStream(outputFileName);
byte[] inBuff = new byte[BUFF_SIZE]; //final int BUFF_SIZE = 1024;
byte[] outBuff = null;
while (in.read(inBuff) > 0) {
outBuff = decoder.decode(inBuff);
out.write(outBuff);
}
out.flush();
out.close();
in.close();
}
हालांकि, यह हमेशा फेंकता
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Input byte array has wrong 4-byte ending unit
at java.util.Base64$Decoder.decode0(Base64.java:704)
at java.util.Base64$Decoder.decode(Base64.java:526)
at Base64Coder.JavaBase64FileCoder.decodeFile(JavaBase64FileCoder.java:69)
...
बाद मैं final int BUFF_SIZE = 3*1024;
में final int BUFF_SIZE = 1024;
बदल गया है, कोड काम किया। चूंकि "BUFF_SIZE" का उपयोग फ़ाइल को एन्कोड करने के लिए भी किया जाता है, मेरा मानना है कि फ़ाइल एन्कोडेड में कुछ गड़बड़ है (1024% 3 = 1, जिसका अर्थ है कि फाइल के बीच में पैडिंग जोड़े गए हैं)।
इसके अलावा, जैसा कि @ जोन स्कीट और @ टगीर वैलेव ने उल्लेख किया है, मुझे InputStream.read()
से वापसी मूल्य को अनदेखा नहीं करना चाहिए। इसलिए, मैंने नीचे कोड को संशोधित किया है।
(हालांकि, मुझे लगता है कि कोड बहुत तेजी से wrap()
का उपयोग करने से चलती है उल्लेख करना होगा। मैं गति अंतर पर ध्यान क्योंकि मैं कोडित था और गहन Base64.encodeFile()/decodeFile (प्रयुक्त) से काफी पहले jdk8 जारी किया गया था। अब , मेरे buffed jdk8 कोड अपने मूल कोड के रूप में के रूप में तेजी से चलाता है। तो, मैं नहीं जानता कि क्या wrap()
साथ चल रहा है ...)
public static void decodeFile(String inputFileName,
String outputFileName)
throws FileNotFoundException, IOException
{
Base64.Decoder decoder = Base64.getDecoder();
InputStream in = new FileInputStream(inputFileName);
OutputStream out = new FileOutputStream(outputFileName);
byte[] inBuff = new byte[BUFF_SIZE];
byte[] outBuff = null;
int bytesRead = 0;
while (true)
{
bytesRead = in.read(inBuff);
if (bytesRead == BUFF_SIZE)
{
outBuff = decoder.decode(inBuff);
}
else if (bytesRead > 0)
{
byte[] tempBuff = new byte[bytesRead];
System.arraycopy(inBuff, 0, tempBuff, 0, bytesRead);
outBuff = decoder.decode(tempBuff);
}
else
{
out.flush();
out.close();
in.close();
return;
}
out.write(outBuff);
}
}
@Jon स्कीट और @Tagir Valeev को विशेष धन्यवाद।
यह एन्कोडिंग का कारण बन सकता है समस्याएं (बेस 64 के रूप में प्रत्येक 3 बाइट्स को 4 में एन्कोड करता है), लेकिन डिकोडिंग समस्याओं का कारण नहीं बनना चाहिए (प्रत्येक 4 बाइट्स को डीकोड करने में 3 में परिवर्तित किया जाता है)। शायद अब आपकी समस्या सिर्फ अधिक छिपी हुई है (उदाहरण के लिए, यह अपवाद की रिपोर्ट नहीं कर सकती है, लेकिन चुपचाप गलत परिणाम उत्पन्न करती है)। –