【问题标题】:Java Encode file to Base64 string To match with other encoded stringJava 将文件编码为 Base64 字符串以与其他编码字符串匹配
【发布时间】:2016-05-06 07:00:04
【问题描述】:
private static String encodeFileToBase64Binary(String fileName)
        throws IOException {

    File file = new File(fileName);
    byte[] bytes = loadFile(file);
    byte[] encoded = Base64.encodeBase64(bytes);
    String encodedString = new String(encoded,StandardCharsets.US_ASCII);

    return encodedString;
}
private static byte[] loadFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);

    long length = file.length();
    if (length > Integer.MAX_VALUE) {
        // File is too large
    }
    byte[] bytes = new byte[(int)length];

    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length
           && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
        offset += numRead;
    }

    if (offset < bytes.length) {
        throw new IOException("Could not completely read file "+file.getName());
    }

    is.close();
    return bytes;
}

//获取编码字符串

String encoded=encodeFileToBase64Binary("file.fmr");

// 编码后的字符串是:

Rk1SACAyMAAAAAFiAAABQAHgAMUAxQEAAABGNkDZADP/SEC8AD6CSECqAEcGSED+AFJtO0CgAGCKZEC6AGuFZEDgAHz1ZECzAI6HZEENAJluNEBWAJ4ZZEB1AKkTZEECALbuZEA/ALqfSECCALySSECxAMP/ZECIAMURVUAXAN2jGkCnAOD8ZEAoAOWlZEBnAOyhLkCyAP/tZECHAQMSGkD8AQTdZECfASKFGkCHASUaGkA1ASy6ZEDAAS3JZEDPAS7NZEAnATG4ZEDxATzOZEBOAUPLZEBzAVbuGkCAAWF8NEDTAWsxLkDnAXa0LkC/AX2nLkC0AYojIEBMAYvkSEDJAa0fT0CsAbwVIIDqANTsZIDIAPfnZICbAQKHO4D5AR/XZIBlASS7IIEoASbYO4CsAUetLoDvAVXSZIDaAVvDO4EHAWrLZICsAX2fNIDnAYEwNIDQAZKnT4BfAZxtZAAA

//使用其他来源的文件中的编码字符串。

Rk1SACAyMAAAAAFiAAABQAHgAMUAxQEAAABGNkCLACELSEDAADYDZEEYAGFxO0DGAGJ9SEC1AGkCSEA6AHWYVUDJAHp5ZEBEAHwVZECVAJgIZEEaALHrZEB4ALuOZEELAMFqZEEzAM/sNEDRANvwZEBkAN0VZECcAOIAZEEwAOjnLkEvAPXlO0CnAP71ZEB7AQYRNEBdAQ0eZED8ARDhZEDXASXcZECZAS3uGkBoAT4eO0AUAUMxSEA7AUYqZEDxAUnSZECmAVNDO0EIAXDHSEDYAXW7ZEEUAXXKSEEGAYY8IEEhAYrDNEDfAZ81ZEDQAcGqLoEBAC/7O4EGAE7zVYB+AP2QSICEARuLZIBnATUfO4D/ATXaZIDEATjSZIDRATrVZICnATvSNIBTATwnZIARAV1LGoB1AV2oO4CrAV68SIDnAWHGZIB+AWauNICVAX0ySICNAYytO4CJAZorSAAA

当我试图匹配两个编码字符串时,我得到一个不匹配的结果。 请建议将文件编码为 base64 的方法,以匹配从其他来源找到的编码字符串。 我试过StandardCharsets.UTF_8StandardCharsets.US_ASCII

【问题讨论】:

    标签: java string encoding utf-8 base64


    【解决方案1】:

    这是一个不需要任何依赖项的解决方案(Apacha et al.),只需要 JDK 8+:

    import java.util.Base64;
    import java.nio.file.Files;
    
    private static String encodeFileToBase64(File file) {
        try {
            byte[] fileContent = Files.readAllBytes(file.toPath());
            return Base64.getEncoder().encodeToString(fileContent);
        } catch (IOException e) {
            throw new IllegalStateException("could not read file " + file, e);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您已经在使用 apache commons-codec,所以我建议添加 commons-io 来读取文件。这样你就可以删除你的 loadFile() 方法,只需要:

      private static String encodeFileToBase64Binary(String fileName) throws IOException {
          File file = new File(fileName);
          byte[] encoded = Base64.encodeBase64(FileUtils.readFileToByteArray(file));
          return new String(encoded, StandardCharsets.US_ASCII);
      }
      

      【讨论】:

      • 感谢您的回复。但我在编码中得到了相同的结果。
      • 我用几个文件和一个外部 Base64 编码器对此进行了测试。你能提供一个示例文件吗?
      • 面临一个问题,Base64.encodeBase64();为什么无法解决?
      • @LutaayaHuzaifahIdris 你需要 import org.apache.commons.codec.binary.Base64;为了使用 Base64.encodeBase64() 你从commons.apache.org/proper/commons-codec
      【解决方案3】:

      从 Java 8 开始,您可以使用 java.util.Base64 类和相应的内部类:

      • java.util.Base64.Encoder
      • java.util.Base64.Decoder

      参见 JavaDoc:Base64-Doc

      还有一个使用示例:Example from Oracle

      【讨论】:

        【解决方案4】:

        这个例子对我很有效:https://grokonez.com/java/java-advanced/java-8-encode-decode-an-image-base64

        public static String encoder(String filePath) {
                String base64File = "";
                File file = new File(filePath);
                try (FileInputStream imageInFile = new FileInputStream(file)) {
                    // Reading a file from file system
                    byte fileData[] = new byte[(int) file.length()];
                    imageInFile.read(fileData);
                    base64File = Base64.getEncoder().encodeToString(fileData);
                } catch (FileNotFoundException e) {
                    System.out.println("File not found" + e);
                } catch (IOException ioe) {
                    System.out.println("Exception while reading the file " + ioe);
                }
                return base64File;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-10
          • 1970-01-01
          • 1970-01-01
          • 2021-01-23
          相关资源
          最近更新 更多