InputStream、OutputStream、Reader、Writer

流的分类:都是站在程序代码的角度来辨别方向。
(1)按方向: 输入流/输出流,也称读流/写流,
(2)按处理数据方式:字节流/字符流,字节流以二进制方式进行数据传输,速度快(图片,英文),字符流是以字符为单位进行数据传输(中文)。
(3)按功能:节点流/处理流,节点流是对数据直传输,处理流会在数据传输过程中对数据进行二次处理后再传输。

IO所谓的四大抽象类就是:
InputStream、OutputStream、Reader、Writer
InputStream:
字节输入流的父类,数据单位为字节。

       常用方法:
                    int read();         从输入流中读取下一个字
                    void close();       关闭流

OutputStream:
字节输出流的父类,数据单位为字节。

    常用方法:
                    void write(int b);  将一个integer数组长度写入此流
                    void flush();       刷新此流
                    void close();       关闭该流并释放与之相关的所有资源

Reader:
字符输入流的父类,数据单位为字符。

     常用方法:
                   int read();                                             读取单个字符。
                   int read(char[] cbuf, int off , int len );              将字符读入数组的某一部分。                             
                   void close();                                           关闭该流并释放与之相关的所有资源

Writer: 字符输出流的父类,数据单位为字符。

      常用方法:
                   void writer();      创建一个字符流
                   void flush();       清空缓冲区的数据流
                   void close();       关闭字符流

注意:一般来说文本中含有中文用字符,流入与流出是一个相对概念。stream:字节

FileInputStream是InputStream的一个子类,以字节来读取文件。
FileInputStream的方法用代码表现

@Test
ublic void  fileInputStream() throws IOException {
        //File.separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
        String filePast = "D:" + File.separator + "javaTest" + File.separator + "newBuild";
        //插管,new FileInputStream这是一个是虚拟的,并没有已经创建了一个文件
        FileInputStream fis = new FileInputStream(filePast);
        //查看剩余总字节数
        System.out.println("总字节数"+fis.available());
        //用int b转成char b来接
        int b;
        //文件读完还回-1,这是源代码规定
        while ((b= fis.read())!=-1){
            System.out.print((char)b);
        }
        fis.close();
    }

注意:FileInputStream如果文件不存在,会还回异常,并不会重新创建一个文件

FileOutputStream是OutputStream的一个子类,以字节来读取文件

@Test
 public void fileOutputStream() throws IOException{
        //插管2根,一个指向原文件,一个要直线复制的新文件
        String filePast1 = "D:" + File.separator + "javaTest" + File.separator + "newBuild";
        String filePast2="D:" + File.separator + "javaTest" + File.separator + "build.text";
            FileInputStream fis = new FileInputStream(filePast1);
            //如果没有文件 FileInputStream会创建一个来
            FileOutputStream fio=new FileOutputStream(filePast2);
            int b;
            while ((b=fis.read())!=-1){
               fio.write(b);
            }
            //处除残留
            fio.flush();
            //关闭各种fio与fis流
            fio.close();
            fis.close();

    }

注意:FileOutStream如果文件不存在,不会还回异常,会重新创建一个文件
FileReader:
FileReader是Reader的一个子类,可以以字符形式读出指定文件夹。

 public void fileRead()throws IOException{
        //注意文件后缀
        //如果文件不存在FileReader建立一个新文件
        String filePath="D:" + File.separator + "javaTest" + File.separator + "build.text";
        FileReader file=new FileReader(filePath);
        //获取编码方式
        System.out.println(file.getEncoding());
        //注意文件编码
        int b;
        while ((b=file.read())!=-1){
        //还回值是-1
            System.out.print((char)b);
        }
    }

FileWriter:
FileWriter是Writer的一个子类,可以以字符形式给指定文件写入

  public void fileWriter() throws IOException {
        //没有文件会创建一个
        String filePath="D:"+ File.separator+"javaTest"+File.separator+"Unicode.dat";
        String myFilePath="D:"+ File.separator+"javaTest"+File.separator+"UnicodeTest.dat";
        FileWriter fileWriter=new FileWriter(filePath);
        FileWriter myFileWriter=new FileWriter(myFilePath);
        //在一个文件写入10个A
        for (int i=0;i<10;i++){
            myFileWriter.write("A");
        }
        int unicodeMaxLength=65525;
        for (int i=0;i<unicodeMaxLength;i++){
             fileWriter.write(i);
        }
        fileWriter.flush();
        myFileWriter.flush();
    }

注意:打印流是输出语句的底层结构,无需抛出异常且自带flush效果
BufferedReade:
缓冲字符输入流BufferedReade是Read的一个子类

public void bufferedReader()throws IOException{
        String filePath="D:" + File.separator + "javaTest" + File.separator + "build.text";
        BufferedReader br=new BufferedReader(new FileReader(filePath));
        String rs=null;
        while ((rs= br.readLine())!=null){
            System.out.println(rs);
        }

    }

注意:int read():从此输入流读取一个字节,如果读完还回-1;
String readLine():从此输入流读取一行数据,如果读完还回null;

  public static void main(String[] args) {
        //模拟控制台输出
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String rs = "";
        while (true) {
            try {
                if (!((rs = br.readLine()) != null)) {
                    System.out.println(">>" + rs);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

BufferedWriter
缓冲字符输出流BufferedWriter是Writer的一个子类

  public void bufferWrite() throws IOException {
        //没有文件会创建一个
        String filePast = "D:" + File.separator + "javaTest" + File.separator + "newBuild1";
        BufferedWriter bw = new BufferedWriter(new FileWriter(filePast));
        Random random = new Random();
        for (int i = 0; i < 100; i++) {
            bw.write("随机数:"+random.nextInt(100));
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值