展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Java之IO流原理及流的分类是什么

Java之IO流原理及流的分类是什么

IObit Uninstaller 15 Pro
IObit Uninstaller 15 Pro

IObit Uninstaller 是一款专为 Win 平台设计的软件卸载工具,卸载干净彻底。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

¥29
Windows 2026-08-22
正版软件 Windows Uninstaller 卸载清理工具
立即下载

一、概述I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。Java程序中,对于数据的输入/输出操作以“流(stream)”的方式进行。java.io包下提供了各种“流”类和接口,用以获取不种类的数据,并通过标准的方法输入或输出数据。二、流的分类1.概述按操作数据单位不同分为:字节流(8bit),

本文目录

    Java之IO流原理及流的分类是什么

    一、概述

    I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。

    • 输入input:读取外部数据(磁 盘、光盘等存储设备的数据)到程序(内存)中。

    • 输出output:将程序(内存)数据输出到磁盘、光盘等存储设 备中。

    Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。

    java.io包下提供了各种“流”类和接口,用以获取不种类的数据,并通过标准的方法输入或输出数据。

    Java之IO流原理及流的分类是什么

    二、流的分类

    1. 概述

    按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)

    按数据流的流向不同分为:输入流,输出流

    按流的角色的不同分为:节点流,处理流

    • 节点流:直接从数据源或目的地读写数据
      Java之IO流原理及流的分类是什么

    • 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
      Java之IO流原理及流的分类是什么

    Java的IO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的,由这4个类派生出来的子类名称都是以其父类名作为子类名后缀。

    (抽象基类)字节流字符流
    输入流InputStreamReader
    输出流OutputStreamWriter

    Java之IO流原理及流的分类是什么
    IO 流体系体系:
    Java之IO流原理及流的分类是什么

    2. InputStream

    概述

    典型实现:FileInputStream

    方法

    方法描述
    int read()从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
    int read(byte[] b)从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数。
    int read(byte[] b, int off,int len)将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。
    public void close() throws IOException关闭此输入流并释放与该流关联的所有系统资源

    典型实现类:FileInputStream

    代码演示:

    @Test
        public void testFileInputStream() {
            FileInputStream fis = null;
            try {
                //1. 造文件
                File file = new File("hello.txt");
    
                //2.造流
                fis = new FileInputStream(file);
    
                //3.读数据
                byte[] buffer = new byte[5];
                int len;//记录每次读取的字节的个数
                while((len = fis.read(buffer)) != -1){
    
                    String str = new String(buffer,0,len);
                    System.out.print(str);
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fis != null){
                    //4.关闭资源
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
        }

    3. Reader

    概述

    典型实现类:FileReader

    方法

    方法描述
    int read()读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回 -1
    int read(char[] cbuf)将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
    int read(char[] cbuf,int off,int len)将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
    public void close() throws IOException关闭此输入流并释放与该流关联的所有系统资源。

    典型实现类:FileReader

    @Test
        public void testFileReader(){
            FileReader fr = null;
            try {
                //1.实例化File类的对象,指明要操作的文件
                File file = new File("hello.txt");//相较于当前Module
                //2.提供具体的流
                fr = new FileReader(file);
    
                //3.数据的读入
                //read():返回读入的一个字符。如果达到文件末尾,返回-1
                //方式一://        int data = fr.read();//        while(data != -1){//            System.out.print((char)data);//            data = fr.read();//        }
    
                //方式二:语法上针对于方式一的修改
                int data;
                while((data = fr.read()) != -1){
                    System.out.print((char)data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //4.流的关闭操作//            try {//                if(fr != null)//                    fr.close();//            } catch (IOException e) {//                e.printStackTrace();//            }
                //或
                if(fr != null){
                    try {
                        fr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    
        //对read()操作升级:使用read的重载方法
        @Test
        public void testFileReader1()  {
            FileReader fr = null;
            try {
                //1.File类的实例化
                File file = new File("hello.txt");
    
                //2.FileReader流的实例化
                fr = new FileReader(file);
    
                //3.读入的操作
                //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
                char[] cbuf = new char[5];
                int len;
                while((len = fr.read(cbuf)) != -1){
                    //方式一:
                    //错误的写法//                for(int i = 0;i < cbuf.length;i++){//                    System.out.print(cbuf[i]);//                }
                    //正确的写法//                for(int i = 0;i < len;i++){//                    System.out.print(cbuf[i]);//                }
                    //方式二:
                    //错误的写法,对应着方式一的错误的写法//                String str = new String(cbuf);//                System.out.print(str);
                    //正确的写法
                    String str = new String(cbuf,0,len);
                    System.out.print(str);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fr != null){
                    //4.资源的关闭
                    try {
                        fr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
    
        }

    4. OutputStream

    概述

    典型实现:FileOutputStream

    方法

    方法描述
    void write(int b)将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。
    void write(byte[] b)将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。
    void write(byte[] b,int off,int len)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
    public void flush()throws IOException刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。
    public void close() throws IOException关闭此输出流并释放与该流关联的所有系统资源。

    主要实现类:FileInputOutputStream

    /*
        实现对图片的复制操作
         */
        @Test
        public void testFileInputOutputStream()  {
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                //
                File srcFile = new File("爱情与友情.jpg");
                File destFile = new File("爱情与友情2.jpg");
    
                //
                fis = new FileInputStream(srcFile);
                fos = new FileOutputStream(destFile);
    
                //复制的过程
                byte[] buffer = new byte[5];
                int len;
                while((len = fis.read(buffer)) != -1){
                    fos.write(buffer,0,len);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fos != null){
                    //
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis != null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
    
        }

    5. Writer

    概述

    典型实现:FileWriter

    方法

    方法描述
    void write(int c)写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即写入0 到 65535 之间的Unicode码。
    void write(char[] cbuf)写入字符数组。
    void write(char[] cbuf,int off,int len)写入字符数组的某一部分。从off开始,写入len个字符
    void write(String str)写入字符串。
    void write(String str,int off,int len)写入字符串的某一部分。
    void flush()刷新该流的缓冲,则立即将它们写入预期目标。
    public void close() throws IOException关闭此输出流并释放与该流关联的所有系统资源。

    主要实现类:FileWriter

    • 概述

    输出操作,对应的File可以不存在的。并不会报异常

    File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
    File对应的硬盘中的文件如果存在:

    • 如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖

    • 如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容

    • 代码演示

    //从内存中写出数据到硬盘的文件里。
        @Test
        public void testFileWriter() {
            FileWriter fw = null;
            try {
                //1.提供File类的对象,指明写出到的文件
                File file = new File("hello1.txt");
    
                //2.提供FileWriter的对象,用于数据的写出
                fw = new FileWriter(file,false);
    
                //3.写出的操作
                fw.write("I have a dream!\n");
                fw.write("you need to have a dream!");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //4.流资源的关闭
                if(fw != null){
    
                    try {
                        fw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    6. 练习:复制操作

    代码演示:

    • 实现对文本的复制操作

     @Test
        public void testFileReaderFileWriter() {
            FileReader fr = null;
            FileWriter fw = null;
            try {
                //1.创建File类的对象,指明读入和写出的文件
                File srcFile = new File("hello.txt");
                File destFile = new File("hello2.txt");
    
                //不能使用字符流来处理图片等字节数据//            File srcFile = new File("爱情与友情.jpg");//            File destFile = new File("爱情与友情1.jpg");
    
    
                //2.创建输入流和输出流的对象
                fr = new FileReader(srcFile);
                fw = new FileWriter(destFile);
    
    
                //3.数据的读入和写出操作
                char[] cbuf = new char[5];
                int len;//记录每次读入到cbuf数组中的字符的个数
                while((len = fr.read(cbuf)) != -1){
                    //每次写出len个字符
                    fw.write(cbuf,0,len);
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //4.关闭流资源
                //方式一://            try {//                if(fw != null)//                    fw.close();//            } catch (IOException e) {//                e.printStackTrace();//            }finally{//                try {//                    if(fr != null)//                        fr.close();//                } catch (IOException e) {//                    e.printStackTrace();//                }//            }
                //方式二:
                try {
                    if(fw != null)
                        fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                try {
                    if(fr != null)
                        fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }}
    • 实现对图片的复制操作

        @Test
        public void testFileInputOutputStream()  {
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                //
                File srcFile = new File("爱情与友情.jpg");
                File destFile = new File("爱情与友情2.jpg");
    
                //
                fis = new FileInputStream(srcFile);
                fos = new FileOutputStream(destFile);
    
                //复制的过程
                byte[] buffer = new byte[5];
                int len;
                while((len = fis.read(buffer)) != -1){
                    fos.write(buffer,0,len);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fos != null){
                    //
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis != null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
    
        }
    
        //指定路径下文件的复制
        public void copyFile(String srcPath,String destPath){
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                //
                File srcFile = new File(srcPath);
                File destFile = new File(destPath);
    
                //
                fis = new FileInputStream(srcFile);
                fos = new FileOutputStream(destFile);
    
                //复制的过程
                byte[] buffer = new byte[1024];
                int len;
                while((len = fis.read(buffer)) != -1){
                    fos.write(buffer,0,len);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fos != null){
                    //
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis != null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
    
    
        }
    
        @Test
        public void testCopyFile(){
    
            long start = System.currentTimeMillis();
    
            String srcPath = "C:\\Users\\Administrator\\Desktop\\01-视频.avi";
            String destPath = "C:\\Users\\Administrator\\Desktop\\02-视频.avi";//        String srcPath = "hello.txt";//        String destPath = "hello3.txt";
    
            copyFile(srcPath,destPath);
    
    
            long end = System.currentTimeMillis();
    
            System.out.println("复制操作花费的时间为:" + (end - start));//618
        }}

    三、节点流(或文件流)

    1. 概述

    定义文件路径时,注意:可以用“/”或者“\\”。

    在写入一个文件时,如果使用构造器FileOutputStream(file),则目录下有同名文 件将被覆盖。 如果使用构造器FileOutputStream(file,true),则目录下的同名文件不会被覆盖, 在文件内容末尾追加内容。

    在读取文件时,必须保证该文件已存在,否则报异常。

    字节流操作字节,比如:.mp3,.avi,.rmvb,.mp4,.jpg,.doc,.ppt

    字符流操作字符,只能操作普通文本文件。最常见的文本文件:txt,.java,.c,.cpp等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。

    2. 读取文件

    • 概述

    1.建立一个流对象,将已存在的一个文件加载进流。

    java FileReader fr = new FileReader(new File(“Test.txt”));

    2.创建一个临时存放数据的数组。

    java char[] ch = new char[1024];

    3.调用流对象的读取方法将流中的数据读入到数组中。

    java fr.read(ch);

    4.关闭资源。

    java fr.close();

    • 代码演示

    FileReader fr = null;try {fr = new FileReader(new File("c:\\test.txt"));char[] buf = new char[1024];int len;while ((len = fr.read(buf)) != -1) {System.out.print(new String(buf, 0, len));}} catch (IOException e) {System.out.println("read-Exception :" + e.getMessage());} finally {if (fr != null) {try {fr.close();} catch (IOException e) {System.out.println("close-Exception :" + e.getMessage());} } }

    3. 写入文件

    • 概述

    1.创建流对象,建立数据存放文件
    FileWriter fw = new FileWriter(new File(“Test.txt”));
    2.调用流对象的写入方法,将数据写入流
    fw.write(“atguigu-songhongkang”);
    3.关闭流资源,并将流中的数据清空到文件中。
    fw.close();

    • 代码演示

    FileWriter fw = null;try {fw = new FileWriter(new File("Test.txt"));fw.write("atguigu-songhongkang");} catch (IOException e) {e.printStackTrace();} finally {if (fw != null)try {fw.close();} catch (IOException e) {e.printStackTrace();} }

    四、缓冲流

    1. 概述

    为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。

    缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:

    • BufferedInputStream 和 BufferedOutputStream

    • BufferedReader 和BufferedWriter

    当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区

    当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。

    向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法 flush()可以强制将缓冲区的内容全部写入输出流
    Java之IO流原理及流的分类是什么

    关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也 会相应关闭内层节点流

    flush()方法的使用:手动将buffer中内容写入文件
    如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出

    2. 实现非文本文件的复制

        @Test
        public void BufferedStreamTest() throws FileNotFoundException {
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
    
            try {
                //1.造文件
                File srcFile = new File("爱情与友情.jpg");
                File destFile = new File("爱情与友情3.jpg");
                //2.造流
                //2.1 造节点流
                FileInputStream fis = new FileInputStream((srcFile));
                FileOutputStream fos = new FileOutputStream(destFile);
                //2.2 造缓冲流
                bis = new BufferedInputStream(fis);
                bos = new BufferedOutputStream(fos);
    
                //3.复制的细节:读取、写入
                byte[] buffer = new byte[10];
                int len;
                while((len = bis.read(buffer)) != -1){
                    bos.write(buffer,0,len);//                bos.flush();//刷新缓冲区
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //4.资源关闭
                //要求:先关闭外层的流,再关闭内层的流
                if(bos != null){
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
                if(bis != null){
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
                //说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.//        fos.close();//        fis.close();
            }
    
    
    
        }

    3. 实现文件复制

        @Test
        public void testCopyFileWithBuffered(){
            long start = System.currentTimeMillis();
    
            String srcPath = "C:\\Users\\Administrator\\Desktop\\01-视频.avi";
            String destPath = "C:\\Users\\Administrator\\Desktop\\03-视频.avi";
    
    
            copyFileWithBuffered(srcPath,destPath);
    
    
            long end = System.currentTimeMillis();
    
            System.out.println("复制操作花费的时间为:" + (end - start));//618 - 176
        }
    
     //实现文件复制的方法
        public void copyFileWithBuffered(String srcPath,String destPath){
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
    
            try {
                //1.造文件
                File srcFile = new File(srcPath);
                File destFile = new File(destPath);
                //2.造流
                //2.1 造节点流
                FileInputStream fis = new FileInputStream((srcFile));
                FileOutputStream fos = new FileOutputStream(destFile);
                //2.2 造缓冲流
                bis = new BufferedInputStream(fis);
                bos = new BufferedOutputStream(fos);
    
                //3.复制的细节:读取、写入
                byte[] buffer = new byte[1024];
                int len;
                while((len = bis.read(buffer)) != -1){
                    bos.write(buffer,0,len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //4.资源关闭
                //要求:先关闭外层的流,再关闭内层的流
                if(bos != null){
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
                if(bis != null){
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
                //说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.//        fos.close();//        fis.close();
            }
        }
    
     /*
        使用BufferedReader和BufferedWriter实现文本文件的复制
    
         */
        @Test
        public void testBufferedReaderBufferedWriter(){
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                //创建文件和相应的流
                br = new BufferedReader(new FileReader(new File("dbcp.txt")));
                bw = new BufferedWriter(new FileWriter(new File("dbcp1.txt")));
    
                //读写操作
                //方式一:使用char[]数组//            char[] cbuf = new char[1024];//            int len;//            while((len = br.read(cbuf)) != -1){//                bw.write(cbuf,0,len);//    //            bw.flush();//            }
    
                //方式二:使用String
                String data;
                while((data = br.readLine()) != null){
                    //方法一://                bw.write(data + "\n");//data中不包含换行符
                    //方法二:
                    bw.write(data);//data中不包含换行符
                    bw.newLine();//提供换行的操作
    
                }
    
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //关闭资源
                if(bw != null){
    
                    try {
                        bw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(br != null){
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
    
        }}

    五、 转换流

    1. 概述

    转换流提供了在字节流和字符流之间的转换

    Java API提供了两个转换流:

    1. InputStreamReader:将InputStream转换为Reader

    2. OutputStreamWriter:将Writer转换为OutputStream

    字节流中的数据都是字符时,转成字符流操作更高效。

    很多时候我们使用转换流来处理文件乱码问题。实现编码和 解码的功能。

    2. InputStreamReader

    概述

    • 实现将字节的输入流按指定字符集转换为字符的输入流。

    • 需要和InputStream“套接”。

    构造器


    public InputStreamReader(InputStream in)
    public InputSreamReader(InputStream in,String charsetName)

    3. OutputStreamWriter

    概述

    • 实现将字符的输出流按指定字符集转换为字节的输出流。

    • 需要和OutputStream“套接”。

    (2)构造器


    public OutputStreamWriter(OutputStream out)
    public OutputSreamWriter(OutputStream out,String charsetName)

    4. 代码演示

    代码演示1:

      @Test
        public void test1() throws IOException {
    
            FileInputStream fis = new FileInputStream("dbcp.txt");//        InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符集
            //参数2指明了字符集,具体使用哪个字符集,取决于文件dbcp.txt保存时使用的字符集
            InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//使用系统默认的字符集
    
            char[] cbuf = new char[20];
            int len;
            while((len = isr.read(cbuf)) != -1){
                String str = new String(cbuf,0,len);
                System.out.print(str);
            }
    
            isr.close();
    
        }

    代码演示2:

        @Test
        public void test2() throws Exception {
            //1.造文件、造流
            File file1 = new File("dbcp.txt");
            File file2 = new File("dbcp_gbk.txt");
    
            FileInputStream fis = new FileInputStream(file1);
            FileOutputStream fos = new FileOutputStream(file2);
    
            InputStreamReader isr = new InputStreamReader(fis,"utf-8");
            OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
    
            //2.读写过程
            char[] cbuf = new char[20];
            int len;
            while((len = isr.read(cbuf)) != -1){
                osw.write(cbuf,0,len);
            }
    
            //3.关闭资源
            isr.close();
            osw.close();
    
    
        }}

    六、标准输入、输出流

    1. 概述

    System.in和System.out分别代表了系统标准的输入和输出设备

    默认输入设备是:键盘,输出设备是:显示器

    System.in的类型是InputStream,System.out的类型是PrintStream,其是OutputStream的子类,FilterOutputStream 的子类

    重定向:通过System类的setIn,setOut方法对默认设备进行改变。

    1. public static void setIn(InputStream in)

    2. public static void setOut(PrintStream out)

    2. 代码演示

    /*
    从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续进行输入操作,
    直至当输入“e”或者“exit”时,退出程序。
     方法一:使用Scanner实现,调用next()返回一个字符串
     方法二:使用System.in实现。System.in  --->  转换流 ---> BufferedReader的readLine()
    
         */
        public static void main(String[] args) {
            BufferedReader br = null;
            try {
                InputStreamReader isr = new InputStreamReader(System.in);
                br = new BufferedReader(isr);
    
                while (true) {
                    System.out.println("请输入字符串:");
                    String data = br.readLine();
                    if ("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)) {
                        System.out.println("程序结束");
                        break;
                    }
    
                    String upperCase = data.toUpperCase();
                    System.out.println(upperCase);
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    七. 打印流

    1. 概述

    实现将基本数据类型的数据格式转化为字符串输出

    打印流:PrintStream和PrintWriter

    提供了一系列重载的print()和println()方法,用于多种数据类型的输出

    PrintStream和PrintWriter的输出不会抛出IOException异常

    PrintStream和PrintWriter有自动flush功能

    PrintStream打印的所有字符都使用平台的默认字符编码转换为字节。 在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。

    System.out返回的是PrintStream的实例

    2. 代码演示

     /*
        2. 打印流:PrintStream 和PrintWriter
    
        2.1 提供了一系列重载的print() 和 println()
        2.2 练习:
    
    
    
         */
    
        @Test
        public void test2() {
            PrintStream ps = null;
            try {
                FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt"));
                // 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)
                ps = new PrintStream(fos, true);
                if (ps != null) {// 把标准输出流(控制台输出)改成文件
                    System.setOut(ps);
                }
    
    
                for (int i = 0; i <= 255; i++) { // 输出ASCII字符
                    System.out.print((char) i);
                    if (i % 50 == 0) { // 每50个数据一行
                        System.out.println(); // 换行
                    }
                }
    
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                if (ps != null) {
                    ps.close();
                }
            }
    
        }

    八、数据流

    为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。

    数据流有两个类:(用于读取和写出基本数据类型、String类的数据)

    1. DataInputStream

    2. DataOutputStream

    分别“套接”在 InputStream 和 OutputStream 子类的流上

    DataInputStream中的方法:


    boolean readBoolean()
    byte readByte() char
    readChar()
    float readFloat()
    double readDouble()
    long readLong()
    int readInt()
    short readShort()
    String readUTF()
    void readFully(byte[] b)

    补充:DataOutputStream中的方法:将上述的方法的read改为相应的write即可

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java io
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    Beamer 4 macOS版
    Beamer 4 macOS版

    Beamer 4是面向macOS的本地视频投屏工具,可将Mac中的影片投放到Apple TV、Chromecast及兼容设备,支持常见格式、多类字幕、环绕声、播放列表和电视遥控操作。

    Boom 3D macOS版
    Boom 3D macOS版

    Boom 3D macOS版是一款系统级音效增强工具,可为音乐、电影、游戏和流媒体提供3D虚拟环绕声、31段均衡器、音量增强及应用独立音量控制,并支持本地播放器与多种音频输出设备。

    Boris FX macOS版
    Boris FX macOS版

    Boris FX macOS版是一套面向剪辑、合成、调色及动态图形工作的专业后期工具,涵盖视觉特效、平面与三维跟踪、转描、画面修复、粒子动画和音频清理,可配合多种主流宿主软件使用。

    Capto macOS版
    Capto macOS版

    Capto 是面向 macOS 的屏幕截图、高清录屏与媒体编辑工具,支持区域及整屏捕获、网页长截图、双音轨处理、图片和视频标注、素材分类与多渠道分享,适合教师、学生、内容创作者及需要制作演示教程的用户。

    ChemDraw macOS版
    ChemDraw macOS版

    ChemDraw macOS版是一款面向化学学习、科研和制药工作的专业结构绘图工具,可创建分子、反应及生物聚合物图形,并提供结构整理、格式转换和科研成果展示能力。

    Cursor Crane macOS版
    Cursor Crane macOS版

    Cursor Crane 是一款仅面向 macOS 的键盘操控效率工具,可通过提示标签、网格、文字查找和窗口模式完成点击、滚动、定位与切换,并支持屏幕内容提取、脚本及工作流扩展。

    Deep Freeze 冰点还原 macOS版
    Deep Freeze 冰点还原 macOS版

    Deep Freeze 冰点还原 macOS版通过冻结系统配置,让受保护的Mac在重新启动后回到预设状态,并提供解冻空间、维护计划、密码保护及Apple Remote Desktop管理能力。

    Focusky macOS版
    Focusky macOS版

    Focusky macOS版是一款面向教学课件、商务汇报、产品展示和动画宣传内容的演示制作工具。它通过无限画布、路径编排、缩放旋转转场及多媒体编辑,将传统逐页幻灯片转化为更具空间感的动态演示。

    Folder Colorizer 2 macOS版
    Folder Colorizer 2 macOS版

    Folder Colorizer 2 macOS版是一款直观的文件夹外观定制工具,可更换颜色,添加表情、贴纸及图片背景,并支持批量处理、智能推荐和恢复默认样式,帮助用户更快辨认工作、学习与生活资料。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。

    AlwaysUp Windows版
    AlwaysUp Windows版

    AlwaysUp是一款面向Windows的系统服务注册与程序托管工具,可让普通应用、脚本及批处理在无人登录时随系统启动,并通过状态检测、异常重启、资源监控和邮件通知保障关键任务持续运行。

    AnyDesk Windows版
    AnyDesk Windows版

    AnyDesk Windows版是一款轻量化远程桌面与技术支持工具,可用于控制异地电脑、传输文件、远程打印及无人值守访问。它兼顾连接响应、安全权限和部署灵活性,适合个人远程办公、企业设备维护与客服支持。

    Boom 3D Windows版
    Boom 3D Windows版

    Boom 3D Windows版是一款面向音乐、电影和游戏场景的系统级音效增强工具,支持虚拟3D环绕声、31段均衡器、预设音效、应用音量控制及本地音乐播放,可配合耳机、扬声器和蓝牙耳机使用。

    Boris FX Windows版
    Boris FX Windows版

    Boris FX Windows版是一套服务于影视剪辑、视觉特效、运动跟踪、转描、图像修饰及音频修复的专业创作工具集合,可作为插件接入多种主流后期宿主,也包含可独立运行的应用,适合剪辑师、特效师与内容创作者使用。

    ChemDraw Windows版
    ChemDraw Windows版

    ChemDraw Windows版是一款面向化学研究、药物研发、材料科学和教学工作的专业结构绘图工具,可快速绘制分子、反应式及生物聚合物,并提供结构整理、格式转换、性质计算和科研文档协作能力。

    CODESOFT Windows版
    CODESOFT Windows版

    CODESOFT Windows版是一套企业级条码与RFID标签设计打印工具,可连接Excel、Access、SQL及云端数据源,支持变量、表单、GS1条码、数据库记录和多种工业打印机,适合制造、仓储、物流及合规标识场景。

    Deep Freeze 冰点还原 Windows版
    Deep Freeze 冰点还原 Windows版

    Deep Freeze 冰点还原 Windows版通过重启恢复技术保护系统盘及指定分区,自动撤销恶意程序、误操作和配置漂移造成的改动,并支持密码保护、解冻空间与多硬盘管理,适合学校机房、公共电脑、办公终端及家庭电脑使用。

    EDIUS Windows版
    EDIUS Windows版

    EDIUS 11 Windows版是一款面向影视制作、广播电视、纪录片、短视频及教育机构的专业非线性编辑工具,支持4K/8K、多格式混编、HDR调色、字幕、音频处理和后台渲染,并提供素材管理及丰富的导出预设。

    FastStone Capture Windows版
    FastStone Capture Windows版

    FastStone Capture Windows版是一款轻量级屏幕捕捉、录屏与图像编辑工具,可截取窗口、区域、菜单和滚动页面,并提供标注、模糊、取色、OCR、录音录像及多格式导出能力,适合办公说明、教程制作和问题反馈。

    Focusky Windows版
    Focusky Windows版

    Focusky Windows版是一款动画演示与交互课件制作工具,通过无限画布、缩放旋转镜头、模板素材和对象动画组织内容,可导入PPTX,并输出视频、EXE、PDF、网页等格式,适用于课堂教学、微课、商务汇报及产品展示。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?