1.字符集介绍
-
标准ASCII字符集:使用1个字节存储一个字符,首尾是0,总可以表示128个字符。是美国信息交换标准代码,包含英文、符号等等。
-
GBK汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成2个字节的形式存储,GBK兼容了ACSII字符集。GBK规定:汉字的第一个字节的第一位必须是1
-
Unicode字符集:是国际组织规定的,可以容纳世界所有文字、符号的字符集。叫万国码。
-
UTF-32: 4个字节表示一个字符,固定长度,可能只需要1个字节的英文字符现在要用4个字节来存储,太奢侈
-
UTF-8:采取可变长编码方案:共分为4个长度区:1(0xxxxxxx)、2(110xxxxx 10xxxxx)、3(1110xxxx 10xxxxx)、4(11110xxx 10xxxxx 10xxxxx 10xxxxx)个字节
-
英文字符、数字只占用1个字节,汉字占用3个字节
-
-
注意:
-
开发人员最好都是用UTF-8编码。
-
字符编码时使用的字符集,和解码时使用的字符集必须一致,不然会出现乱码
-
英文数字一般不会乱码,英文很多字符集都兼容了ASCII码
2. IO流分类
-
按流的方向
-
输入流:将数据从磁盘输入到程序中
-
输出流:将数据从程序中保存到磁盘上
-
-
按数据的最小单位
-
字节流:适合操作所有类型的文件
-
字符流:适合读写txt,java文件
-
3.总体概览图
4.IO流体系
-
字节流(适合文件的复制)
-
字节输入流:InputStream---->FileInputStream
-
作用:把磁盘文件中的数据以字节的形式读取到内存中
-
常用方法:
//构造方法:创建字节输入流管道与源文件接通 public FileInputStream(File file); public FileInputStream(String name) //方法 //每次读取一个字节返回,如果发现没有数据可读会返回-1 public int read(); //每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1 public int read(byte[] buffer);
-
-
字节输出流: OutputStream---->FileOutputStream
-
作用:把数据写入文件中并保存在磁盘
-
常用方法:
//构造方法:创建字节输出流管道与源文件接通 public FileOutputStream(File file); public FileOutputStream(String filePath) //以下构造方法可以追加数据 public FileOutputStream(File file,boolean append); public FileOutputStream(String filePath,boolean append) //方法 //写一个字节出去 public void write(int a); //写一个字节数组出去 public void write(byte[] buffer); //写字节数组的一部分出去 public void write(byte[] buffer,int pos, int len);
-
-
-
字符流(适合数据的读取)
-
文件字符输入流: Reader---->FileReader
-
作用:把磁盘文件中的数据以字符的形式读取到内存中
-
常用方法:
//构造方法:创建字符输入流管道与源文件接通 public FileReader(File file); public FileReader(String pathname) //方法 //每次读取一个字符返回,如果发现没有数据可读会返回-1 public int read(); //每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1 public int read(char[] buffer);
-
- 文件字符输出流: Writer---->FileWriter
-
作用:把数据写入文件中并保存在磁盘
-
常用方法:
//构造方法:创建符节输出流管道与源文件接通 public FileWriter(File file); public FileWriter(String filePath) //以下构造方法可以追加数据 public FileWriter(File file,boolean append); public FileWriter(String filePath,boolean append) //方法 //写一个字符出去 public void write(int a); //写一个字符串出去 public void write(String s); //写一个字符串的一部分出去 public void write(String s,int off, int len); //写一个字符数组出去 public void write(byte[] buffer); //写字符数组的一部分出去 public void write(byte[] buffer,int pos, int len);
-
-
-
缓冲流
-
作用:包装原始字节流和字符流,提升原始流的读写数据的性能。
-
字节输入缓冲流:BufferedInputStrea
InputStream bis = new BufferedInputStream(FileInputStream is,int size);
-
字节输出缓冲流: BufferedOutputStream
OutputStream bos = new BufferedOutputStream(FileOutputStream os,int size);
-
字符输入缓冲流: BufferedReader(新增读取某一行的数据)
-
字符输出缓冲流: BufferedWriterzz(新增添加一行数据的方法)
-
-
转换流
-
引起问题:如果程序的编码方式和文本文件的编码方式不一致,就会出现乱码问题。解决该问题有以下两种方式:
-
字符输入转换流:InputStreamReader:
-
解决思路:先获取文件的原始字节流,然后按照指定的编码转为字符输入流。
//构造函数 public InputStreamReader(InputStream is,String charset);
-
-
字符输出转换流: OutputStreamWriter:
-
作用:可以控制写入文件的字符使用什么字符编码。
-
解决:先获取字节输出流,再按照指定的编码转为字符输出流。
//构造函数 public OutputStreamWriter(OutputStream is,String charset);
-
-
-
打印流
-
作用:更方便更高效的打印数据出去,打印什么就输出什么
-
字节输出打印流:PrintStream
//构造方法 //打印流直接通向字节输出流、文件、文件路径 public PrintStream(OutputStream/File/String); //可以指定写出去的字符编码 public PrintStream(String fileName,Charset charset); //可以指定实现自动刷新 public PrintStream(OutputStream out,boolean autoFlush); //指定自动刷新,并指定字符编码 public PrintStream(OutputStream out,boolean autoFlush,String encoding); //打印方法 //打印任意类型的数据 public void printIn(Xxx xx);
-
字符输出打印流: PrintWriter
//构造方法 //打印流直接通向字节输出流、文件、文件路径 public PrintWriter(OutputStream/Writer/File/String); //可以指定写出去的字符编码 public PrintWriter(String fileName,Charset charset); //可以指定实现自动刷新 public PrintWriter(OutputStream out/Writer,boolean autoFlush); //指定自动刷新,并指定字符编码 public PrintWriter(OutputStream out,boolean autoFlush,String encoding); //打印方法 //打印任意类型的数据 public void printIn(Xxx xx);
-
-
数据流
-
数据输入流:DataInputStream(读取数据输出流写出去的数据)
-
数据输出流:DataOutputStream(允许把数据及其类型一并写出去)
-
-
序列化流(字节流下的)
-
对象反序列化:ObjectInputStream(读取文件中的对象)
//构造器 //创建对象字节输入流,包装基础的字节流 public ObjectInputStream(InputStream is); //读取存储在文件中的对象的方法 public final Object readObject();
-
对象序列化: ObjectOutputStream(把java对象序列化存储到文件中去)
//构造器 //创建字节输出流,包装基础的字节输出流 public ObjectOutputStream(OutputStream os); //把对象写入文件的方法 public final void writeObject(Object o);
-