0
点赞
收藏
分享

微信扫一扫

IO流(二)[输入、输出流]

pipu 2022-04-26 阅读 42
java

目录

IO流的分类

字节流和字符流的区别

输入字节流 InputStream

输出字节流 OutputStream

输入字符流FileReader

 常用的节点流

 代码展示

总结


 

IO流的分类

  • 根据处理数据类型的不同分为:字符流和字节流
  • 根据数据流向不同分为:输入流和输出流

四大基流:

  1. 字节输出流OutPutStream
  2. 字节输入流InPutStream
  3. 字符输出流Writer
  4. 字符输入流Reader

四大基流都是抽象类: 其他流都是继承于这四大基流的
我们不能创建四大基流的对象,只能创建其子类对象

字节流和字符流的区别

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节
  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据
  • 字节流:一次读入或读出是8位二进制
  • 字符流:一次读入或读出是16位二进制

输入字节流 InputStream

  • InputStream 是所有的输入字节流的父类,它是一个抽象类
  • ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据
  • PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍
  • bjectInputStream 和所有FilterInputStream

输出字节流 OutputStream

  • OutputStream 是所有的输出字节流的父类,它是一个抽象类
  • ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据
  • PipedOutputStream 是向与其它线程共用的管道中写入数据
  • ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流
    总结
  • 输入流:InputStream或者Reader:从文件中读到程序中
  • 输出流:OutputStream或者Writer:从程序中输出到文件中

输入字符流FileReader

字符输入流的处理类为Reader。Reader类的定义结构如下:

public abstract class Reader implements Readable, Closeable

Reader也是一个抽象类,如果要进行文件的读取,也要用到它的间接子类FileReader

Reader中也提供了一些方法,读取文件内容:

public int read() throws IOException
public int read(char cbuf[]) throws IOException
abstract public int read(char cbuf[], int off, int len) throws IOException;

举例:使用Reader读取

public class TestStream {
    public static void main(String[] args) {
        String directory = "D:"+File.separator+"test1"+File.separator
                +"java"+File.separator+"hh.txt";
        //File和本地文件系统相关联
        File file = new File(directory);
        try (Reader reader = new FileReader(file);){
            char[] buff = new char[1024];
            int len = -1;
            while ((len = reader.read(buff))!= -1){
                System.out.println(new String(buff, 0, len));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 常用的节点流

  • 父 类 :InputStream 、OutputStream、 Reader、 Writer
  • 文 件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件进行处理的节点流
  • 数 组 :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
  • 字符串 :StringReader、 StringWriter 对字符串进行处理的节点流
  • 管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流

 代码展示

InputStream类是字节输入流的抽象类,是所有字节输入流的父类

字节流:(InputStream:)针对二进制文件:

 --InputStream 
 --FileInputStream
 --BufferedInputStream 
 --ObjectInputStream OutputStream
 --FileOutputStream
 --BufferedOutputStream
 --ObjectOutputStream

Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类 

字符流:针对文本文件,读写容易发生乱码现象,在读写时应指定编码集为UTF-8

-- Writer
-- BufferedWriter
-- OutputStreamWriter Reader
-- BufferedReader
-- InputStreamReader
-- PrintWriter/PrintStream

总结

  • 输入流:InputStream或者Reader:从文件中读到程序中;
  • 输出流:OutputStream或者Writer:从程序中输出到文件中;
  • 所有的字符都需要通过内存缓冲来进行处理。如果字符流不关闭,数据就有可能保存在缓存中并没有输出到目标源。这种情况下必须强制刷新。
  • 只有处理中文时会用到字符流,其他一般都使用字节流。
举报

相关推荐

0 条评论