Java >> Java tutorial >  >> Tag >> String

Sådan konverteres InputStream til Base64-streng

1. Oversigt

Base64 er et tekstkodningsskema, der giver overførsel af binære data mellem applikationer og platforme. Base64 kan bruges til at gemme binære data i en databasestrengkolonne og derved undgå rodede filoperationer. Når det kombineres med data-URI-skemaet, kan Base64 bruges til at indlejre billeder på websider og e-mails i overensstemmelse med HTML- og MIME-standarderne (Multipurpose Internet Mail Extensions).

I denne korte vejledning vil vi demonstrere Java Streaming IO-funktioner og den indbyggede Java Base64 klasse for at indlæse binære data som en InputStream og konverter den derefter til en streng .

2. Opsætning

Lad os se på afhængighederne og de testdata, vi skal bruge til koden.

2.1. Afhængigheder

Vi bruger Apache IOUtils-biblioteket til nem adgang til at teste datafiler ved at tilføje dets afhængighed til vores pom.xml :

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

2.2. Testdata

En binær testdatafil er nødvendig her. Så vi tilføjer et logo.png billedfil til vores standard src/test/resources mappe.

3. Konvertering af InputStream til Base64-streng

Java har indbygget understøttelse af Base64-kodning og afkodning i java.util.Base64  klasse. Så vi bruger den statiske metoder derfra til at udføre de tunge løft.

Base64.encode() metoden forventer en byte array, og vores billede er i en fil. Derfor skal vi først konvertere filen til en InputStream og læs derefter strømmen, byte-for-byte, ind i en matrix.

Vi bruger IOUtils.toByteArray() metode fra Apache commons-io pakke som et praktisk alternativ til den ellers udførlige Java-only-tilgang.

Først vil vi skrive en simpel metode til at generere en 'fattig mands' kontrolsum:

int calculateChecksum(byte[] bytes) {
    int checksum = 0; 
    for (int index = 0; index < bytes.length; index++) {
        checksum += bytes[index]; 
    }
    return checksum; 
}

Vi vil bruge det til at sammenligne de to arrays og kontrollere, at de matcher.

De næste linjer åbner filen, konverterer den til et byte-array, og Base64 koder den derefter til en streng :

InputStream sourceStream  = getClass().getClassLoader().getResourceAsStream("logo.png");
byte[] sourceBytes = IOUtils.toByteArray(sourceStream);

String encodedString = Base64.getEncoder().encodeToString(sourceBytes); 
assertNotNull(encodedString);

Strengen ligner en blok af tilfældige tegn. Faktisk er det ikke tilfældigt, som vi ser i verifikationstrinnene:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
assertNotNull(decodedBytes);
assertTrue(decodedBytes.length == sourceBytes.length);
assertTrue(calculateChecksum(decodedBytes) == calculateChecksum(sourceBytes));

4. Konklusion

I denne artikel har vi demonstreret kodningen af ​​en InputStream til en Base64-streng og den vellykkede afkodning af denne streng tilbage til et binært array.

Som altid er koden præsenteret i denne artikel tilgængelig på GitHub.


Java tag