跳转至

Java InputStream教程

原文:http://zetcode.com/java/inputstream/

Java InputStream教程显示了如何使用 Java 中的InputStream类。

Java 流是来自源或目的地的数据流。 Java 流的一个很好的比喻是水从水龙头流入浴缸,然后又流入排水装置。 InputStreamOutputStream是对数据(例如 C 文件指针)的低级访问的抽象。

Java InputStream

InputStream是读取数据的源。 流可以表示各种类型的源,包括磁盘文件,设备,其他程序和内存数组。

流支持许多不同类型的数据,包括简单字节,原始数据类型,本地化字符和对象。

Java InputStream子类

InputStream是一个抽象类; 它是表示字节输入流的所有类的超类,包括AudioInputStreamByteArrayInputStreamFileInputStreamFilterInputStreamObjectInputStreamPipedInputStreamSequenceInputStream

Java InputStream关闭

FileInputStreamclose()方法关闭输入流,并释放与此流关联的所有系统资源。 在我们的示例中,我们使用try-with-resources语句,该语句确保在语句末尾关闭每个资源。

Java InputStream读取

InputStream使用以下读取方法读取字节:

  • read(byte[] b) - 从此输入流中读取最多b.length个字节的数据到一个字节数组中。
  • read(byte[] b, int off, int len) - 从此输入流中读取最多len个字节的数据到一个字节数组中。
  • read() - 从文件输入流中读取一个字节。

Java InputStream读取文本

以下示例显示如何使用InputStream读取文本文件。

thermopylae.txt

The Battle of Thermopylae was fought between an alliance of Greek city-states, 
led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the 
course of three days, during the second Persian invasion of Greece. 

在示例中,我们使用此文本文件。

JavaInputStreamText.java

