勿以惡小而爲之,勿以善小而不爲--------------------------劉備
勸諸君,多行善事積福報,莫作惡
上一章簡單介紹了 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);
進行處理。
運行程序,看控制檯輸出:
發現,可以正確地取出數據。
但有沒有發現,這樣太麻煩了,需要對格式進行非常正確的處理。
但是,這種將信息存儲到文件裏面的需求非常好,那該怎麼辦呢? 序列化。 下一章節,我們講解一下這個序列化。
謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!