Java DataInputStream

时间:2020-01-09 10:36:02  来源:igfitidea点击:

Java DataInputStream类java.io.DataInputStream允许我们从InputStream读取Java原语(int,float,long等),而不仅仅是原始字节。我们可以将" InputStream"包装在" DataInputStream"中,然后可以通过" DataInputStream"读取Java原语。这就是为什么将其称为DataInputStream的原因,因为它读取数据(数字)而不是字节。

如果我们需要读取的数据包含每个大于一个字节的Java原语(例如int,long,float,double等),则" DataInputStream"非常方便。" DataInputStream"期望将多字节原语以网络字节顺序写入(大字节序最高有效字节在前)。

通常,我们将使用Java DataInputStream来读取Java DataOutputStream写入的数据。

Java DataInputStream类是InputStream的子类,因此DataInputStream也具有基本的读取方法,使我们可以在需要时从基础InputStream读取单个字节或者字节数组。但是,在本Java DataInputStream教程中,我将仅介绍DataInputStream拥有的其他方法。

读取原始数据类型时要记住的一个问题是,没有办法将有效的int值-1与正常的流结束标记区分开。这基本上意味着,如果我们已到达流的末尾,则无法从返回的原始值中看到。因此,我们必须提前知道要读取的数据类型以及读取的顺序。换句话说,我们需要提前知道可以从DataInputStream读取哪些数据。

Java DataInputStream示例

这是一个JavaDataInputStream示例:

DataInputStream dataInputStream = new DataInputStream(
                            new FileInputStream("binary.data"));

int    aByte   = input.read();
int    anInt   = input.readInt();
float  aFloat  = input.readFloat();
double aDouble = input.readDouble();
//etc.

input.close();

首先,创建一个DataInputStream,并使用FileInputStream作为其数据源。其次,从" DataInputStream"中读取Java原语。

创建一个DataInputStream

我们可以通过其构造函数创建Java DataInputStream。这样做时,我们将一个InputStream作为参数传递,将从中读取原始数据类型。这是创建Java DataInputStream的示例:

DataInputStream dataInputStream =
        new DataInputStream(
                new FileInputStream("data/data.bin"));

将DataInputStream与DataOutputStream一起使用

如前所述,通常将DataInputStream类与DataOutputStream一起使用。因此,我只想向我们展示一个示例,该示例首先使用DataOutputStream写入数据,然后使用DataInputStream再次读取。这是示例Java代码:

import java.io.*;

public class DataInputStreamExample {

    public static void main(String[] args) throws IOException {
        DataOutputStream dataOutputStream =
                new DataOutputStream(
                        new FileOutputStream("data/data.bin"));

        dataOutputStream.writeInt(123);
        dataOutputStream.writeFloat(123.45F);
        dataOutputStream.writeLong(789);

        dataOutputStream.close();

        DataInputStream dataInputStream =
                new DataInputStream(
                        new FileInputStream("data/data.bin"));

        int   int123     = dataInputStream.readInt();
        float float12345 = dataInputStream.readFloat();
        long  long789    = dataInputStream.readLong();

        dataInputStream.close();

        System.out.println("int123     = " + int123);
        System.out.println("float12345 = " + float12345);
        System.out.println("long789    = " + long789);
    }
}

这个例子首先创建一个" DataOutputStream",然后将一个" int"," float"和一个" long"值写入文件。第二个例子创建了一个" DataInputStream",它从同一文件中读取" int"," float"和" long"值。

读取布尔值boolean

我们可以使用DataInputStream的Java方法" readBoolean()"来读取Java语言"布尔值"。这是一个使用readBoolean()从Java DataInputStream读取布尔值的示例:

boolean myBoolean = dataInputStream.readBoolean();

读取字节byte

我们可以使用DataInputStream的readByte()方法从其读取Java字节。这是一个使用readByte()从Java DataInputStream读取字节的示例:

byte myByte = dataInputStream.readByte();

读取无符号字节 Unsigned byte

我们可以使用其readUnsignedByte()方法从DataInputStream读取Java无符号字节(仅正值)。未签名的字节以int形式返回,因为大于127的字节值无法容纳在有符号的byte数据类型中。这是使用readUnsignedByte()从Java DataInputStream读取无符号字节的示例:

int myUnsignedByte = dataInputStream.readUnsignedByte();

读字符char

我们可以使用其readChar()方法从DataInputStream读取Java char。这是一个使用readChar()从Java DataInputStream读取char的示例:

char myChar = dataInputStream.readChar();

读double类型

我们可以使用DataInputStream的readDouble()方法从Java中读取Java的double。这是一个使用readDouble()从Java DataInputStream读取一个double的示例:

double myDouble = dataInputStream.readDouble();

读浮点类型float

我们可以使用其readFloat()方法从DataInputStream读取Java浮点数。这是一个使用readFloat()从Java DataInputStream读取浮点数的示例:

float myFloat = dataInputStream.readFloat();

读取short类型

我们可以使用其readShort()方法从DataInputStream中读取Java的short。这是一个使用readShort()读取Java DataInputStream的简短示例:

short myShort = dataInputStream.readShort();

读取Unsigned short类型

我们可以使用其readUnsignedShort()方法从DataInputStream读取Java无符号的short(仅正值)。未签名的short作为" int"返回,因为32767以上的short值不能适合已签名的" short"数据类型。这是一个使用readUnsignedShort()从Java DataInputStream读取一个无符号的short的例子:

int myUnsignedShort = dataInputStream.readUnsignedShort();

读int类型

我们可以使用其readInt()方法从DataInputStream读取Java int。这是一个使用readInt()从Java DataInputStream读取int的示例:

int   myInt = dataInputStream.readInt();

读取long类型

我们可以使用DataInputStream的readLong()方法从Java中读取Java long。这是一个使用readLong()从Java DataInputStream读取int的示例:

long   myLong = dataInputStream.readLong();

读取UTF

我们可以使用其readUTF()方法从DataInputStream中读取Java字符串。预期该数据将以UTF-8编码,以便可以通过此方法读取。这是一个使用readUTF()从Java DataInputStream读取字符串的示例:

String   myString = dataInputStream.readUTF();

关闭一个DataInputStream

从" DataInputStream"中读取数据完成后,我们应该记得将其关闭。关闭DataInputStream也将关闭从中读取DataInputStreamInputStream实例。

关闭DataInputStream是通过调用其close()方法来完成的。这是关闭DataInputStream的样子:

dataInputStream.close();

我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭" DataInputStream"外观的方法:

InputStream input = new FileInputStream("data/data.bin");

try(DataInputStream dataInputStream =
    new DataInputStream(input)){

    int data = dataInputStream.readInt();

    int   int123     = dataInputStream.readInt();
    float float12345 = dataInputStream.readFloat();
    long  long789    = dataInputStream.readLong();
}

请注意,不再有任何显式的close()方法调用。 try-with-resources构造可以解决这一问题。

还要注意,第一个FileInputStream实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭此FileInputStream实例。但是,当关闭" DataInputStream"时,也会关闭其读取的" InputStream"实例,因此当" DataInputStream"关闭时," FileInputStream"实例也会关闭。