io流、泛型、线程

简介: io流解决的问题:解决设备与设备之间 的数据传输问题。 比如: 硬盘--->内存; 内存----->硬盘字节流输入字节流InputStream 所有输入字节流的基类。
  • io流解决的问题:解决设备与设备之间 的数据传输问题。 比如: 硬盘--->内存; 内存----->硬盘

字节流

  • 输入字节流
    • InputStream 所有输入字节流的基类。 抽象类。
      • FileInputStream 读取文件的输入字节流。
      • BufferedInputStream 缓冲输入字节流。 该类内部其实就是维护了一个8kb字节数组而已。 该类出现的目的是为了提高读取文件数据的效率。
  • 输出字节流
    • OutputStream 所有输出字节流的基类。 抽象类。
      • FileOutputStream 向文件输出数据 的输出字节流。
      • BufferedOutputStream 缓冲输出字节流。 该类出现的目的是为了提高向文件写数据的效率。 该类内部其实也是维护了一个8kb的字节数组而已。
  • 什么情况使用字节流: 读取到数据不需要经过编码或者解码的情况下这时候使用字节流。比如:图片数据
    字符流 = 字节流 + 编码(解码)

字符流

  • 输入字符流
    • Reader 所有输入字符流的基类。 抽象类。
    • FileReader 读取文件字符的输入字符流。
    • BufferedReader 缓冲输入字符流。 该类出现的目的是为了提高读取文件字符的效率并且拓展了功能(readLine()),它内部 其实就是维护了一个8192个长度的字符数组。
  • 输出字符流
    • Writer 所有输出字符流的基类。 抽象类。
      • FileWriter 向文件输出字符数据的输出字符流。
      • BufferedWriter 缓冲输出字符流。该类出现的目的是为了提高写文件字符的效率并且拓展了功能(newLine()),它内部 其实也是维护了一个8192个长度的字符数组。
  • 什么情况下使用字符流:如果读写的都是字符数据,这时候我们就使用字符流。

转换流:

  • 输入字节流的转换流( 输入字节流---------输入字符流)
    • InputSrteamReader
  • 输出字节流的转换流(输出字节流---------输出字符流)
    • OutputStreamWriter
  • 转换流的作用:
  1. 可以把对应的字节流转换成字符流使用。
  2. 可以指定码表进行读写文件的数据。
    FileReader, FileWriter这两个类默认是使用的是gbk编码 表。不能由你来指定码表读写文件数据。
img_d8ddab1f5bc1a927320a83a0c0a3f4ba.png
image.png
img_2f92221f4c02f4c717be02f2a20a86d1.png
image.png

泛型

img_ac9a03050811c115f92abc4d83e8894a.png
image.png

自定义泛型

img_b9ff2c64c9ffab90076bf8c4f5a4c414.png
image.png
img_4fd1a7e006ddedd8d710c60010e29645.png
image.png
img_7cb2063733cb84a31b9516430a478796.png
image.png

线程

  • 多线程的好处:多线程解决了在一个进程中同时可以执行多个任务代码的问题。
  • 自定义线程的创建方式:

方式一:继承Thread.
1. 自定义一个类继承Thread类。
2. 重写Thread的run方法,把自定义线程的任务代码定义在run方法上。
3. 创建Thread子类的对象,并且调用start方法启动一个线程。
方式二: 实现Runnable接口。
1. 自定义一个类实现Runnable接口。
2. 实现Runnable接口中的run方法,把自定义线程的任务代码定义在run方法上。
3. 创建Runable实现类 的对象。
4. 创建Thread对象,并且把Runnable实现类的对象作为参数传递。
5. 调用Thread对象的start方法开启线程。

线程安全问题的解决方案

  • 线程出现安全问题的根本原因:

1.必须要存在两个或者两个以上的线程共享着一个资源.

  1. 操作共享资源的代码必须有两句或者两句以上。
  • 同步代码块

      synchronized(锁){
          需要被同步的代码
      }
    
  • 同步函数

    修饰符 synchronized 返回值类型   函数名(形参列表..){
        
        }

注意:
1. 同步代码块的锁可以是任意的对象。 同步函数的锁是固定 的,非静态函数的锁对象是this对象。 静态函数的锁对象是class对象。
2. 锁对象必须是多线程共享的对象,否则锁不住。
3. 在同步代码块或者是同步函数中调用sleep方法是不会释放锁对象的,如果是调用了wait方法是会释放锁对象的。

img_d5fd9f49ace2ce172847b3a0d2f11e13.png
image.png
相关文章
|
8月前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
8月前
|
负载均衡 NoSQL Java
|
负载均衡 NoSQL Java
redis中的io多线程(线程池)
redis中的io多线程(线程池)
418 0
|
数据采集 并行计算 Java
【文末送书】Python高并发编程:探索异步IO和多线程并发
【文末送书】Python高并发编程:探索异步IO和多线程并发
269 0
|
3月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
74 2
WXM
|
5月前
|
存储 缓存 算法
IO/线程的零拷贝
服务器在提供文件传输功能时,传统实现方式是通过读取磁盘文件内容,将其加载到用户空间的缓冲区,再通过网络 API 发送至客户端,这个过程涉及多次上下文切换和内存拷贝,导致性能下降。
WXM
70 12
|
7月前
|
数据采集 算法 数据处理
Python并发编程:异步IO与多线程的比较与应用
本文探讨了Python中异步IO和多线程两种并发编程模型的优劣及其在实际应用中的适用性。通过比较它们在性能、资源消耗和代码复杂度等方面的差异,分析了不同场景下选择合适的并发模型的策略和方法。
|
6月前
|
数据采集 算法 数据处理
Python中的并发编程:异步IO与多线程对比分析
传统的多线程编程在Python中因为全局解释器锁(GIL)的存在受到限制,导致多线程并不能充分利用多核处理器的优势。本文将探讨Python中的异步IO编程与多线程编程的差异与优劣,并分析适合的应用场景。
|
7月前
|
Python
并发编程,Python让你轻松驾驭多线程与异步IO!
【6月更文挑战第12天】本文探讨了Python中的并发编程,包括多线程和异步IO。通过`threading`模块展示了多线程编程,创建并运行多个线程以并发执行任务。同时,使用`asyncio`库演示了异步IO编程,允许在单线程中高效处理多个IO操作。两个示例代码详细解释了如何在Python中实现并发,展现了其在提升程序性能和响应速度方面的潜力。
46 3
|
8月前
|
并行计算 数据处理 开发者
Python并发编程:解析异步IO与多线程
本文探讨了Python中的并发编程技术,着重比较了异步IO和多线程两种常见的并发模型。通过详细分析它们的特点、优劣势以及适用场景,帮助读者更好地理解并选择适合自己项目需求的并发编程方式。