勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了 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);
进行处理。
运行程序,看控制台输出:
发现,可以正确地取出数据。
但有没有发现,这样太麻烦了,需要对格式进行非常正确的处理。
但是,这种将信息存储到文件里面的需求非常好,那该怎么办呢? 序列化。 下一章节,我们讲解一下这个序列化。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!