字节流和字符流的学习

144 阅读5分钟

以前只是知道字节流字符流。今天深入学习了一下字节流字符流

参考博客 blog.csdn.net/qq_35122713…

/**
     * 字节流和字符流的区别
     * @throws Exception
     */
    @Test
    public void test25() throws Exception{
        // 第1步:使用File类找到一个文件
        File f=new File("C:\\Users\\Administrator\\Desktop\\测试输入输出流.txt");
        // 第2步:通过子类实例化父类对象  // 准备好一个输出的对象
        OutputStream outputStream=new FileOutputStream(f);
        // 通过对象多态性进行实例化
        // 第3步:进行写操作
        String s="输出流-字节流";
        // 准备一个字符串
        byte b[]=s.getBytes();
        // 字符串转byte数组
        outputStream.write(b);
        //关闭输出流
        outputStream.close();
    }
    @Test
    public void test26() throws Exception{
        // 第1步:使用File类找到一个文件
        File f=new File("C:\\Users\\Administrator\\Desktop\\测试输入输出流.txt");
        String s="输出流-字符流";
        // 第2步:通过子类实例化父类对象  // 准备好一个输出的对象
        /*第一种*/
        OutputStream outputStream=new FileOutputStream(f);
        OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream);//将字节流转换为字符流
        outputStreamWriter.write(s);
        /*第二种*/
        FileWriter fileWriter=new FileWriter(f);
        fileWriter.write(s);
        //关闭输出流
        outputStreamWriter.close();
        //outputStreamWriter.flush();
        fileWriter.close();
        //fileWriter.flush();
        /*
        程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而 在关闭字符流时会强制性地将缓冲区中的内容进行输出,
        但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
        提问:什么叫缓冲区?
        在很多地方都碰到缓冲区这个名词,那么到底什么是缓冲区?又有什么作用呢?
        回答:缓冲区可以简单地理解为一段内存区域。
        可以简单地把缓冲区理解为一段特殊的内存。
        某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,
        以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
        在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
        如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
        此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。
提问:使用字节流好还是字符流好?
学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。
在回答之前,先为读者讲解这样的一个概念,所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,
所以在开发中,字节流使用较为广泛。
        * */
    }
    @Test
    public void test27() throws Exception{
        File f=new File("C:\\Users\\Administrator\\Desktop\\测试输入输出流.txt");
        InputStream inputStream=new FileInputStream(f);
        byte[] b = new byte[2];
        int i=0;
        while ((i=inputStream.read(b))!=-1){
            String read = new String(b);
            System.out.println(read);
        }
    }
    @Test
    public void test28() throws Exception{
        File f=new File("C:\\Users\\Administrator\\Desktop\\测试输入输出流.txt");
        InputStream inputStream=new FileInputStream(f);
        InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
        byte[] b = new byte[2];
        int i=0;
        while ((i=inputStreamReader.read())!=-1){
            String read = new String(b);
            System.out.println(read);
        }
    }
    /*将一个java对象序列化到文件里面*/ 在 java 中能够被序列化的类必须先实现 Serializable 接口,该接口没有任何抽象方法只是起到一个标记作用。
    @Test
    public void test29() throws Exception{
        File f=new File("F://obj");
        OutputStream outputStream=new FileOutputStream(f);
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
        User user=new User();
        user.setAge(1);
        user.setName("z");
        objectOutputStream.writeObject(user);
        objectOutputStream.close();
    }
    @Test
    public void test30() throws Exception{
        File f=new File("F://obj");
        InputStream inputStream=new FileInputStream(f);
        ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
        User user=(User) objectInputStream.readObject();
        System.out.println(user);
    }

字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节 数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。 字节流可以处理所有类型数 据,如:图片,MP3,AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符 流,除此之外都用字节流。字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、 InputStream 字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字 节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的, 所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用 字符流好点。在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。