package com.zetcode;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class JavaInputStreamText {

    public static void main(String[] args) throws IOException {

        String fileName = "src/resources/thermopylae.txt";

        try (InputStream fis = new FileInputStream(fileName);
                InputStreamReader isr = new InputStreamReader(fis,
                        StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(isr)) {

            br.lines().forEach(line -> System.out.println(line));
        }
    }
}

使用FileInputStreamInputStreamReaderBufferedReader读取文本文件。

try (InputStream fis = new FileInputStream(fileName);

FileInputStreamInputStream的一种特殊形式,用于从文件中读取字节。

InputStreamReader isr = new InputStreamReader(fis,
                        StandardCharsets.UTF_8);

InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的字符集将其解码为字符。

BufferedReader br = new BufferedReader(isr)) {

BufferedReader从字符输入流中读取文本,缓冲字符以有效读取字符,数组和行。

br.lines().forEach(line -> System.out.println(line));

从缓冲读取器中按行读取数据。

Java InputStream读取字节

InputStream的读取方法读取字节。

JavaInputStreamBytes.java

package com.zetcode;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class JavaInputStreamBytes {

    public static void main(String[] args) throws IOException {

        String fileName = "src/resources/ball.png";

        try (InputStream is = new FileInputStream(fileName)) {

            byte[] buffer = new byte[is.available()];
            is.read(buffer);

            int i = 0;

            for (byte b: buffer) {

                if (i % 10 == 0) {
                    System.out.println();
                }

                System.out.printf("%02x ", b);

                i++;
            }
        }

        System.out.println();
    }
}

该示例从 PNG 图像读取字节,并将字节以十六进制格式打印到控制台。

try (InputStream is = new FileInputStream(fileName)) {

我们使用FileInputStream从图像文件中读取字节。

byte[] buffer = new byte[is.available()];
is.read(buffer);

使用read()方法,我们将字节读入字节数组。

int i = 0;

for (byte b: buffer) {

    if (i % 10 == 0) {
        System.out.println();
    }

    System.out.printf("%02x ", b);

    i++;
}

我们遍历数组并将字节以十六进制格式打印到控制台。

89 50 4e 47 0d 0a 1a 0a 00 00 
00 0d 49 48 44 52 00 00 00 0a 
00 00 00 0a 08 06 00 00 00 8d 
32 cf bd 00 00 00 04 73 42 49 
54 08 08 08 08 7c 08 64 88 00 
00 00 09 70 48 59 73 00 00 0d 
d7 00 00 0d d7 01 42 28 9b 78 
00 00 00 19 74 45 58 74 53 6f 
...

这是示例的部分示例输出。

从 URL 读取 Java InputStream

InputStream允许从 URL 源读取数据。

JavaInputStreamURL.java

package com.zetcode;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class JavaInputStreamURL {

    public static void main(String[] args) throws IOException {

        String webSite = "http://www.something.com";
        URL url = new URL(webSite);

        try (InputStream is = url.openStream();
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is))) {

            br.lines().forEach(System.out::println);            
        }
    }
}

该示例将InputStream打开到网页并读取其数据。

try (InputStream is = url.openStream();

使用openStream()方法创建 URL 的InputStream

<html><head><title>Something.</title></head>
<body>Something.</body>
</html>

这是输出。

Java InputStream读取反序列化的数据

ObjectInputStream读取先前使用ObjectOutputStream写入的序列化数据。

Country.java

package com.zetcode;

import java.io.Serializable;

public class Country implements Serializable {

    static final long serialVersionUID = 42L;

    private String name;
    private int population;

    public Country(String name, int population) {
        this.name = name;
        this.population = population;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }
}

这是Country bean。 我们将序列化和反序列化国家列表。

JavaObjectOutputStreamEx.java

package com.zetcode;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class JavaObjectOutputStreamEx {

    public static void main(String[] args) throws IOException {

        String fileName = "src/resources/myfile.dat";

        try (OutputStream fis = new FileOutputStream(fileName);
                ObjectOutputStream out = new ObjectOutputStream(fis)) {

            List<Country> countries = new ArrayList<>();
            countries.add(new Country("Slovakia", 5429000));
            countries.add(new Country("Norway", 5271000));
            countries.add(new Country("Croatia", 4225000));
            countries.add(new Country("Russia", 143439000));

            out.writeObject(countries);
        }
    }
}

该示例序列化对象列表。

out.writeObject(countries);

国家列表被写入ObjectOutputStream

JavaInputStreamObjects.java

package com.zetcode;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.List;

public class JavaInputStreamObjects {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        String fileName = "src/resources/myfile.dat";

        try (InputStream fis = new FileInputStream(fileName);
                ObjectInputStream oin = new ObjectInputStream(fis)) {

            List<Country> countries = (List<Country>) oin.readObject();

            countries.forEach(System.out::println);
        }
    }
}

我们使用ObjectInputStream读取序列化的数据。

Java InputStream读取流序列

SequenceInputStream代表一系列输入流。 它允许从多个有序流中读取。

JavaInputStreamSequence.java

package com.zetcode;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;

public class JavaInputStreamSequence {

    public static void main(String[] args) throws IOException {

        String fileName1 = "src/resources/myfile.txt";
        String fileName2 = "src/resources/myfile1.txt";
        String fileName3 = "src/resources/myfile2.txt";

        try (InputStream is1 = new FileInputStream(fileName1);
                InputStream is2 = new FileInputStream(fileName2);
                InputStream is3 = new FileInputStream(fileName3);
                SequenceInputStream sis1 = new SequenceInputStream(is1, is2);
                SequenceInputStream sis = new SequenceInputStream(sis1, is3)) {

            int b = sis.read();

            while (b != -1) {

                System.out.printf("%c", b);
                b = sis.read();
            }

            System.out.println();
        }
    }
}

该示例从三个FileInputStreams中读取。

try (InputStream is1 = new FileInputStream(fileName1);
        InputStream is2 = new FileInputStream(fileName2);
        InputStream is3 = new FileInputStream(fileName3);
        SequenceInputStream sis1 = new SequenceInputStream(is1, is2);
        SequenceInputStream sis = new SequenceInputStream(sis1, is3)) {

我们定义了三个输入流,并将这些流放入SequenceInputStreams中。

int b = sis.read();

while (b != -1) {

    System.out.printf("%c", b);
    b = sis.read();
}

我们使用read()从流中读取数据。

在本教程中,我们介绍了 Java InputStream类。 您可能也对相关教程感兴趣: Java InputStreamReader教程Java FileOutputStream教程Java FileInputStream教程Java 文件时间Java FileWriter教程Java 附加到文件用 Java 读取文本文件Java 教程



回到顶部