重拾Java之路-I/O

一、概览

java的I/O大概分成以下几类:

  1. 磁盘操作:File;
  2. 字节操作:InputStream 和 OutputStream;
  3. 字符操作:Reader 和 Writer;
  4. 对象操作:Serializable;
  5. 网络操作:Socket;
  6. 新的输入/输出:NIO。

二、磁盘操作

File类用于表示文件和目录的信息,但是不表示文件的内容(类似指针)。

三、字节操作

// 注意相对路径的起始位置:src目录开始
public static void copyFile(String src, String dist) throws IOException{
        // 不接收File对象也行
        FileInputStream in = new FileInputStream(src);
        FileOutputStream out  = new FileOutputStream(dist);

        byte[] buffer  = new byte[20*1024];
        int cnt;

		// eof表示文件尾
        while((cnt = in.read(buffer, 0, buffer.length)) != -1){
            out.write(buffer, 0, cnt);
        }

        in.close();
        out.close();
    }

I/O使用装饰者模式(允许向一个现有的对象添加新功能,同时不改变其结构)来实现。对于InputStream:

FileInputStream为InputStream的子类,提供了字节流的输入操作;
FilterInputStream为抽象装饰者,装饰者用于装饰组件,并为组件提供额外的功能。使用时,只需要在外层套上一层装饰组件即可。

FileInputStream fileInputStream = new FileInputStream(filePath);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

四、字符操作

编码与解码

编码把字符转换为字节,而解码是把字节重新组合成字符。
Unicode标准只规定代码点对应的字符,没有规定代码点该怎么存储(UTF系列为具体实现方式)
GBK编码中,中文字符占2个字节,英文占1字节;
UTF-8中,中文编码占3-4字节,英文占1字节;
UTF-16中,中文占3-4字节,英文占2字节;
UTF-32中,任何字符都占4字节。

Java内存编码使用的是UTF-16be(大端),中文英文都占用2字节(一个char空间)。

程序中的操作一般是字符形式的数据,因此需要提供对字符操作的方法:

  1. InputStreamReader 实现从字节流解码成字符流;
  2. OutputStreamWriter 实现字符流编码为字节流。

五、对象操作

序列化就是将一个对象转换成字节序列,方便存储和传输。
序列化: ObjectOutputStream.writeObject();
反序列化:ObjectInputStream.readObject()。

自定义类如果需要支持序列化,需要实现Serializable接口(一个标准,无实现方法需要实现)。

private static class A implements Serializable{
        private int x;
        private String y;

        A(int x, String y){
            this.x = x;
            this.y = y;
        }

        @Override
        public String toString() {
            return "A{" +
                    "x=" + x +
                    ", y='" + y + '\'' +
                    '}';
        }
    }

public static void main(String[] args) throws IOException, ClassNotFoundException {
        A a1 = new A(12, "ba");
        String objectFile = "src\\basement\\foundation\\IOtest\\file\\a1_object";

        // 将对象序列化并写入文件(顺序相反?)
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(objectFile));
        objectOutputStream.writeObject(a1);
        objectOutputStream.close();

        // 从文件读取并反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(objectFile));
        A a2 = (A) objectInputStream.readObject();
        objectInputStream.close();

        System.out.println(a2);
    }

使类中的某一些属性不被序列化的方法:添加 transient关键字。

六、网络操作

Java 中网络的支持方式:

  1. InetAddress:用于表示网络上的硬件资源,即IP;
  2. URL:统一资源定位符;
  3. Socket:使用TCP协议实现网络通信;(客户端服务器端使用InputStream与OutputStream进行输入输出)
  4. Datagram:使用UDP协议实现网络通信。

七、新的输入/输出

于JDK1.4引入,提供了高速的、面向块的I/O。

两者的区别

I/O以流的方式处理数据,而NIO以块的方式处理数据,并且NIO是非阻塞的。

通道与缓冲区

通道是双向的,可以同时用于读写,流是单向的,只能在一个方向上移动。需要注意的是,不能直接对通道进行数据的读写,需要缓冲区来保存数据。

通道类型

  1. FileChannel:从文件中读写;
  2. DatagramChannel:通过UDP读写;
  3. SocketChannel:通过TCP读写;
  4. ServerSocketChannel:监听新进来的TCP连接,对每一个进来的连接创建一个SocketChannel。

同步与异步(本人询问,老板回复的方式)

同步:如果有多个任务或事件要发生,这些任务或事件必须逐个执行,一个任务或事件的执行会导致整个流程的暂时等待。
异步:事件可以并发地执行,一个任务或事件的执行不会导致整个流程的暂时等待

同步和异步关注的是消息的通信机制

对于同步IO:用户发出IO请求操作后,如果数据没有就绪,需要通过用户线程或者内核不断地轮询数据是否就绪,当数据就绪时,再将数据内核拷贝到用户线程;
对于异步IO:只有IO请求操作的发出是由用户线程进行的,IO操作的两个阶段都由内核自动完成(两个阶段都能干别的事情),然后告知用户线程操作已经完成。

同步IO与异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是由内核来完成。

阻塞与非阻塞(本人后续的操作)

阻塞:当某个任务或事件在执行过程中,发出一个请求操作,但是由于该操作需要的条件不满足,就会一直在那里等待,直到条件满足。
非阻塞:当某个任务或事件在执行过程中,发出一个请求操作,但是由于该操作需要的条件不满足,就会立即返回一个标志信息告知不满足,不会进行等待。

阻塞和非阻塞关注的是程序在等待调用结果时的状态

对于一个IO请求,一般包括两个阶段:

  1. 查看数据是否就绪;
  2. 进行数据的拷贝(内核将数据拷贝到用户线程)。

阻塞IO与非阻塞IO的区别在于第一个阶段,阻塞会一直等待,非阻塞则直接返回标志信息。

5种I/O模型

阻塞IO模型

非阻塞IO模型

多路复用IO模型

信号驱动IO模型

异步IO模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值