首页 > 其他分享 >IO流

IO流

时间:2024-09-06 15:55:20浏览次数:9  
标签:字节 File IO close new null os

什么是IO流
IO:(input output stream):输入输出流。 针对文件中的内容进行的操作。读取文件中的内容和向文件中写入内容。
IO的分类

  1. 按照方向: 输入流和输出流
  2. 按照内容:字节流和字符流。
  3. 按照处理:处理流和节点流
    常见流类有那些

    字节输出流。
    OutputStream它是所有字节输出流类的父类,而且它是一个抽象类,这里的实现使用比较多的是FileOutputStream. 所以后期如果想使用OutputStream流中功能,那么我们必须创建该抽象类的子类对象。
    官网描述:
    public abstract class OutputStream
    extends Object
    implements Closeable, Flushable
    这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。
    需要定义OutputStream子类的应用OutputStream必须至少提供一个写入一个字节输出的方法。
    创建OutputStream流的对象
    @Test
    public void test01() {//字节输出流
        OutputStream os = null;
        try {
            //如果知道的文件名不存在,则自动创建。如果存在则不创建
            File file = new File("a.txt");
            //该流作用在的文件对象。  是否允许追加内容到文件中
            os = new FileOutputStream(file, true);//多态,第二个参数添是否追加,默认为覆盖
            String str = "想睡觉!!!";
            os.write(str.getBytes());//把知道的字节数组写入到文件中。 str.getBytes():把字符串转换为字节数组
        } catch (Exception o) {
            o.printStackTrace();
        } finally {
            try {
                if (!(os == null))
                    os.close();//关闭资源
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

字节输入流
InputStream它是字节输入流的父类,它也是一个抽象类,她下面的子类有FileInputStream.
官网描述:
public abstract class InputStream
extends Object
implements Closeable
这个抽象类是表示输入字节流的所有类的超类。
需要定义InputStream子类的应用InputStream必须始终提供一种返回输入的下一个字节的方法。

  @Test
    public void test02() throws IOException {//字节输入流。
        InputStream is= null;//字节输入流对象: 作用 读取文件中的内容到程序端。
        try {
            File file=new File("a.txt");
            is = new FileInputStream(file);
            //InputStream流类中read方法。
            int c;
            while ((c=is.read())!=-1){//is.read()读取文件中内容,每次读取一个字节,把读取的内容返回。如果结尾返回-1
                char ch=(char) c;
                System.out.print(ch);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            is.close();
        }
    }

上述字节输入输出的综合案例
把某个目录下的文件复制到另一个目录下。

    @Test
        public void test03() throws IOException {//综合案例
            OutputStream os= null;
            InputStream is= null;
            try {
                os = new FileOutputStream(new File("c.txt"));
                is = new FileInputStream(new File("a.txt"));
                int c;
                while ((c=is.read())!=-1){
                    os.write(c);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                os.close();
                is.close();
            }
        }

适合读取字节类型的文件:比如视频 音频 图片 等。
字符输出流
每次读取的单位是一个字符。Writer它是所有字符输出流的父类,它也是一个抽象类。它的子类常见的有FileWriter
官网描述
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。

 @Test
        public void test04() throws IOException {//字符输出流
            Writer w= null;//创建一个字符输出流对象。 参数:往哪个文件中写入字符内容。
            try {
                w = new FileWriter(new File("c.txt"));
                w.write("hello");//把hello写入到c.txt中。
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                w.close();//关闭资源 必须关闭。
            }
        }

字符输入流
它操作流的单位为字符, Reader这个它是所有字符输入流的父类,它也是一个抽象类,它的常用子类FileReader
官网描述
public abstract class Reader
extends Object
implements Readable, Closeable用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。

 @Test
        public void test05() throws IOException {
            Reader r= null;
            try {
                r = new FileReader(new File("c.txt"));//创建一个字符输入流对象, 参数:读取哪个文件中内容。

                int c;
                while ((c=r.read())!=-1){//返回读取到的一个字符。如果返回为-1 表示到尾部。
                    System.out.print((char) c);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                r.close();
            }
        }

上述字符输入输出的综合案例
完成文件的复制功能。

    @Test
        public void test06() throws IOException {
            Reader r= null;//字符输入流
            Writer w= null; //字符输出流
            try {
                r = new FileReader(new File("c.txt"));
                w = new FileWriter(new File("a.txt"));
                int c;
                while ((c=r.read())!=-1){
                    w.write(c);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                r.close();
                w.close();//后者先关
            }
        }

适合读取文本内容,不是字节类型的【视频 音频 图片 压缩文件等】。
字节输出缓存流
提高字节输出流的效率。BufferedOutputStream它是字节输出缓存流对象,它的作用在字节输出流上。
官网描述
public class BufferedOutputStream
extends FilterOutputStream该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。

        @Test
        public void test07() throws IOException {
            OutputStream os= null;
            BufferedOutputStream bos= null;
            try {
                os = new FileOutputStream(new File("a.txt"));
                bos = new BufferedOutputStream(os);//缓存流:作用在节点流上。理解为对节点流做了一层包装
                os.write("zhangsan".getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                bos.close();
                os.close();//必须先关缓存流
            }
        }

字节输入缓存流
提高字节输入流的效率,作用在字节输入流对象上。BufferedInputStream它是字节输入缓存流对象
官网描述
public class BufferedInputStream
extends FilterInputStreamA BufferedInputStream为另一个输入流添加了功能,即缓冲输入和支持mark和reset方法的功能。 当创建BufferedInputStream时,将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。 mark操作会记住输入流中的一点,并且reset操作会导致从最近的mark操作之后读取的所有字节在从包含的输入流中取出新的字节之前重新读取。

        @Test
        public void test08() throws IOException {
            InputStream is= null;
            BufferedInputStream bis=null;
            try {
                is = new FileInputStream(new File("a.txt"));
                bis= new BufferedInputStream(is);
                int c;
                while ((c=bis.read())!=-1){
                    char ch=(char) c;
                    System.out.print(ch);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                bis.close();
                is.close();
            }
        }

字节输入输出缓存流的综合案例

    @Test
        public void test09() throws IOException {
            InputStream is= null;
            BufferedInputStream bis= null;
            OutputStream os= null;
            BufferedOutputStream bos= null;
            try {
                is = new FileInputStream(new File("D:\\project\\day07\\src\\lx01.java"));
                bis = new BufferedInputStream(is);
                os = new FileOutputStream(new File("D:\\java\\java\\la.java"));
                bos = new BufferedOutputStream(os);
                int c;
                while ((c=bis.read())!=-1){
                    bos.write((char)c);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                bos.close();
                os.close();
                bis.close();
                is.close();
            }

        }

缓存流比对普通流的效率
缓存流可以提高效率。

@Test
    public void test09(){
        long start = System.currentTimeMillis();
        InputStream is= null;
        BufferedInputStream bis= null;
        OutputStream os= null;
        BufferedOutputStream bos= null;

        try {
            //字节缓存输入流
            File file = new File("D:\\rabbitmq视频\\13.rabbit工作模式-路由模式.mp4");
            is = new FileInputStream(file);
            bis = new BufferedInputStream(is);
            //创建字节缓存输出流
            File file1=new File("D:\\qy174.mp4");
            os = new FileOutputStream(file1);
            bos = new BufferedOutputStream(os);

            int c;
            while ((c=bis.read())!=-1){
                bos.write(c);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                bos.close();
                bis.close();
                os.close();
                is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }


        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start));
    }
    //1333
    //204689
    @Test
    public void test03() {
        long start = System.currentTimeMillis();
        InputStream is = null;
        OutputStream os = null;
        try {
            //输入流
            File file = new File("D:\\rabbitmq视频\\13.rabbit工作模式-路由模式.mp4");
            is = new FileInputStream(file);
            //输出流
            File file2 = new File("D:\\qy178.mp4");
            os = new FileOutputStream(file2);
            int c;
            while ((c = is.read()) != -1) {
                os.write(c);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                is.close();
                os.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start));

    }

对象流
该流用来操作Java中的类对象的。把创建的java类对象以字节码的形式保存到文件中,或从文件中把字节码的对象读取到java内存中。

把内存中的java对象写入到磁盘文件|网盘的过程---序列化

把磁盘文件中的对象读取到java内存的过程--反序列化。
如何使用序列化
使用ObjectOutputStream对象字节输出流。调用writeObject(o);

标签:字节,File,IO,close,new,null,os
From: https://www.cnblogs.com/xiaomubupi/p/18400386

相关文章

  • 【Java】【SpringBoot】读取配置文件(appliation.yml)的值
    这里叙述4中读取配置文件(application.yml)方法  application.yml配置如下:#测试数据(用于读取数据文件值)student:name:lisiage:13name:zhangsan使用@value注解@SpringBootTestpublicclassApplicationTest{@Value("${student.name}")privateStr......
  • AI绘画Stable Diffusion常用插件合集
    宝子们,早上好啊~StableDiffusion常用插件,已经给大家整理好了,自取就好。拥有这些SD常用插件,让您的图像生成和编辑过程更加强大、直观、多样化。以下插件集成了一系列增强功能,覆盖从自动补全提示词到高分辨率图像放大,从双语界面到无边图像浏览,为用户提供了无缝的StableDif......
  • CF1469D Ceil Divisions题解
    CF1469DCeilDivisions感觉是很巧妙的一题?一开始想到,对于任何小于$n$的数$x$,直接对它除以$n$可以得到$1$。那么对$3\simn-1$做完此操作后,还剩下$1$、$2$、$n$。将$n$变成$1$要花费$logn$次,显然总操作次数超过了$n+5$次。进一步地,发现瓶颈在于把$n$变成$1$,于是利用根号,用$\sqr......
  • STM32学习笔记——GPIO
    GPIO——GeneralPurposeInputOutput——通用输入输出出口特点:通用性、快速翻转、中断支持、支持多种工作模式。8种输入输出模式模式性质特征应用标识浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定适用于需要读取外部信号的场景,但外部信号状态......
  • axios使用 && axios拦截器
    1.安装npminstallaxios2.使用_axios.post("/api/auth/",form.value).then((res)=>{if(res.data.code===0){//{id:1,name:username.value,token:"xxx88sdkweisdfsd"}store.doLogin(res.data.data)ro......
  • 【AI绘画】Stable Diffusion 喂饭教程来啦!价值上万的模特AI换装方法
    大家好,我是爱绘画的彤姐。在电商领域,最近AI模特换装特别火,结合网上的教程和实战,总结了一个最简单性价比最高的方法。今天我们就一起学起来!!一思路整体的思路其实很简单,分为三步:获取模特服饰的蒙版获取模特的姿势特征图通过图生图局部重绘(上传蒙版)出图在整个过程......
  • IntelliJ IDEA 2024.1.6 (Ultimate Edition)中配置Java Web应用程序
    1. 前期准备工作已经下载安装了JDK(https://www.oracle.com/cn/java/technologies/javase/javase8u211-later-archive-downloads.html)和Tomcat(https://tomcat.apache.org/),并配置了环境变量(安装版的JDK和Tomcat不需要配置环境变量),注意JDK和Tomcat的版本号要相互适应。去官网下......
  • Java什么情况下会Broken pipe java.io.ioexception broken pipe
    最近项目上出现了java.io.IOException:Brokenpipe问题,后边,又出现了org.apache.catalina.connector.ClientAbortException:java.io.IOException:Connectionresetbypeer问题,其实,找到原因后,都是一个问题引起的。错误信息前端浏览器/小程序接口返回报错信息:net::ERR_INCOMPLETE_......
  • #如何解决Tomcat中的应用java.io.IOException您的主机中的一个软件中止了一个已建立的
    错误描述其实就是因为各种原因(比如你调试打的断点,网速等原因导致连接时间超过了默认设置的超时时间tomcat就将该连接断开)org.apache.catalina.connector.ClientAbortException:java.io.IOException:您的主机中的软件中止了一个已建立的连接。1在tomcat出现这个错误是由于客户端......
  • Java中如何实现minio文件上传
    一、导入minio依赖这里还要导入lombok是因为在MinIOConfig类中使用了@Data注解,正常来说导入minio依赖就够了<dependency>   <groupId>io.minio</groupId>   <artifactId>minio</artifactId>   <version>7.1.0</version> </dependency><dependency......