1 字节缓冲流

BufferInputStream 将创建一个内部的缓冲区数组,内部缓冲区数组将根据需要从包含的输入流中重新填充,一次可以读取多个字节

BufferOutputStream 该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

构造方法:传入字节流,可以指定缓冲区大小

bos.write("hello\r\n".getBytes(StandardCharsets.UTF_8));

BufferedOutputStream 内部带有缓冲区 写数据的时候 先写出到缓冲区,缓冲区写满的时候 ,才会将缓冲区的内容写出到磁盘 调用flush方法 只刷新缓冲流 但不释放资源 close方法 在关闭流 释放资源之前 会先刷新缓冲流

为什么缓冲流的构造方法中需要的是一个字节流,而不是具体的文件或者路径呢?

字节缓冲流仅仅提供缓冲区,而真正的读写数据还的移开基本的字节流对象进行操作。

2 字符流

2.1 为什么出现字符流

由于字节流操作中文不是特别方便,所以就出现了字符流

字符流 = 字节流 +字符集

中文字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因就是最终底层操作会自动的进行字节拼接成中文。

如何识别中文?

汉字在存储的时候 无论使用那种编码存储 第一个字节都是负数。

2.2. 字符串中的编码和解码的问题

编码就指的是将字符转换成字节

string.getBytes(),参数可指定String 字符集名

默认的编码 UTF-8

// 解码 编码和解码必须使用相同的码表 否则会出现中文乱码

解码: 将字节数组转换为字符

String(byte[] bytes, String charsetName)构造一个新的String由指定用指定的字节的数组解码charset

2.3. 字符流中的编码问题

字符流的抽象基类:

Reader 字符输入流的抽象基类 编码

Writer 字符输出流的抽象基类 解码

字符流中和编码相关的类:

  • InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

  • OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

构造方法:字节流+可选字符集名

  • 使用字符流完成对于中文的写和读

    2.4 字符流读写的方式

    写:write(字符数组/字符串/字符,起始位置)

    刷新和关闭close(),flush()

    读:read(字符/字符数组,起始位置)

字符流自带缓冲区

2.5 字符流操作的便捷类

FileReader 是InputStreamReader的简洁形式

FileWriter 是OutputStreamReader的简洁形式

2.6 字符缓冲流

BufferedReader

  • 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。可以指定缓冲区大小,或者可以使用默认大小。

    BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。

    readline()读一行

BufferedWriter

  • 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。

    可以指定缓冲区大小,或者可以接受默认大小。

    BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。

    newLine()写分隔符

2.7 IO流小结

字节流可以赋值文件数据,有四种方式一般采用字节缓冲流一次去屑一个字节数组的形式。

3 标准输入输出流

PrintStream:err、out

InputStream:in

3.1.标准输入流(字节流)

    public static void main(String[] args) throws IOException {
       //字节流
       InputStream is = System.in;// 字节输入流的数据来源来自标准输入设备键盘
       BufferedReader br = new BufferedReader(new InputStreamReader(isr));
       System.out.println("请输入一个整数:");
       int i= Integer.parseInt(br.readLine());
       System.out.println("您输入的整数为:"+(i + 1));
       //以上代码就是自己实现了键盘录入字符串和整数的方法   这样写起来有点麻烦,因此Java提供了
       Scanner sc = new Scanner(System.in);
  }

3.2. 标准输出流

PrintStream ps = System.out;

4 打印流

打印流分为:

  • 字节 打印流 PrintStream

  • 字符打印流 PrintWtriter

打印流的特点:

只负责数据的输出 不能读取数据

有一些特有的方法 println() print()

5 对象的序列化流

对象序列化: 就是将对象保存到磁盘或者在网络中传输对象 为了对象保存的正确性 和传输的安全性,需要对对象进行编码处理,那么把这种处理方式称为对象的序列化

