DataOutputStream和DataInputStream(八)
原创
©著作权归作者所有:来自51CTO博客作者两个蝴蝶飞的原创作品,请联系作者获取转载授权,否则将追究法律责任
勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了 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 文件内容:
这是什么,完全看不懂啊。
我们看不懂是对的,这样内容就安全了, 需要用 相对应的 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);
进行处理。
运行程序,看控制台输出:
发现,可以正确地取出数据。
但有没有发现,这样太麻烦了,需要对格式进行非常正确的处理。
但是,这种将信息存储到文件里面的需求非常好,那该怎么办呢? 序列化。 下一章节,我们讲解一下这个序列化。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!