第十四章 I/O系统

news2024/10/4 10:36:39

一、I/O系统的分类

1.输入流:程序从输入流读取数据

   输出流:程序向输出流写入数据

2.字节流:数据流中的最小的数据单元是字节

   字符流:数据流中的最小单元是字符

3.节点流、处理流

二、I/O系统的四个抽象类

1.Java中提供的流类型在包java.io内,分别继承自四个抽象类

2.I/O系统的四个抽象类

字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

如果是多媒体文件我们使用字节流,因为字符流会破坏对媒体文件,而word文档这种文件还是主要使用的是字符流,因为中文不乱码

public class FileInputStreamTest {
    public static void main(String[] args)  {
        //我们使用的是字节流,而一个汉字等于一个字符,一个字符等于两个字节,而读取输出的时候会将
        //汉字拆开,所以控制台显示的时候时中文乱码,而往文件中写入的时候,由于文件不会打开,所以会将汉字的
        //两个字节组合为汉字,所以文件中中文不会乱码
        //文件输入字节流
        FileInputStream fis = null;
        //文件输出字节流
        FileOutputStream fos = null;
        try{//相对路径是从src开始的
            fis = new FileInputStream
                    ("src/com/haina365/lesson18/9..jpg");
            // ("src/main/java/com/haina365/lesson18/FileStreamTest.java");
            //如果输出的文件已经存在则直接写入,如果不存在,则新建文件在保存内容中
            fos = new FileOutputStream
                    ("src/com/haina365/lesson18/9.jpg");
            //   ("src/com/haina365/lesson18/text.txt");
            int a = 0;
            //read读取文件中的数据,都是大于0的数,当返回结构为-1时,表示读取结束
            while((a = fis.read()) != -1){
                fos.write(a);//将内存中的数据写入到文件
                System.out.print((char) a);
            }
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class FileReaderTest {
    public static void main(String[] args) {
        //文件输入字符流
        FileReader fr = null;
        //文件输入字符流
        FileWriter fw = null;
        try{
            fr = new FileReader
                    ("src/com/haina365/lesson18/9.jpg");
            //("src/main/java/com/haina365/lesson18/FileStreamTest.java");
            fw = new FileWriter
                    ("src/com/haina365/lesson18/1..jpg");
            // ("src/com/haina365/lesson18/demo.txt");
            int a = 0;
            while((a = fr.read()) != -1){
                fw.write(a);
                System.out.print((char)a);
            }
            fw.flush();//保存

        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

三、节点流

节点流分类:

类型字节流字符流
文件

FileInputStream

FileOutputStream

FileReader

FileWriter

数组

ByteArrayInputStream

ByteArrayOutputStream

CharArrayReader

CharArrayWriter

字符串

StringReader

StringWriter

管道

PipedInputStream

PipedOutputStream

PipedReader

PipedWriter

四、文件流

1.FileInputStream类:从文件系统中的某个文件中获得输入字节

常用方法:

(1)int read()

(2)long skip(long n)

(3)void close()

2.FileOutputStream类:用于将数据写入文件的输出流

常用方法:

(1)void write(int b)

(2)void close()

3.FileReader类与FileWriter类为增加其它方法

五、装饰器模式

1.目的:解决过度依赖继承,难以用创建类的方式来进行对象的功能扩展的问题

2.实现方式:用对象数量换类的数量

3.应用场景:

(1)扩展一个类的功能,给一个类增加附加责任

(2)不单一依赖继承,增加由一些基本的排列组合产生大量的功能(需要创建很多功能类)

(3)对目标进行选择扩展,动态增加功能且可以动态撤销

4.优点:虽然装饰模式产生的初衷是装饰器类对默认目标实现类的行为扩展,装饰器类却并不对默认目标实现类形成依赖

5.缺点:增加了对象

(1)共同的父类(接口),导致创建的对象类似,给查错带来困难

(2)对象的创建增加了空间的开销

六、处理流

处理流分类

类型字节流字符流
过滤器(装饰器)

FileInputStream

FileOutputStream

FileReader(抽象类)

FileWriter(抽象类)

缓冲流

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

转换流

InputStreamReader

OutputStreamReader

数据流

DataInputStream

DataOutputStream

对象流

ObjectInputStream

ObjectOutputStream

打印流PrintStreamPrintWriter

七、缓冲流

1.BufferedInputStream类:创建一个内部缓冲区数组,默认为defaultBufferSize=8192相当于8k

(1)套接InputStream类型流

(2)常用方法:

               void mark(int readlimit)

               void reset()

2.BufferedOutputStream类:实现缓冲的输出流,应用程序就可以一次将多个字节写入文件系统

(1)套接OutputStream类型流

(2)常用方法: 

                 void flush()

3.BufferedReader类

套接Reader类型流,常用方法同BufferedInputStream类

String readLine()

4.BufferedWriter类

套接Writer类型流,常用方法同BufferedOutputStream类

void newLine()

public class BufferedInputStreamTest {
    //处理流要想正常必须要有节点流,因为节点流是真正具有输入输出功能的流,而
    //处理流只能增强输入输出功能,但是没有输入输出功能
    public static void main(String[] args) {
        //文件输入字节流
        FileInputStream fis = null;
        //缓冲输入字节流
        BufferedInputStream bis = null;
        //输入转换流
        InputStreamReader isr = null;
        //文件输入字节流
        FileOutputStream fos =null;
        //文件输出字节流
        BufferedOutputStream bos = null;
        //输出转换流
        OutputStreamWriter osw = null;
        try{
            fis = new FileInputStream
                    ("src/com/haina365/lesson19/BufferedInputStreamTest.java");
            //缓冲区底层是一个数组,大小为8k
            bis = new BufferedInputStream(fis);
            //处理流在使用的时候,谁先用谁后用没有顺序,可以随意使用
            //gbk utf-8 gb2312支持中文的编码集
            isr = new InputStreamReader(bis,"gbk");
            //在输出流的第二个参数上写true,就修改保存文档中的形式由覆盖变成了追加
            fos = new FileOutputStream("src/com/haina365/lesson19/text.txt",true);
            bos = new BufferedOutputStream(fos);
            osw = new OutputStreamWriter(bos,"gbk");
            int a =0;
            //注意有处理流后,用什么方式读数据,就用什么方式写数据
            while((a = isr.read()) != -1){
                osw.write(a);
                System.out.print((char)a);
            }
            osw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

八、转换流

1.InputStreamReader类:它使用指定的字符集读取字节并将其解码为字符

套接InputStream类型流

2.OutputStreamReader类:可使用指定的字符集将要写入流中的字符编码

套接OutputStream类型流

3.常用方法:String getEncoding()

九、数据流

1.DataInputStream类:允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型

(1)套接InputStream类型流

(2)常用方法:数据类型 read数据类型()

2.DataOutputStream类:应用程序以适当方式将基本Java数据类型写入输出流中

(1)套接OutputStream类型流

(2)常用方法:数据类型 write数据类型()

十、打印流

1.打印流:属于输出流,方便地打印各种数据值的表示形式

(1)提供了print()、println()方法的多种重载形式

(2)不会抛出异常,用户通过检测错误状态获取错误信息

(3)有自动刷新功能,自动调用flush()方法

(4)套接OutputStream类型流

2.PrintStream类:针对字节操作的输出流

打印字符时适用平台默认字符编码

3.PrintWriter类:针对字符操作的输出流

十一、对象流

1.java.io.Serializable接口:实现此接口启用其序列化功能

2.transient关键字:用此关键字修饰的成员变量不被序列化

3.ObjectInputStream类:可以为应用程序提供对对象图形的持久存储,对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化

(1)套接InputStream类型流

(2)常用方法:

              int available()

              int skipBytes(int len)

public class ObjectInputStreamTest {
    public static void main(String[] args) {
        FileInputStream fis = null;//文件输入流
        ObjectInputStream ois = null;//文件输出流
        try {
            fis = new FileInputStream("src/com/haina365/lesson19/Student.txt");
            ois = new ObjectInputStream(fis);
            //读取文件中的对象,一次获取一个对象,同时读取到的对象都是Object类型的
            Student s1 = (Student) ois.readObject();
            System.out.println(s1);
            Student s2 = (Student) ois.readObject();
            System.out.println(s2);
            Student s3 = (Student) ois.readObject();
            System.out.println(s3);
            Student s4 = (Student) ois.readObject();
            System.out.println(s4);
            //以EOFEException异常作为文件读取结束的标志
        } catch (EOFException e) {
            System.out.println("文件读取结束");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                //先关闭最外层的处理流再关里面的节点流
                if (ois != null) {
                    ois.close();
                }
                //如果代码中既有输入流还有输出流,那么关闭的时候输入输出流谁先可以谁会都可以
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }
    }
}

4.ObjectOutputStream类:将Java对象的基本数据类型和图形写入OutputStream,只能将支持java.io.Serializable接口的对象写入流中

套接OutputStream类型流

public class ObjectOutputStreamTest {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream
                    ("src/com/haina365/lesson19/Student.txt");
            oos = new ObjectOutputStream(fos);
            Student s1 = new Student(1001,"张三",18);
            Student s2 = new Student(1001,"张三",18);
            Student s3 = new Student(1001,"张三",18);
            oos.writeObject(s1);//往文件中写入对象的写法
            oos.writeObject(s2);
            oos.writeObject(s3);
        }catch (FileNotFoundException e){
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.使用对象流要先开启对象的序列化功能,开启方式是类实现序列化接口(Serializable)
瞬时状态:保存在内存中的数据,其状态为瞬时状态
持久状态:保存在硬盘中的数据,其状态为持久状态
序列化:数据有瞬时状态变成持久状态就是序列化
反序列化:数据由持久化状态变为瞬时状态就是反序列化。

public class Student implements Serializable {
    private int no;
    private String name;
    private int age;
    public Student(int no,String name,int age){
        this.no = no;
        this.name = name;
        this.age = age;

    }

    @Override
    public String toString() {
        return "Student{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB - 机械臂手眼标定(眼在手外) - 估算固定相机相对于机器人基座的姿态

系列文章目录 前言 在拾取和放置任务中,例如垃圾桶拾取,通常会在环境中的固定位置安装摄像头,以便机器人操纵器检测工作区中的物体。基本感知管道使用该摄像头来估计目标物体相对于摄像头坐标系的姿态。然后将该姿态转换到机器人的基准坐标系…

360浏览器时不时打不开csdn

从百度或者csdn的搜索中打开,会发现打不开网页,以前也出现过,只是以为这篇文章被删了,昨天接连多个文章打不开,怀疑的浏览器的问题,复制网址到edge浏览器就打开了 刚刚又出现了,怀疑360会拦截某…

探索TOGAF理论的实践应用:企业数字化转型的深度指南

数字化转型的迫切性与路径选择 随着全球化进程和技术革命的加速,企业正面临前所未有的挑战和机遇。数字化转型已成为企业保持竞争力、创新业务模式、优化客户体验的核心手段。然而,企业在实施数字化转型时,往往面临路径不清、技术与业务脱节…

高性能防静电主轴4033 AC-ESD 在线路板切割中的非凡表现

随着电子产品的日益小型化/集成化,线路板的制造也面临着更高的挑战。线路板分板作为电子制造流程中的关键环节,其效率和精度直接影响到最终产品的质量和市场竞争力。因此专用的高性能防静电主轴SycoTec 4033 AC-ESD凭借其卓越的性能,成为众多…

多系统萎缩患者必知的营养补充指南

亲爱的朋友们,今天我们要聊的是一个较为少见但影响深远的疾病——多系统萎缩(Multiple System Atrophy, MSA)。这是一种成年期发病的神经系统退行性疾病,给患者的日常生活带来了诸多不便。但别担心,通过合理的营养补充…

JAVA开源项目 旅游管理系统 计算机毕业设计

本文项目编号 T 063 ,文末自助获取源码 \color{red}{T063,文末自助获取源码} T063,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

QGIS中怎么裁剪与掩膜提取

最近,我接到了一个关于QGIS中矢量与栅格与栅格数据怎么裁剪与掩膜提取到自己想要区域的咨询。 其实这个操作,与arcgis中的操作其实是类似的 下面是我对这个问题的解决思路: 首先得把栅格与矢量数据加载进去,如下图:…

基于SSM的农家乐预约系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

【JavaEE】——CAS指令和ABA问题

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:CAS指令 1:概念 2:伪代码例子说明 3:优点 二&am…

《向量数据库指南》——Mlivus Cloud:优惠大放送,向量数据库新体验

哈哈,各位向量数据库领域的探索者和实践者们,大家好!我是大禹智库的向量数据库高级研究员王帅旭,也是《向量数据库指南》的作者,今天咱们来聊聊Mlivus Cloud这个让人眼前一亮的向量数据库服务。特别是它那诱人的优惠放送,简直是给咱们这些热衷于技术创新的朋友们送上了一…

微信小程序使用picker,数组怎么设置默认值

默认先显示请选择XXX。然后点击弹出选择列表。如果默认value是0的话&#xff0c;他就直接默认显示数组的第一个了。<picker mode"selector" :value"planIndex" :range"planStatus" range-key"label" change"bindPlanChange&qu…

一些 Go Web 开发笔记

原文&#xff1a;Julia Evans - 2024.09.27 在过去的几周里&#xff0c;我花了很多时间在用 Go 开发一个网站&#xff0c;虽然不知道它最终会不会发布&#xff0c;但在这个过程中我学到了一些东西&#xff0c;想记录下来。以下是我的一些收获&#xff1a; Go 1.22 现在有了更…

【ubuntu】ubuntu20.04 install vscode

1.download Visual Studio Code - Code Editing. Redefined download .deb. 2.install or intsall by ternimal: sudo dpkg -i code_1.93.1-1726079302_amd64.deb 3.open vscode 4. install some extensions c , python or GitLens.

SpringMVC2~~~

数据格式化 提交数据(比如表单)&#xff0c;对提交的数据进行转换和处理 基本数据类型可以和字符串自动转换 <a href"<%request.getContextPath()%>/addMonsterUI">添加妖怪</a> Controller Scope(value "prototype") public class …

spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)

文章目录 【README】【1】文件上传与MultipartResolver【1.1】使用MultipartResolver进行文件上传【1.2】springmvc处理multipart多部件请求流程【1.3】使用springmvc上传文件代码实现&#xff08;springmvc6.10版本&#xff09;&#xff1a; 【2】Handler与HandlerAdaptor&…

遮罩解决图片悬浮操作看不到的情况

未悬浮效果 悬浮效果 如果仅仅是添加绝对定位&#xff0c;那么遇到白色图片&#xff0c;就会看不到白色字体。通过遮罩&#xff08;绝对定位透明度&#xff09;就可以解决这个问题。 <script setup> </script><template><div class"box"><…

protobuf 讲解

一、序列化概念回顾 二、什么是PB 将结构化数据进行序列化的一种方式 三、PB的特点 语言无关、平台无关&#xff1a;即PB支持Java&#xff0c;C、Python等多种语言。支持多个平台 高效&#xff1a;即比XML更小&#xff0c;更快&#xff0c;更为简单。 扩展性、兼容性好&am…

MATLAB使用眼图分析QPSK通信系统接收端匹配滤波后的信号

文章目录 前言一、MATLAB仿真代码二、仿真结果 前言 本文完成以下内容&#xff1a; &#xff08;1&#xff09;建立一个QPSK传输系统&#xff0c;并引入EsNo20dB&#xff08;SNR0dB&#xff09;的噪声&#xff0c;接收端对带噪信号进行匹配滤波。 &#xff08;2&#xff09;分…

Python并发编程挑战与解决方案

Python并发编程挑战与解决方案 并发编程是现代软件开发中的一项核心能力&#xff0c;它允许多个任务同时运行&#xff0c;提高程序的性能和响应速度。Python因其易用性和灵活性而广受欢迎&#xff0c;但其全局解释器锁&#xff08;GIL&#xff09;以及其他特性给并发编程带来了…

CSS实现服务卡片

CSS实现服务卡片 效果展示 CSS 知识点 回顾整体CSS知识点灵活运用CSS知识点 页面整体布局 <div class"container"><div class"card"><div class"box"><div class"icon"><ion-icon name"color-pal…