反序列化:将序列化的对象解析为原对象的过程 就称为反序列化

  • ObjectOutputStream oos.writeObject(obj);

  • ObjectInputStream ois.readObject();再强制转型

对于对象传输 对象必须实现java.io.Serializable接口

6 Porperties

Porperties是Map集合的一个实现类

Properties prop = new Properties(); prop.put(k,v); prop.entrySet();

Porperties可以保存到流中或者从流中加载。 属性列表中的键及其对应的值都是字符串

prop.getProperty(k) prop.setProperty(k,v)

prop.load(输入字节流/reader) prop().store(输出字节流/writer,注解默认为null)

7 多线程

7.1 进程 线程 程序

程序: 是为了完成特定任务 用某种语言编写的一组指令的集合。指的一段静态。

进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程:有他自身的产生 存在 以及消亡的过程--生命周期

程序是静态的 进程是动态的进程作为资源分配单位,系统在运行时会为每个进程分配不同的内存区域。

线程(thread) 进程进一步细化就是线程,是一个程序内部的一条执行路径。

若一个进程同一时间并行执行多个线程,就是支持多线程。

线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程的切换开销比较小。

一个进程中的多个线程共享相同的内存单元和内存地址空间,他们从一个堆中分配对象,可以访问相同的变量和对象。这就是的线程间的通信变得简便和高效。但多个线程操作共享的系统资源可能会带来安全隐患。

单核CPU和多核CPU

在java中 一个程序至少有三个线程组成, 主线程(main) 垃圾回收线程(gc) 异常处理线程。

并行和并发:

  • 并行:多个CPU同时执行多个任务

  • 并发: 一个CPU在同一时刻,同时处理多个任务。

使用多线程的优点:

1 提高了应用程序的响应。

2 提高了计算机CPU的利用率

3 改善程序结构。

何时需要多线程?

  • 程序需要同时执行两个或多个任务

  • 程序需要实现一些需要等待的任务的时候:如:用户输入,文件读写 网络操作等。

  • 需要一些后台运行的程序时

7.2 实现多线程

创建一个新的执行线程有两种方法。

  • 一个是将一个类声明为Thread的子类。 这个子类应该重写Thread的run方法 。 然后可以分配并启动子类的实例

  • 另一种方法来创建一个线程是声明实现类Runnable接口。 那个类然后实现了run方法。 然后可以分配类的实例,在创建Thread时作为参数传递,并启动

7.2.1 实现线程的方式一: 继承Thread类

为什么要重写run方法?

因为run方法是用来封装被线程执行的代码的。

run方和start方法的区别?

run()封装了线程执行的代码,直接调用的,相当于普通方法调用。

start方法 启动线程,然后由jvm调用此线程的run方法

7.2.2 实现线程的方式二: 实现Runnable接口

  • public interface Runnable

    Runnable接口应由任何类实现,其实例将由线程执行。 该类必须定义一个无参数的方法,称为run

    Runnable r = new MyRannable(); Thread t1 = new Thread(r);

    t1.start();

或 new Thread(new Runnable(){@Override public void run(){sout;} }).start();

7.3 设置和获取线程的名称

Thread(name):有参构造,参数是线程的名字

th.setName(name);

Thread.currentThread();返回当前正在执行的线程对象的引用。

th.getName();

7.4 线程的优先级

th.getPriority();

th.setPriority(pri);

  • 每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行

线程的两种调度模型

分时调度: 所有线程轮流实现CPU的使用权,平均分配每个线程占有CPU的时间片

抢占式调度: 优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个。优先级高的线程获得CPU执行权的概率更高。

java是的是抢占式的调度模型。

线程的默认优先级为5,线程的优先级的范围为1(小)--10(大)

 

