Java – 将图像转换为Base64

我在将gif图像转换为基本64string时遇到问题。

当我转换它时,代码为我增加了10万个AAAAAA,而图像真的很小!

这是我的代码:

import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.util.ArrayList; public class Main { public static void main(String[] args) { try { FileWriter fstream = new FileWriter("./out.txt"); BufferedWriter out = new BufferedWriter(fstream); File folder = new File("./flags/"); File[] listOfFiles = folder.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { Main.readFile(out, listOfFiles[i]); } } out.close(); System.out.println("Done"); } catch (Exception e) {} } public static void readFile(BufferedWriter out, File file) { try { byte[] byteArray = new byte[102400]; FileInputStream fis = new FileInputStream(file); String base64String; int bytesRead = 0; while ((bytesRead = fis.read(byteArray)) != -1) { new String(byteArray, 0, bytesRead); base64String = Base64.encode(byteArray); out.write("public static ImageIcon getFlag" + file.getName() + "()"); out.newLine(); out.write("{"); out.newLine(); ArrayList<String> array = Main.cut(base64String); out.write("return Utils.toImage(\"" + array.get(0) + "\""); for (int i=1; i<array.size()-1; i++) { out.write("<tab>+\"" + array.get(i) + "\""); } out.write("<tab>\"" + array.get(array.size() - 1) + "\");"); out.newLine(); out.write("}"); out.newLine(); out.newLine(); } } catch (Exception e) { e.printStackTrace(); } } public static ArrayList<String> cut(String in) { ArrayList<String> array = new ArrayList<String>(); while (in.length() > 76) { array.add( in.substring(0, 77) ); in = in.substring(77); } return array; } } 

基本上,它写在一个文本文件out.txt里面的基础64代码的一堆java方法。

以下是输出的一小部分:

 return Utils.toImage("R0lGODlhEAALANUAANPTAPZva/n5AfLySPz8iYqY3O01NgoksbGZa+kYGOskJKi05vb2XZ+r4+05O"<tab>+"Pv7eO3tKPv7bZak4dSvebC76tC2iPNISPX1UMkAAMm6U/NWTeYAAF5y1LqlevNaWpSh3e7uQ+1CQt"<tab>+"gAAKOv5Vds1C1IvpGf37a/7OnTYZ6q6NGkamd71/LyPusvLvFiTEFbx9rPb/HuaczATd7eAPAAAH2"<tab>+"N2vE+PMqiYuXQUsKufJqn4jlRxUlhy+CpelFnz/PxbyH5BAAAAAAALAAAAAAQAAsAAAaQwBVnSBIY"<tab>+"jzTaZsk5OSmEKOHxCAQ8nk1zMUo9Ir8Y42Kx2Dyi5qihi1QqkxzZZtCISBS2JNILoFQDdC0WIj4UO"<tab>+"hImDBMoLjcsBi0KISI8C4kFMB0uOAgykgkOGC8LJgUFFx0IqxAKCQkGGDsjpzUDLBkZEBCvCS0YJW"<tab>+"wfBQxjAyAgDpG/OwfOBzPRANMY1dVBADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab> 

谢谢。

编辑:我使用这个问题的base64代码: https : //stackoverflow.com/a/4265472/1295422

  byte[] byteArray = new byte[102400]; base64String = Base64.encode(byteArray); 

该代码将编码102400个字节,无论您在数组中实际使用了多less数据。

 while ((bytesRead = fis.read(byteArray)) != -1) 

你需要使用bytesRead的地方的值。

另外,这可能不会将整个文件一次读入数组中(它只读取I / O缓冲区中的数据),因此您的循环可能无法工作,最终可能会得到数组中的一半图像。

我会在这里使用Apache Commons IOUtils:

  Base64.encode(FileUtils.readFileToByteArray(file)); 

首先,这行代码:

 while ((bytesRead = fis.read(byteArray)) != -1) 

相当于

 while ((bytesRead = fis.read(byteArray, 0, byteArray.length)) != -1) 

所以它是从偏移量0写入byteArray,而不是从之前写入的地方。

你需要这样的东西:

 int offset = 0; int bytesRead = 0; while ((bytesRead = fis.read(byteArray, offset, byteArray.length - offset) != -1) { offset += bytesRead; } 

在读完数据(字节)之后,可以将其转换为Base64。

还有更大的问题 – 你正在使用一个固定大小的数组,所以太大的文件将不能被正确地转换,并且代码也是因为它的诡计。

我会抛弃字节数组,并像这样的东西:

 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); // commons-io IOUtils IOUtils.copy(fis, buffer); byte [] data = buffer.toByteArray(); Base64.encode(data); 

或者像Thilo用FileUtils一样进一步浓缩。

该线

 base64String = Base64.encode(byteArray); 

将完整数组(102400字节)转换为Base64,而不仅仅是读取的字节数。 你需要传递它的字节数。

new String(byteArray, 0, bytesRead); 不会修改数组。 您需要使用System.arrayCopy将数组修剪为实际的数据大小。 否则,你正在处理所有102400字节,其中大部分是零。

Late GraveDig …只是将你的字节数组限制为文件大小。

 FileInputStream fis = new FileInputStream( file ); byte[] byteArray= new byte[(int) file.length()]; 

您可以使用文件Object获取文件的长度来初始化您的数组:

 int length = Long.valueOf(file.length()).intValue(); byte[] byteArray = new byte[length]; 

您可以创build一个大型数组,然后使用System.arrayCopy将其复制到一个新的数组中

  int contentLength = 100000000; byte[] byteArray = new byte[contentLength]; BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream()); while ((bytesRead = inputStream.read()) != -1) { byteArray[count++] = (byte)bytesRead; } byte[] destArray = new byte[count]; System.arraycopy(byteArray, 0, destArray , 0, count); 

destArray将包含你想要的信息

我意识到这是一个老问题,但也许有人会发现我的代码示例有用。 此代码在Base64中对文件进行编码,然后对其进行解码并将其保存在新的位置。

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import org.apache.commons.codec.binary.Base64; public class Base64Example { public static void main(String[] args) { Base64Example tempObject = new Base64Example(); // convert file to regular byte array byte[] codedFile = tempObject.convertFileToByteArray("your_input_file_path"); // encoded file in Base64 byte[] encodedFile = Base64.encodeBase64(codedFile); // print out the byte array System.out.println(Arrays.toString(encodedFile)); // print the encoded String System.out.println(encodedFile); // decode file back to regular byte array byte[] decodedByteArray = Base64.decodeBase64(encodedFile); // save decoded byte array to a file boolean success = tempObject.saveFileFromByteArray("your_output_file_path", decodedByteArray); // print out success System.out.println("success : " + success); } public byte[] convertFileToByteArray(String filePath) { Path path = Paths.get(filePath); byte[] codedFile = null; try { codedFile = Files.readAllBytes(path); } catch (IOException e) { e.printStackTrace(); } return codedFile; } public boolean saveFileFromByteArray(String filePath, byte[] decodedByteArray) { boolean success = false; Path path = Paths.get(filePath); try { Files.write(path, decodedByteArray); success = true; } catch (Exception e) { e.printStackTrace(); } return success; } }