DataOutputStream和DataInputStream(八)

勿以惡小而爲之,勿以善小而不爲--------------------------劉備
勸諸君,多行善事積福報,莫作惡

上一章簡單介紹了 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);

進行處理。

運行程序,看控制檯輸出:

有圖片

發現,可以正確地取出數據。

但有沒有發現,這樣太麻煩了,需要對格式進行非常正確的處理。

但是,這種將信息存儲到文件裏面的需求非常好,那該怎麼辦呢? 序列化。 下一章節,我們講解一下這個序列化。


謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章