13Java进阶——IO、线程的更多相关文章

  1. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  2. Netty IO线程模型学习总结

    Netty框架的 主要线程是IO线程.线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.以下我们先一起看下该模型 Reactor线程模型 ...

  3. MySQL IO线程及相关参数调优

    一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分 ...

  4. InnoDB的后台线程(IO线程,master线程,锁监控线程,错误监控线程)和内存(缓冲池,重做日志缓冲池,额外内存池)

    InnoDB有多个内存块,你可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓存磁盘上的数据,方便快速地读取,并且在对磁盘文件的数据进行修改之前 ...

  5. Netty源码细节IO线程(EventLoop)(转)

    原文:http://budairenqin.iteye.com/blog/2215896 源码来自Netty5.x版本, 本系列文章不打算从架构的角度去讨论netty, 只想从源码细节展开, 又不想通 ...

  6. (5.11)mysql高可用系列——复制中常见的SQL与IO线程故障

    关键词:mysql复制故障处理 [1]手工处理的gtid_next(SQL线程报错) 例如:主键冲突,表.数据库不存在,row模式下的数据不存在等. [1.1]模拟故障:GTID模式下的重复创建用户 ...

  7. Redis 源码简洁剖析 11 - 主 IO 线程及 Redis 6.0 多 IO 线程

    Redis 到底是不是单线程的程序? 多 IO 线程的初始化 IO 线程运行函数 IOThreadMain 如何推迟客户端「读」操作? 如何推迟客户端「写」操作? 如何把待「读」客户端分配给 IO 线 ...

  8. suging闲谈-netty 的异步非阻塞IO线程与业务线程分离

    前言 surging 对外沉寂了一段时间了,但是作者并没有闲着,而是针对于客户的需要添加了不少功能,也给我带来了不少外快收益, 就比如协议转化,consul 的watcher 机制,JAVA版本,sk ...

  9. Java进阶 | IO流核心模块与基本原理

    一.IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Linux ...

随机推荐

  1. Java8 中使用Stream 让List 转 Map使用总结

    在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查. 空指针风险 java.lang.NullPointerE ...

  2. 【NX二次开发】Block UI 列表框

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  3. 浅谈lambda表达式<最通俗易懂的讲解

    Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论.Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中.想想看,在Java8 ...

  4. VBS脚本编程(6)——对象的创建与调用

    对象:严格的说,对象是复杂数据和程序结构在内存中的表现,只有在程序运行时才存在.包含有方法和属性. 对象的创建及用法 1. Set 语句 将对象引用赋给一个变量或属性,或者将对象引用与事件关联. Se ...

  5. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则

    目录 系列文章 领域服务 应用服务 学习帮助 系列文章 基于ABP落地领域驱动设计-00.目录和前言 基于ABP落地领域驱动设计-01.全景图 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践 ...

  6. 在js中使用moment将秒转换为多少天多少小时多少分多少秒

    let x = 2703750;//单位是秒 var d = moment.duration(x, 'seconds'); console.log(Math.floor(d.asDays()) + ' ...

  7. GCP消息队列Pubsub详解,简单好用还不用自己运维

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 GCP的Pubsub是一种异步消息传递服务,可将生产事件的服务与处理事件的服务隔离开.消息队列的作用就不多作介绍 ...

  8. 集合类线程安全吗?ConcurrentModification异常遇到过吗?如何解决?

    集合类不安全的问题 1. ArrayList的线程不安全问题 1.1 首先回顾ArrayList底层 ArrayList的底层数据结构是数组 底层是一个Object[] elementData的数组, ...

  9. vue cli3 创建项目

    1.确认是否由安装由vue 命令提示符 执行 vue -V 如果没有则执行 npm uninstall vue-cli 2.创建项目 vue create demo1 具体操作如下: (1)执行以上命 ...

  10. CRM软件从哪些方面帮助企业更上一层楼

    CRM顾客智能管理系统可以将"以顾客为管理中心"的管理模式与高新科技方式紧密结合,协助公司搭建优良的客户关系管理,改进顾客的消費感受,进而提升顾客的满意率,为公司产生大量的盈利.据 ...