DataOutputStream和DataInputStream(八)

简介: 在Java开发中,如果没有使用数据库时,常常会将内容保存在文件上面。 如用户的个人信息。 在保存的时候,需要有一定的格式进行保存,如用 \t 分开员工的每一个信息,用\n 分开每一个员工。 读取的时候,就必须按照相应的格式进行读取。

在Java开发中,如果没有使用数据库时,常常会将内容保存在文件上面。 如用户的个人信息。 在保存的时候,需要有一定的格式进行保存,如用 \t 分开员工的每一个信息,用\n 分开每一个员工。 读取的时候,就必须按照相应的格式进行读取。


为了区分不同的平台存储时的差异, 使用与平台无关的两个类 DataOutputStream 和 DataInputStream 进行存储和读取。


一. DataOutputStream


一.一 方法


一.一.一 构造方法


一.一.一.一 方法


image.png


一.一.一.二 演示


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


一.一.二 写入方法


image.png


一.二 演示 DataOutputStream


将员工列表信息:


image.png


写入到文件里面。


    @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 文件内容:


20200618153619716.png


这是什么,完全看不懂啊。


我们看不懂是对的,这样内容就安全了, 需要用 相对应的 DataInputStream 按照相同的格式进行解析即可。


二. DataInputStream


二.一 方法


二.一.一 构造方法


二.一.一.一 方法


image.png


二.一.一.二 演示


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


二.一.二 读取方法


image.png


二.二 演示 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);


进行处理。


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


20200618153644828.png


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


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


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


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

相关文章
|
10月前
FileReader和FileWriter流
FileReader和FileWriter流
32 0
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
431 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
120 0
|
Java
java IO流之BufferedReader和BufferedWriter
BufferedReader和BufferedWriter 一、简介: 二、使用BufferedReader案列 BufferedReader 中文乱码解决方案解决方案; 三、BufferedWriter使用案例
217 0
java IO流之BufferedReader和BufferedWriter
|
消息中间件 前端开发 JavaScript
InputStream 和 OutputStream 基础
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
InputStream 和 OutputStream 基础
|
移动开发
字节流InputStream和OutputStream(二)上
字节流InputStream和OutputStream(二)
153 0
字节流InputStream和OutputStream(二)上
BufferedReader和BufferedWriter(七)
以前读取和写入文件内容时,用的Reader和Writer, 当调用 read() 或者 readLine() 方法时,效率是非常慢的。 如果能添加缓冲区,那么就非常好了。 BufferedReader 和 BufferedWriter ,就是在 Reader和 Writer 的基础上,添加了缓冲区, 即不仅具有Reader和Writer的各个功能,还能通过缓冲区进行相应的优化, 其实,这就是装饰器。
130 0
BufferedReader和BufferedWriter(七)