Java DataInputStream
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
也将关闭从中读取DataInputStream
的InputStream
实例。
关闭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"实例也会关闭。