精华内容
下载资源
问答
  • 今日总结字节流OutputStream 字节输出流 超类FileOutputStream 基本流FilterOutputStreamBufferedOutputStream 字节缓冲输出流(高效)InputStream 字节输入流 超类FileInputStream 基本流...

    今日总结字节流

    OutputStream 字节输出流 超类FileOutputStream 基本流

    FilterOutputStreamBufferedOutputStream 字节缓冲输出流(高效)

    InputStream 字节输入流 超类FileInputStream 基本流

    FilterInputStreamBufferedInputStream 字节缓冲输入流(高效)

    字符流

    Writer 字符输出流 超类OutputStreamWriter 转换流FileWriter 基本流

    BufferedWriter 字符输出缓冲流(高效)

    Reader 字符输入流 超类InputStreamReader 转换流,字节输入流+指定编码表FileReader 基本流,字节输入流+默认编码表

    BufferedReader 字符输入缓冲流(高效)

    1.字节缓冲流字节缓冲流介绍(高效流)BufferOutputStream:字节缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

    BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

    构造方法:方法名说明BufferedOutputStream(OutputStream out)创建字节缓冲输出流对象

    BufferedInputStream(InputStream in)创建字节缓冲输入流对象它们的底层是有数组存在的,默认是8192个长度

    缓冲流在读写数据释放资源,调用的方法和字节基本流(FileInputStream和FileOutputStream)是一样的。因为它们都来自于同一个父类的方法。

    2.字符流

    2.1 为什么会出现字符流字符流的介绍

    由于字节流操作中文不是特别的方便,所以Java就提供字符流

    字符流 = 字节流 + 编码表

    中文的字节存储方式

    用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

    汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

    读:读取字节,然后查询编码表拼成字符(解码)

    写:先查询编码表将字符变成字节(编码),然后写出

    2.2 编码表编码表是字节(二进制)和字符的对照表

    什么是字符集

    是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

    l计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

    常见的字符集ASCII字符集:

    ASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)

    基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

    GBXXX字符集:

    GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等

    Unicode字符集:

    UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码

    编码规则:

    128个US-ASCII字符,只需一个字节编码

    拉丁文等字符,需要二个字节编码

    大部分常用字(含中文),使用三个字节编码

    其他极少使用的Unicode辅助字符,使用四字节编码

    编码表只适用于文字和符号等,对图片,视频和音频等不适用。

    字符流只能操作纯文本文件,不能操作图片,视频和音频等。

    2.3 字符串中的编码解码问题相关方法方法名说明byte[] getBytes()使用平台的默认字符集将该 String编码为一系列字节

    byte[] getBytes(String charsetName)使用指定的字符集将该 String编码为一系列字节

    String(byte[] bytes)使用平台的默认字符集解码指定的字节数组来创建字符串

    String(byte[] bytes, String charsetName)通过指定的字符集解码指定的字节数组来创建字符串

    2.4 字符流中的编码解码问题字符流中和编码解码问题相关的两个类InputStreamReader:是从字节流到字符流的桥梁

    ​ 它读取字节,并使用指定的编码将其解码为字符

    ​ 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

    OutputStreamWriter:是从字符流到字节流的桥梁

    ​ 是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

    ​ 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

    构造方法方法名说明InputStreamReader(InputStream in)使用默认字符编码创建InputStreamReader对象

    InputStreamReader(InputStream in,String chatset)使用指定的字符编码创建InputStreamReader对象

    OutputStreamWriter(OutputStream out)使用默认字符编码创建OutputStreamWriter对象

    OutputStreamWriter(OutputStream out,String charset)使用指定的字符编码创建OutputStreamWriter对象

    2.5 字符流写数据的5种方式方法介绍方法名说明void write(int c)写一个字符

    void write(char[] cbuf)写入一个字符数组

    void write(char[] cbuf, int off, int len)写入字符数组的一部分

    void write(String str)写一个字符串

    void write(String str, int off, int len)写一个字符串的一部分

    刷新和关闭的方法方法名说明flush()刷新流,之后还可以继续写数据

    close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

    2.6 字符流读数据的2种方式方法介绍方法名说明int read()一次读一个字符数据

    int read(char[] cbuf)一次读一个字符数组数据

    2.7 字符缓冲流字符缓冲流介绍BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

    BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途

    构造方法方法名说明BufferedWriter(Writer out)创建字符缓冲输出流对象

    BufferedReader(Reader in)创建字符缓冲输入流对象

    2.8 字符缓冲流特有功能方法介绍

    BufferedWriter:方法名说明void newLine()写一行行分隔符,行分隔符字符串由系统属性定义,跨平台

    BufferedReader:方法名说明String readLine()一次读一行文字。 只读取行内的内容,不包括任何行终止字符。如果流的结尾已经到达,则返回null

    2.9 IO流如何选择字节流

    可以操作任意类型的文件,包括纯文本文件和非纯文本文件(图片、视频、音频等...)

    1:非纯文本文件

    2:一切复制操作都选字节流,即使复制纯文本文件

    优先选择高效流

    字符流

    只能操作纯文本文件,不能操作非纯文本文件

    1:读取字符串

    2:写出字符串

    优先选择高效流

    2.10 IO流小结字节流

    2e1c5d1b7cd80d25ca5847c33c3b78f1.png

    字符流

    d5942238995e12fae91ac1875d782c81.png

    展开全文
  • 字符流父类

    2021-02-28 14:08:40
    reader字符输入public int read(){}public int read(char[] c){}public int read(char[] b, int off, int len){}Writer字符输出public void write(int n){}public void write(String str){}public void write...

    reader 字符输入流

    public int read(){}

    public int read(char[] c){}

    public int read(char[] b, int off, int len){}

    Writer 字符输出流

    public void write(int n){}

    public void write(String str){}

    public void write(char[] c){}

    传统读取文件的方式

    // 传统字节流读取

    psvm(String[] args){

    // 1. 创建FileInputStream对象

    FileInputSteam fis = new FileInputStream("路径");

    // 2. 读取

    int data = 0;

    while((data = fis.read()) != -1){

    sout((char)data);

    }

    // 3. 关闭

    fis.close();

    }

    以上这种方式,如果文件中的内容是英文的,那是没有什么问题的,因为一个英文字母一个字节,但是当文件中的内容是中文的话,一个汉字是三个字节,这个时候,再读取文件中的内容是会出现乱码的。

    FileReader

    小案例;

    package com.iopractise;

    import java.io.FileNotFoundException;

    import java.io.FileReader;

    import java.io.IOException;

    public class Demo10 {

    public static void main(String[] args) throws IOException {

    // 1. 创建FileReader 文件字符输入流

    FileReader fr = new FileReader("d:\\aaa.txt");

    // 2. 读取

    // 2.1 单个字符读取

    int data = 0;

    while ((data = fr.read()) != -1) {

    System.out.println(((char) data));// 读取一个字符

    }

    //2.2 字符缓冲区读取

    char[] buf = new char[2];

    int count = 0;

    while ((count = fr.read(buf)) != -1) {

    System.out.println(new String(buf, 0, count));

    }

    // 3. 关闭

    fr.close();

    }

    }

    运行结果;

    或者

    中国

    加油

    当然如果文件中,既有中文又有英文也是没有问题的,都能够进行正常读取。

    h

    e

    l

    l

    o

    w

    o

    r

    l

    D

    FileWriter

    小案例:

    package com.iopractise;

    import java.io.FileWriter;

    import java.io.IOException;

    public class Demo11 {

    public static void main(String[] args) throws IOException {

    // 1. 创建FileWriter对象

    FileWriter fw = new FileWriter("d:\\ccc.txt");

    // 2. 写入

    for (int i = 0; i < 10; i++) {

    fw.write("中国加油!");

    fw.flush();

    }

    // 3. 关闭

    fw.close();

    System.out.println("执行完毕");

    }

    }

    运行结果:

    我们打开文件会看到我们写入的内容。

    中国加油!中国加油!中国加油!中国加油!中国加油!中国加油!中国加油!中国加油!中国加油!中国加油!

    使用FileReader和FileWriter来实现文件的复制操作

    package com.iopractise;

    import java.io.FileReader;

    import java.io.FileWriter;

    /**

    * 不能复制图片或二进制文件,使用字节流可以复制任意文件

    * 复制图片、音频等非字符文件只能使用字节流,因为在电脑中存储的一切文件的底层都是一个个字节。

    */

    public class Demo12 {

    public static void main(String[] args) throws Exception{

    // 1. 创建

    FileReader fr = new FileReader("d:\\ccc.txt");

    FileWriter fw = new FileWriter("d:\\ccc2.txt");

    // 2. 读写

    int data = 0;

    while((data = fr.read()) != -1){

    fw.write(data);

    fw.flush();

    }

    // 3. 关闭

    fw.close();

    fr.close();

    }

    }

    展开全文
  • 字节流和字符流详解

    千次阅读 2021-03-29 20:21:21
    1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端 ...按照传输单位可以分为:字节流和字符流 3.什么是字节流,什么是字符流 字节流: 它处理单元为1个字节(byte),操作字节

    1.流的概念

    • 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端
    • 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
    • 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

    2.流的分类

    按照流向可以分为:输入流(如:键盘,麦克风),输出流(如:显示器,音箱)
    按照传输单位可以分为:字节流和字符流

    3.什么是字节流,什么是字符流

    字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位);

    字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到中文(文本)的,用字符流好点(1Unicode = 2字节 = 16位);

    所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

    字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

    字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

    最简单的区分字节流和字符流

    万物皆文件,那就将文件在记事本里面打开,如果打开后能看的懂的就是字符流,如果看不懂那就是字节流

    问题:
    1.word.doc 数据字节流还是字符流?
    答:.doc数据字节流。
    2.Excel 数据字节流还是字符流?
    答:要根据保存的格式进行判断,如果是保存为.csv那么他就是字符流,如果是其他的则数据字节流。

    字符和字节操作

    在这里插入图片描述
    如何简单记住字节流和字符流

    • 字符流是以Reader,Writer结尾的
    • 字符节流是以InputStream或OutputStream结尾的

    4.字节流的使用

    字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream。

    字节输出流:OutputStream,OutputStream是整个IO包中字节输出流的最大父类

    Closeable表示可以关闭的操作

    示例为:图片的复制

    步骤:
    1.读入二进制文件(输入流,FileInputStream)
    2.写入二进制文件(输出流,FileOutputStream)

    前请了解:try-with-resource,这是JDK1.7提供的新方法,让代码的可读性更高,但是并不是所有的对象都可以这样,当调用的类实现了closable接口就可以使用此种方式

    4.1.普通字节流的操作

    代码案例
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * 复制D:\io_test下的加菲猫文件到D:\io_test这个目录下
     */
    
    public class IoDemo4 {
    
        public static void main(String[] args) throws IOException {
            //输入文件目录
            String srcFilePath = "D:\\io_test\\加菲猫.jpg";
            //输出文件目录(拷贝的路径)
            String destFilePath = "D:\\io_test\\加菲猫2.jpg";
            FileInputStream fileInputStream = null;
            FileOutputStream fileOutputStream = null;
            try {
                //输入流,传入路径
                fileInputStream = new FileInputStream(srcFilePath);
                //输出流
                 fileOutputStream = new FileOutputStream(destFilePath);
                byte[] bytes = new byte[1024];
                try {
                    int count = 0;
                    //如果不等于-1说明还没有读取完成,要继续读取
                    while((count = fileInputStream.read(bytes)) != -1){
                        //还有内容要读取,然后从0开始读取,上面count有读了多少个,那么就写多少个
                        fileOutputStream.write(bytes,0,count);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                //用完之后一定要关闭流,但是得判断不是空的时候才需要去关闭流
                if(fileInputStream != null){
                    fileInputStream.close();
                }
                if(fileOutputStream != null){
                    fileOutputStream.close();
                }
            }
        }
    }
    
    

    执行结果
    在这里插入图片描述

    注意:
    1.因为字节流主要操作byte类型数据,注意里面参数的含义,如果是读取的话,比较常用的是第二种
    在这里插入图片描述

    (FileOutputStream)也是一样,读取的时候一般用第一个
    在这里插入图片描述

    2.读取数据的返回结果(FileInputStream)
    在这里插入图片描述

    3.最后一定要关闭流

    • 因为每天计算机打开的文件的数量是有限的,以liunx为例,最大可以打开66533个文件,
    • 但是无论执行结果怎么样他都要关闭流,那么就需要将他放在finally里面,所有上面的声明也得放在外面
    • 如果传入的地址和目标地址都是错的,也就是找不到,如果传入的地址错了,那么还没有初始化就已经被调用关闭流了,所以要进行判断

    4.2.带有缓冲区的字节流的操作

    什么是缓存区?
    定义:缓存区相当于缓存,它是存在内存中的
    写操作:
    没有使用缓存区:CPU读取每个字节之后直接操作磁盘(性能比较底)进行写完,写操作的瓶颈就会出现,因为每个字节都会操作一次磁盘
    使用缓冲区:那么每次会将字符放入缓存区(内存),等缓冲区满了之后,才一次性写入磁盘
    因为内存的操作速度远远大于磁盘,因此带缓冲区的输入流和输出流实现的效率就非常高(比如扔垃圾,一次性扔完和一次次扔肯定消耗的时间是有很大差距的)

    案例实现:复制D:\io_test\下的加菲猫—>D:\io_test\下变成加菲猫3

    代码实现
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    /**
     * 带有缓冲区的字节流操作:图片复制
     *
     */
    public class IoDemo5 {
        public static void main(String[] args) {
            //输入文件目录
            String srcFilePath = "D:\\io_test\\加菲猫.jpg";
            //输出文件目录(拷贝的路径)
            String destFilePath = "D:\\io_test\\加菲猫3.jpg";
            try {
                //因为带有缓存区的是基于原始的类进行操作的
                BufferedInputStream bufferedInputStream =
                        new BufferedInputStream(new FileInputStream(srcFilePath));
                BufferedOutputStream bufferedOutputStream =
                        new BufferedOutputStream(new FileOutputStream(destFilePath));
                {
                            byte[] bytes = new byte[1024];
                            int count = 0;
                            while ((count = bufferedInputStream.read(bytes)) != -1){
                                bufferedOutputStream.write(bytes,0,count);
                            }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    
    

    执行结果
    在这里插入图片描述

    5.字符流的使用

    5.1.普通的字符流操作

    在程序中一个字符等于两个字节,那么java提供了Reader、Writer两个专门操作字符流的类。

    字符输出流:Writer。
    字符输入流:Reader

    示例一:内容的写入:D:\io_test\1下创建一个text.txt文件,并写入内容“欢迎来到Java~”
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * 内容的写入:D:\io_test\1下创建一个text.txt文件,并写入内容
     */
    public class IoDemo7 {
        public static void main(String[] args) throws IOException {
            //定义文件地址
            String filePath = "D:\\io_test\\1\\text.txt";
            //写入内容
            String content = "欢迎来到Java~";
            //因为是写入文件,所以要使用FileWriter方法
            FileWriter fileWriter = null;
            try {
                fileWriter = new FileWriter(filePath);
                fileWriter.write(content);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
            //关闭流
                fileWriter.close();
            }
        }
    }
    

    **注意:**如果不关闭流,虽然也能创建文件成功,不报错,但是可能存在内容无法写入的情况

    示例二:但是上面这种操作如果是对于多行输入的话那么就回被覆盖
    因为这里的参数append会被默认成false,所以如果是多行写入的话
    需要手动设置成true
    

    在这里插入图片描述
    来看看在刚才那种被覆盖掉的情况
    在这里插入图片描述

    代码实现:那么来看看将append设置成true
    
    public class IoDemo7 {
        public static void main(String[] args) throws IOException {
            //定义文件地址
            String filePath = "D:\\io_test\\1\\text.txt";
            //写入内容
            String content = "欢迎来到java~,";
            //因为是写入文件,所以要使用FileWriter方法
            FileWriter fileWriter = null;
            try {
                fileWriter = new FileWriter(filePath,true);
                fileWriter.write(content);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                fileWriter.close();
            }
        }
    }
    
    

    执行结果
    在这里插入图片描述

    示例三:文件的读取,比如将文件下的内容读取到控制台
    

    文件下的内容

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    
    /**
     * 读取文件内容
     */
    public class IoDemo8 {
        public static void main(String[] args) throws FileNotFoundException {
            String filePath = "D:\\io_test\\1\\tt.txt";
            Scanner scanner = new Scanner(new File(filePath));
            //因为读取的内容可能不止一条,所以加上while循环
            while (scanner.hasNext()){
                System.out.println(scanner.nextLine());
            }
        }
    }
    
    

    执行效果
    在这里插入图片描述

     示例四:将内容读取到内存中,如:将一个路径下的内容复制到另一个路径下
    

    代码实现

    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     *将一个文件的内容写入到另一个文件下
     * 如:D:\io_test\1\text.txt -> text2.txt
     */
    public class IoDemo9 {
        public static void main(String[] args) throws IOException {
            //读取文件的地址
            String srcFilePath = "D:\\io_test\\1\\text.txt";
            //目标文件的地址
            String destFilePath = "D:\\io_test\\1\\text2.txt";
            FileReader fileReader = null;
            FileWriter fileWriter = null;
            //先读后写
            try{
                 fileReader = new FileReader(srcFilePath);
                 fileWriter = new FileWriter(destFilePath);
                {
                    //读操作
                    char[] chars = new char[1024];
                    while (true){
                        int count = fileReader.read(chars);
                        //判断是否等于-1,如果等于-1,说明已经读取完了,跳出循环
                        if(count == -1){
                            break;
                        }
                        //写操作
                        fileWriter.write(chars,0,count);
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                fileReader.close();
                fileWriter.close();
            }
        }
    }
    
    

    执行结果
    在这里插入图片描述

    5.2.带有缓冲区的字符流操作

    示例:如上述的示例四
    

    代码实现

    import java.io.*;
    
    /**
     * 带有缓冲区的字符流操作
     * 如:内容的复制
     */
    public class IoDemo10 {
        public static void main(String[] args) throws IOException {
            String srcFilePath = "D:\\io_test\\1\\tt.txt";
            String destFilePath = "D:\\io_test\\1\\tt2.txt";
            BufferedReader bufferedReader = null;
            BufferedWriter bufferedWriter = null;
            //先读取,后写入
            try {
                 bufferedReader = new BufferedReader(new FileReader(srcFilePath));
                 bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
                {
                    char[] chars = new char[1024];
                    while (true){
                        int count = bufferedReader.read(chars);
                        if(count == -1){
                            break;
                        }
                        bufferedWriter.write(chars,0,count);
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                bufferedReader.close();
                bufferedWriter.close();
            }
        }
    }
    

    执行结果
    在这里插入图片描述

    6.总结对比字节流和字符流

    • 字节流操作的基本单元是字节;字符流操作的基本单元为Unicode码元。

    • 字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;而字符流在操作的时候使用到缓冲区的。

    • 所有文件的存储都是字节(byte)的存储,在磁盘上保留的是字节。

    • 在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的话,不会输出任何内容

    展开全文
  • 1)输入输出(I/O)分类:共分为字节型输入输出流和字符型输入输出:(1)字节型输入输出:面向byte数组,它们的父类是InputStreamOutputStream具体内容参考下边的链接:(2)字符型输入输出:面向char数组或者...

    1. Java输入输出(I/O)流的知识回顾:

    补充:因为这篇文章是基于上一篇的延续,因此将上一篇进行简单的回顾,以便理解本节内容。

    1)输入输出(I/O)流分类:共分为字节型输入输出流和字符型输入输出流:

    (1)字节型输入输出流:面向byte数组,它们的父类是InputStream和OutputStream

    具体内容参考下边的链接:

    (2)字符型输入输出流:面向char数组或者String,它们的父类是Reader和Writer

    具体内容,见下边的具体讲解。

    2)常用输入输出流图谱:

    b459bd41ef326b2be28c9a589fb77d17.png

    2. 常用字符流(字符流父类、字符转换流、缓冲字符流、过滤流)

    (1)字符型输入输出流的父类:

    1)简介:

    Reader:是字符型输入流的父类,可以针对char数组或者String类型的内容,且是抽象类,不能用自身的构造函数初始化;

    Writer:是字符型输出流的父类,可以针对char数组或者String类型的内容,且是抽象类,不能自身的构造函数初始化。

    2)Reader的常用方法:

    Int read(): 读取一个字符,返回int值”低16”位有效。

    Int read(char[] chs): 从该流中读取一个字符串数组的length个字符并存入该数组,返回值为实际读取到的字符量。

    3)Wtriter的常用方法:

    Void write(int c):写出一个字符,写出给定int值”低16”位表示的字符。

    Void write(char[] chs):将给定字符数组中所有字符写出。

    Void write(String str):将给定的字符串写出。

    Void write(char[] chs, int offset, int len):将给定的字符数组中从offset处开始连续的len个字符写出。

    (2)字符转换流的输入输出:

    1)字符转换输入流:InputStreamReader

    使用该流可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并读取。常用的构造函数如下:

    InputStreamReader(InputStream in, String charsetName)

    基于给定的字节输入流以及字符编码创建InputStreamReader

    InputStreamReader(InputStream in)

    构造方法会根据系统默认字符集穿件InputStreamReader

    2)字符转换输出流OutputStreamWriter

    使用该流可以设置字符集,并按照指定的字符集将字符转换为对应字节后通过该流写出。常用的构造函数如下:

    OutputStreamWriter(OutputStream out, String charsetName)

    基于给定的字节输出流以及字符编码创建OutputStreamWriter

    OutputStreamWriter(OutputStream out)

    构造方法会根据系统默认字符集创建OutputStreamWriter

    (3)缓冲字符流的输入输出:

    1)缓冲字符输入流BufferedReader:

    其内部提供了缓冲区,可以提高读取的效率.常用的构造函数:

    BufferedReader(Reader reader)

    补充:BufferedReader提供了一个可以便于读取一行字符串的方法:

    String readLine():该方法连续读取一行字符串,知道读取到换行符为止,返回字符串中不包含该换行符。

    2) 缓冲字符输出流BufferedWriter:

    其内部提供了缓冲区,可以提高内容写出的效率.常用的构造函数:

    BufferedWriter(Writer out)

    代码应用实例一(利用字符流,按行读取文件中的内容):

    InputStreamReader和BufferedReader连用:

    e8b7de4beb850500566998be86e8527b.png

    代码应用实例二(将指定内容写入到文件中):

    OutputStreamWriter和BufferedWriter连用:

    3639065c0709de596dfbce2f1a5db738.png

    (4)过滤字符流:

    1)过滤流PrintWriter简介:

    PrintWriter是具有自动涮新缓冲的字符输出流。提供了比较丰富的构造方法,如下:

    PrintWriter(File file)

    PrintWriter(String fileName)

    PrintWriter(OutputStream out)

    PrintWriter(OutputStream out, boolean autoFlush)

    PrintWriter(Writer writer)

    PrintWriter(Writer writer, boolean autoFlush)

    其中参数为OutputStream与Writer的构造方法提供了一个可以传出boolean值参数,该参数用于表示PrintWriter是否具有自动刷新。

    2)过滤流PrintWriter的常用方法:

    print(String s)和println(String s)方法: PrintWriter提供了丰富的重载print与println方法。

    其中println方法在输出目标数据后自动输出一个系统支持的换行符。

    若该流是具有自动刷新的,那么每当通过println方法写出的内容都会被实际写出,而不是进行缓存。

    Write(String s):将字符串写入到文件中

    3)PrintWriter代码实例:

    4082f32e571a60105c5c64eea329f193.png

    展开全文
  • 的基本概念在java.io包中,File类是唯一一个与文件本身有关的程序处理类,但是File类只能操作文件本身,而不能操作文件内容,IO操作的核心意义在于输入输出操作.而对于程序而言,输入输出可能来自不同的环境:--通过...
  • 先来看一下流的概念:在程序中所有的数据都是以流的方式...字节流字符流在java.io包中操作文件内容的主要有两大类:字节流字符流,两类都分为输入输出操作。在字节流中输出数据主要是使用OutputStream完成,...
  • java中的io流分为两类,字符字节:OutputStreamInputStream字节流父类,抽象。OutputStream有两个提供了实现的接口closableflushable。WriterReader字符流父类,抽象。实际上在流的操作中,底层与文件...
  • 字节流和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作...
  • 转自:http://www.cnblogs.com/sjjsh/p/5269781.html先来看一下流的概念:在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的...字节流字符流在java.io包中操作文件内容的主要有两大类:字节流、...
  • 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如下图所示下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作...
  • 1.编写一个程序,分别使用字节流和字符流拷贝一个文本文件。 提示: 1)使用FileInputStream、FileOutputStreamFileReader、FileWriter分别进行拷贝 2)使用字节流拷贝时,定义一个1024长度的字节数组作为缓冲区,...
  • 文章目录IO流的分类:字节流和字符流的区别:详析InputStream子类:OutputStream子类:FilterInputStream子类:FilterOutputStream子类: IO流的分类: 根据处理数据类型的不同分为:字节流和字符流; 根据数据流向...
  • 字节流和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作...
  • 字节流和字符流对于文件必然有读写的操作,读写就对应了输入输出流,流又分成字节和字符流。1.从对文件的操作来讲,有读写的操作——也就是输入输出。2.从流的流向来讲,有输入输出之分。3.从流的内容来...
  • 字节输入:io包中的InputStream为所有字节输入父类。Int read();读入一个字节(每次一个);可先使用new byte[]=数组,调用read(byte[] b)read (byte[])返回值可以表示有效数;read (byte[])返回值为-1表示结束...
  • 字节流字符流 1.1 什么是IO 生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些...
  • 与OutputStream类对应的是资杰输入,InputStream主要是实现的就是字节数组读取。 public abstract class InputStream extends Object implements Closeable 在OutputStream里面定义有如下几个核心方法: ...
  • 1、File1)构造方法2)创建3)判断、获取4)删除2、字节流1)字节流写数据的3种方式FileOutputStream fos = new FileOutputStream("e:\\a.txx");//将字符转为字节Bytes[]bytes = "abcdefffjdlsajflasdfjklasdf".getBytes...
  • 流的分类:字节流10个+字符流 按照方向分:输入流 输出流 按照单位分:字节流 字符流 按照功能分:节点流 过滤流(包装流、处理流) 类: InputStream:所有字节输入流统一的父类,抽象类 int read() int read...
  • 在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。一个流,必有源端目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。...
  • 字节流和字符流

    2021-03-31 14:35:58
    今天,某位同事让我帮他找BUG,就是某个应届生,他的BUG很简单,没有关,导致文件删不掉 以下是吐槽他的话,请忽略,实在是提起这个人生气,不吐槽一下感觉心里堵得慌 说实话挺烦他的,不是因为他技术问题,...
  • Java字节流和字符流的区别 字节流: 字符流: 区分输入流输出流 Java字节流和字符流的区别 1.以Stream结尾的时字节流,ReaderWriter结尾都是字符流 2.InputStream是所有字节输入流的父类,OutputStream是...
  • 字节流和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作...
  • Java字节流和字符流,是时候总结一下IO流了

    千次阅读 多人点赞 2021-04-12 12:39:41
    字节流和字符流:为什么字符流需要 flush
  • 一般操作输入输出内容就需要字节流字符流,但是有些时候需要将字符流变为字节流的形式,或者将字节流变为字符流的形式,所以就需要另外一组转换流的操作类。转换步骤,如果以文件操作为例,在内存中的字符数据需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,810
精华内容 22,324
关键字:

字节流和字符流的父类