一、数据流
为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。
数据流有两个类: (用于读取和写出基本数据类型、 String类的数据)
DataInputStream 和 DataOutputStream
分别“套接”在 InputStream 和 OutputStream 子类的流上
二、DataInputStream 类
1、DataInputStream 类概述
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
2、DataInputStream 类结构
3、构造方法
DataInputStream(InputStream in)
使用指定的底层 InputStream 创建一个 DataInputStream
4、常用方法
int read(byte[] b) : 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。
int read(byte[] b, int off, int len):从包含的输入流中将最多 len 个字节读入一个 byte 数组中。
boolean readBoolean() : 读取一个输入字节,如果该字节不是零,则返回 true,如果是零,则返回 false。
byte readByte():读取并返回一个输入字节。
char readChar() :读取两个输入字节并返回一个 char 值。
double readDouble(): 读取八个输入字节并返回一个 double 值。
float readFloat():读取四个输入字节并返回一个 float 值。
void readFully(byte[] b):从输入流中读取一些字节,并将它们存储在缓冲区数组 b 中。
void readFully(byte[] b, int off, int len):从输入流中读取 len 个字节。
int readInt() :读取四个输入字节并返回一个 int 值。
long readLong() :读取八个输入字节并返回一个 long 值。
short readShort():读取两个输入字节并返回一个 short 值。
三、DataOutputStream 类
1、DataInputStream 类概述
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
2、DataInputStream 类结构
3、构造方法
DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。
4、常用方法
void flush():清空此数据输出流。
int size():返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入基础输出流。
void write(int b):将指定字节(参数 b 的八个低位)写入基础输出流。
void writeBoolean(boolean v):将一个 boolean 值以 1-byte 值形式写入基础输出流。
void writeByte(int v):将一个 byte 值以 1-byte 值形式写出到基础输出流中。
void writeBytes(String s):将字符串按字节顺序写出到基础输出流中。
void writeChar(int v):将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeChars(String s):将字符串按字符顺序写入基础输出流。
void writeDouble(double v) :使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeFloat(float v) :使用 Float 类中的 floatToIntBits 方法将 float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeInt(int v) :将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeLong(long v) : 将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeShort(int v) : 将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeUTF(String str) :以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
四、案例
1、写入数据
将内存中的字符串、基本数据类型的变量写出到文件中。
1 DataOutputStream dos = null;
2 try { // 创建连接到指定文件的数据输出流对象
3 dos = new DataOutputStream(new FileOutputStream("destData.dat"));
4 dos.writeUTF("Hello Java"); // 写UTF字符串
5 dos.writeBoolean(false); // 写入布尔值
6 dos.writeLong(1234567890L); // 写入长整数
7 System.out.println("写文件成功!");
8 } catch (IOException e) {
9 e.printStackTrace();
10 } finally { // 关闭流对象
11 try {
12 if (dos != null) {
13 // 关闭过滤流时,会自动关闭它包装的底层节点流
14 dos.close();
15 }
16 } catch (IOException e) {
17 e.printStackTrace();
18 }
19 }
2、读取数据
将文件中存储的基本数据类型变量和字符串读取到内存中,保存在变量中。
1 DataInputStream dis = null;
2 try {
3 dis = new DataInputStream(new FileInputStream("destData.dat"));
4 String info = dis.readUTF();
5 boolean flag = dis.readBoolean();
6 long time = dis.readLong();
7 System.out.println(info);
8 System.out.println(flag);
9 System.out.println(time);
10 } catch (Exception e) {
11 e.printStackTrace();
12 } finally {
13 if (dis != null) {
14 try {
15 dis.close();
16 } catch (IOException e) {
17 e.printStackTrace();
18 }
19 }
20 }
注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致!
3、案例三
当程序中有这样的一组数组:
int num = 10;
char c = '好';
double d = 88.88;
String info = "Hello,World";
boolean good = true;
程序运行过程中,想要临时退出,下次希望从这个状态继续恢复执行。
希望 Java 能够输出各种数据类型的数据,读取时,能还原各种数据类型的数据,因为这些数据不是纯文本,只能选择字节流。
注意:DataInputStream 与 DataOutputStream 必须配对使用,并且读的顺序要与写的顺序一致。
要求:使用 DataOutputStream 写入的文件或数据,得用 DataInputStream 来读取,并且要求读的顺序与写的顺序要一致。
Demo:
1 @Test
2 public void test01()throws IOException{
3 int num = 10;
4 char c = '好';
5 double d = 188.88;
6 String info = "Hello World";
7 boolean good = true;
8
9 FileOutputStream fos = new FileOutputStream("data.dat");
10 /*fos.write(num);//错误的
11 fos.write(c);
12 fos.write((byte)d);*/
13 DataOutputStream dos = new DataOutputStream(fos);
14
15 dos.writeInt(num);
16 dos.writeChar(c);
17 dos.writeDouble(d);
18 dos.writeUTF(info);
19 dos.writeBoolean(good);
20
21 dos.close();
22 fos.close();
23 }
24
25 @Test
26 public void test02()throws IOException{
27 FileInputStream fis = new FileInputStream("data.dat");
28 DataInputStream dis = new DataInputStream(fis);
29
30 int num = dis.readInt();
31 char c = dis.readChar();
32 double d = dis.readDouble();
33 String s = dis.readUTF();
34 boolean b = dis.readBoolean();
35
36 System.out.println(num);
37 System.out.println(c);
38 System.out.println(d);
39 System.out.println(s);
40 System.out.println(b);
41
42 dis.close();
43 fis.close();
44 }