勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶

上一章简单介绍了 BufferedReader和BufferedWriter(七),如果没有看过,​​请观看上一章​​

在Java开发中,如果没有使用数据库时,常常会将内容保存在文件上面。 如用户的个人信息。 在保存的时候,需要有一定的格式进行保存,如用 \t 分开员工的每一个信息,用\n 分开每一个员工。 读取的时候,就必须按照相应的格式进行读取。

为了区分不同的平台存储时的差异, 使用与平台无关的两个类 DataOutputStream 和 DataInputStream 进行存储和读取。

一. DataOutputStream

一.一 方法

一.一.一 构造方法

一.一.一.一 方法

方法

作用

DataOutputStream(OutputStream out)

传入outputStream 对象

一.一.一.二 演示
@Test
public void conTest() throws Exception{

File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data.txt");

DataOutputStream dataOutputStream=new DataOutputStream(
new FileOutputStream(file)
);
}

一.一.二 写入方法

方法

作用

void flush()

刷新此数据输出流

void writeInt(int v)

写入 int 类型的值

void writeLong(long v)

写入long 类型的值

void writeFloat(float v)

写入float 值

void writeDouble(double v)

写入double 值

void writeBoolean(boolean v)

写入boolean 类型的值

void writeChar(int v)

写入char 类型的值, 可以直接写入单个中文字符。 可写入 \t 和\n

void writeChars(String s)

写入字符串

void writeUTF(String str)

使用机器无关的方式使用 modified UTF-8编码将字符串写入底层输出流。

一.二 演示 DataOutputStream

将员工列表信息:

id

name

sex

age

desc

1

老蝴蝶


20

一个好人

2

蝴蝶


21

一个人

3

岳泽霖


22

快乐的人

4

岳建立


23

想要快乐的人

写入到文件里面。

@Test
public void writeTest() throws Exception{
File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data.txt");

//构造
DataOutputStream dataOutputStream=new DataOutputStream(
new FileOutputStream(file)
);

//id编号,姓名, 性别,年龄,描述。

int[] ids={1,2,3,4};

String[] names={"老蝴蝶","蝴蝶","岳泽霖","岳建立"};

char[] sexs={'男','男','男','男'};

int[] ages={20,21,22,23};

String[] descs={"一个好人","一个人","快乐的人","想要快乐的人"};


//遍历循环

for(int i=0;i<ids.length;i++){

//写入 int 类型的 id
dataOutputStream.writeInt(ids[i]);

dataOutputStream.writeChar('\t');
//写入 字符串类型的 name
dataOutputStream.writeChars(names[i]);

dataOutputStream.writeChar('\t');
//写入 字符类型的 sex
dataOutputStream.writeChar(sexs[i]);

dataOutputStream.writeChar('\t');
//写入 int 类型的 age
dataOutputStream.writeInt(ages[i]);

dataOutputStream.writeChar('\t');
//写入字符串类型的 desc
dataOutputStream.writeChars(descs[i]);

//换行

dataOutputStream.writeChar('\n');
}

//关闭
dataOutputStream.close();
}

运行程序, 会发现 data.txt 文件内容:

DataOutputStream和DataInputStream(八)_DataInputStream

这是什么,完全看不懂啊。

我们看不懂是对的,这样内容就安全了, 需要用 相对应的 DataInputStream 按照相同的格式进行解析即可。

二. DataInputStream

二.一 方法

二.一.一 构造方法

二.一.一.一 方法

方法

作用

DataInputStream(InputStream in)

需要传入 inputStream 对象

二.一.一.二 演示

@Test
public void readConTest() throws Exception{

File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data.txt");

DataInputStream dataInputStream=new DataInputStream(new FileInputStream(file));

}

二.一.二 读取方法

方法

作用

int readInt()

读取 int ,实际上就是读取4个长度

long readLong()

读取 long

float readFloat()

读取float

double readDouble()

读取double

boolean readBoolean()

读取boolean

char readChar()

读取char, 实际内部读取两个字节

String readUTF()

读取字符串

二.二 演示 DataInputStream

@Test
public void readTest() throws Exception{
File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data.txt");

//构造
DataInputStream dataInputStream=new DataInputStream(new FileInputStream(file));

//开始读取

int[] ids=new int[4];
String[] names=new String[4];

char[] sexs=new char[4];

int[] ages=new int[4];

String[] descs=new String[4];


int i=0;

boolean flag=true;

//读取的格式,一定要一致。
while(flag){

//一直执行
//读id
int id=-1;
try{
id=dataInputStream.readInt();
}catch(Exception e){
//如果不能读取,即到最后了, 那么结束循环。
flag=false;
break;
}
ids[i]=id;

//读 char, 实际上读的是 \t
dataInputStream.readChar();

//该name 了。
//最大长度为100
char[] tempChar=new char[100];

char temp=' ';

int j=0;
//没有到 下一个 \t 分隔符
while((temp=dataInputStream.readChar())!='\t'){

tempChar[j++]=temp;
}

names[i]=new String(tempChar,0,j);

j=0;
//已经通过 \t了,那么这儿读取的就是 性别了
sexs[i]=dataInputStream.readChar();
//读出的是 \t
dataInputStream.readChar();
// 读年龄
ages[i]=dataInputStream.readInt();

//\t
dataInputStream.readChar();

while((temp=dataInputStream.readChar())!='\n'){

tempChar[j++]=(char)temp;
}
descs[i]=new String(tempChar,0,j);

}

StringBuilder sb=new StringBuilder();
for(int j=0;j<ids.length;j++){


sb.append(ids[i]).append("\t")
.append(names[i]).append("\t")
.append(sexs[i]).append("\t")
.append(ages[i]).append("\t")
.append(descs[i]).append("\r\n");
}

System.out.println(sb.toString());

}

}

无法直接读取字符串, 需要通过

char temp=' ';
int j=0;
//没有到 下一个 \t 分隔符
while((temp=dataInputStream.readChar())!='\t'){

tempChar[j++]=temp;
}

names[i]=new String(tempChar,0,j);

进行处理。

运行程序,看控制台输出:

DataOutputStream和DataInputStream(八)_DataInputStream_02

发现,可以正确地取出数据。

但有没有发现,这样太麻烦了,需要对格式进行非常正确的处理。

但是,这种将信息存储到文件里面的需求非常好,那该怎么办呢? 序列化。 下一章节,我们讲解一下这个序列化。



谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!