Writer
定位:
字符流的顶层父类。是一个抽象的类型。 里面定义了字符流都需要具备的方法。
就是用操作字符数据的输出流。
常用的方法:
write(int c) 写入一个字符 干掉前16位剩下16位进行传输。
write(char[] cbuf) 可以直接写入一组数据 就是制定的参数字符数组
write(char[] cbuf, int off, int len) 写入一组数据的一部分
write(String str) 写入一个字符串
write(String str, int off, int len) 写入字符串的一部分
能否使用字符流拷贝非纯文本的文件,图片视频等
结论:不能
原因:在使用GBK编码时 要去解码1-2个字节的字符,那么在这个过程中可能会出现查询不到对应字符的编码的问题,会使用一个英文的?来代替查询不到的字符。如果一个中文查询不到就会出现文件损坏的问题。
字符缓冲流
字符缓冲流类型:
1、BufferedReader
2、BufferedWriter
说明:
其实就是两个包装类 需要包装我们已经关联设备的字符流对象。不能独立创建 可以对我们普通的字符流进行加强也提供了一些较为强大的方法给字符流使用。
他们都是继承了Reader 和Writer 所以就不需要再去看里面的方法直接使用父类的操作方式。
提升效率的原因
1、字符缓冲输入流中有一个大小为8192的字符数组 这样就可以降低我们读取数据的次数
提升效率。
2、字符缓冲输出流中也有一个这样的数组作为缓冲区 数据先被压进这个缓冲中等待存储完毕再刷新到磁盘上,数据与磁盘的传输次数降低也可以提升效率
字符缓冲流中的特有方法
在缓冲输入流(BufferedWriter)中提供了一个方法
readLine() 可以读取一整行字符。
返回值如果读取到文件的末尾就返回null
输出流提供了一个方法
newLine() 换行 并且兼容平台
Windows \n \r
Linux \n
转换流
编码表
含义:
编码表中的编码就是 字节在转换字符时的对应值。别名也可以叫做字符集。
Java中的字符集
我们java中一般使用Unicode作为字符集一个字符对应两个字节。
在java之外的设备可能还会采取其他的编码形式,取决于文件的要求。
常见的字符集
1、GBK编码表 一个英文字母对应一个字节一个中文对应两个字节。
2、utf-8也是常见的编码形式,万国码的提升,一个英文字母对应一个字节,一个中文字母对应三个字节。
转换流的概述
分为两个
InputStreamReader 转换流的输入流
OutputStreamWriter 转换流的输出流
含义:
转换流就是将字节流包装成字符流可以直接用于操作字符。
说明 是Reader 和Writer 的子类。
好处: 可以将字节流进行加强去操作字符,并且可以指定操作的字符集。如果不指定就按照平台要求的默认编码格式。
不用看里面的方法直接按照父类的操作方式即可。
字符流的体系:
Reader 字符流的顶层抽象父类
InputStreamReader 转换流
FileReader 文件字符输入流 默认的编码格式
Writer 字符流的顶层父类
OutputStreamWriter 转换流
FileWirter 文件字符输出流 默认的编码格式
InputStreamReader
转换流的输入流
构造方法:
InputStreamReader(InputStream in)
参数中需要传递一个字节流对象 对字节流进行加强。
InputStreamReader(InputStream in, String charsetName)
参数中传递字节流 并且可以指定字符集。
OutputStreamWriter
定位:
就是字符流下面的子类是一个字符流的转换流
作用:
可以将字节流转成字符流来直接操作字符。
好处:可以指定字符集。也可以使用默认的字符集。
也是集成了顶层父类 直接使用父类的操作即可。
构造方法:
OutputStreamWriter(OutputStream out)
传递一个字节输出流可以对这个流进行加强。
OutputStreamWriter(OutputStream out, String charsetName)
传递一个字节输出流在加强的同时可以去指定字符集。
多线程
多线程的概述
程序和进程
程序:
- Program
- 静态的概念
- 数据和逻辑的集合
- 被储存在磁盘上的数据和逻辑的集合
- 没有被运行的状态
进程:
- Process
- 当程序被执行时的状态就可以称之为进程。
- 进程可以在任务管理器中查看
- 正在执行的程序叫做进程 程序的一次执行叫做进程
进程和线程
Process
1、正在执行的程序
2、拥有执行资源的被分配权限
线程
- Thread
- 程序中最小的执行单位
- 没有资源分配的权限
- 当进程结束之后线程也不存在了
- 线程就是真正执行任务的存在
相关点:都表示程序中的可执行任务。
不同点:
- 进程拥有可以分配资源的权限但是线程没有
- 线程不可以独立存在 必须在进程中运行。进程可以独立存在。
并行和并发
- 多个任务可以同时执行
- 在一个确定的时间点多个程序都在执行
- 一个cpu在同一时间只能有一个程序在执行
并发:
- 一个cpu可以执行多个程序
- 多个程序之间需要去cpu中抢占资源
- 在同一个时间不能有多个程序在执行
多线程的定义
第一种定义方式 继承线程的父类Thread
步骤
- 创建一个自定义的线程类型
- 继承Thread
- 重写run方法
- 创建自定义的线程对象
- 开启线程 start
现象:
- 每条线程都是相互独立的存在互不影响
- 线程在执行的过程 随机抢占资源
图示: