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);

进行处理。

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

有图片

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

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

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


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

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