Zoeken…


Syntaxis

  • int read (byte [] b) gooit IOException

Opmerkingen

Merk op dat u meestal InputStream s NIET rechtstreeks gebruikt, maar BufferedStream s of iets dergelijks. Dit komt omdat InputStream elke keer dat de leesmethode wordt aangeroepen van de bron leest. Dit kan aanzienlijk CPU-gebruik veroorzaken in context-switches in en uit de kernel.

InputStream in een string lezen

Soms wilt u byte-invoer in een string lezen. Om dit te doen moet je iets vinden dat converteert tussen byte en de "native Java" UTF-16 Codepunten die als char . Dat gebeurt met een InputStreamReader .

Om het proces een beetje te versnellen, is het "gebruikelijk" om een buffer toe te wijzen, zodat we niet teveel overhead hebben bij het lezen van Input.

Java SE 7
public String inputStreamToString(InputStream inputStream) throws Exception {
     StringWriter writer = new StringWriter();

     char[] buffer = new char[1024];
     try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {
           int n;
           while ((n = reader.read(buffer)) != -1) {
                // all this code does is redirect the output of `reader` to `writer` in
                // 1024 byte chunks
                writer.write(buffer, 0, n);
           }
     }
     return writer.toString();
}

Het transformeren van dit voorbeeld naar code die compatibel is met Java SE 6 (en lager) wordt weggelaten als oefening voor de lezer.

Bytes schrijven naar een OutputStream

Bytes tegelijkertijd naar een OutputStream schrijven

OutputStream stream = object.getOutputStream();

byte b = 0x00;
stream.write( b );

Een byte-array schrijven

byte[] bytes = new byte[] { 0x00, 0x00 };

stream.write( bytes );

Een sectie van een bytearray schrijven

int offset = 1;
int length = 2;
byte[] bytes = new byte[] { 0xFF, 0x00, 0x00, 0xFF };

stream.write( bytes, offset, length );

Streams sluiten

De meeste streams moeten worden afgesloten als je klaar bent, anders kun je een geheugenlek introduceren of een bestand open laten. Het is belangrijk dat streams worden gesloten, zelfs als een uitzondering wordt gegenereerd.

Java SE 7
try(FileWriter fw = new FileWriter("outfilename");
    BufferedWriter bw = new BufferedWriter(fw);
    PrintWriter out = new PrintWriter(bw))
{
    out.println("the text");
    //more code
    out.println("more text");
    //more code
} catch (IOException e) {
    //handle this however you 
}

Onthoud: try-with-resources garanties, dat de resources zijn gesloten wanneer het blok wordt verlaten, of dat nu gebeurt met de gebruikelijke besturingsstroom of vanwege een uitzondering.

Java SE 6

Soms is try-with-resources geen optie, of ondersteunt u misschien een oudere versie van Java 6 of eerder. In dit geval is de juiste afhandeling om een finally gebruiken:

FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
    fw = new FileWriter("myfile.txt");
    bw = new BufferedWriter(fw);
    out = new PrintWriter(bw);
    out.println("the text");
    out.close();
} catch (IOException e) {
    //handle this however you want
}
finally {
    try {
        if(out != null)
            out.close();
    } catch (IOException e) {
        //typically not much you can do here...
    }
}

Merk op dat het sluiten van een wrapper-stream ook de onderliggende stream zal sluiten. Dit betekent dat u een stream niet kunt verpakken, de verpakking sluit en vervolgens de originele stream blijft gebruiken.

Invoerstroom naar uitvoerstroom kopiëren

Deze functie kopieert gegevens tussen twee streams -

void copy(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[8192];
    while ((bytesRead = in.read(buffer)) > 0) {
        out.write(buffer, 0, bytesRead);
    }
}

Voorbeeld -

 // reading from System.in and writing to System.out
copy(System.in, System.out);

Invoer- / uitvoerstromen verpakken

OutputStream en InputStream hebben veel verschillende klassen, elk met een unieke functionaliteit. Door een stream om een andere te wikkelen, krijg je de functionaliteit van beide streams.

Je kunt een stream een willekeurig aantal keren inpakken, let gewoon op de bestelling.

Handige combinaties

Tekens naar een bestand schrijven terwijl u een buffer gebruikt

File myFile = new File("targetFile.txt");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));

Gegevens comprimeren en coderen voordat naar een bestand wordt geschreven terwijl een buffer wordt gebruikt

Cipher cipher = ... // Initialize cipher
File myFile = new File("targetFile.enc");
BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));

Lijst van Input / Output Stream-wrappers

Wikkel Beschrijving
BufferedOutputStream / BufferedInputStream Terwijl OutputStream gegevens één byte per keer schrijft, schrijft BufferedOutputStream gegevens in brokken. Dit vermindert het aantal systeemoproepen, waardoor de prestaties worden verbeterd.
DeflaterOutputStream / DeflaterInputStream Voert datacompressie uit.
InflaterOutputStream / InflaterInputStream Voert data-decompressie uit.
CipherOutputStream / CipherInputStream Codeert / decodeert gegevens.
DigestOutputStream / DigestInputStream Genereert Message Digest om gegevensintegriteit te verifiëren.
CheckedOutputStream / CheckedInputStream Genereert een CheckSum. CheckSum is een meer triviale versie van Message Digest.
DataOutputStream / DataInputStream Hiermee kunnen primitieve gegevenstypen en tekenreeksen worden geschreven. Bedoeld voor het schrijven van bytes. Platform onafhankelijk.
PrintStream Hiermee kunnen primitieve gegevenstypen en tekenreeksen worden geschreven. Bedoeld voor het schrijven van bytes. Platform afhankelijk.
OutputStreamWriter Converteert een OutputStream naar een Writer. Een OutputStream behandelt bytes, terwijl Writers tekens verwerken
PrintWriter Roept automatisch OutputStreamWriter op. Hiermee kunnen primitieve gegevenstypen en tekenreeksen worden geschreven. Strikt voor het schrijven van karakters en het beste voor het schrijven van karakters

DataInputStream Voorbeeld

package com.streams;  
import java.io.*;    
public class DataStreamDemo {  
  public static void main(String[] args) throws IOException {  
    InputStream input = new FileInputStream("D:\\datastreamdemo.txt");  
    DataInputStream inst = new DataInputStream(input);  
    int count = input.available();  
    byte[] arr = new byte[count];  
    inst.read(arr);  
    for (byte byt : arr) {  
      char ki = (char) byt;  
      System.out.print(ki+"-");  
    }  
  }  
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow