字符流
字符流的概述
字符流 = 字节流 + 编码表
用字节流赋值文本文件时, 文本文件也会出现中文, 但是没有问题, 原因是最终底层操作会自动进行字节拼接中文, 根据汉字的编码第一个字节都是负数值作为识别条件.
-
字符编码
-
ASCII
-
GB2312
-
GBK ( 两个字节 )
-
GB18030
-
Unicode
-
UTF-8 ( 三个字节 )
-
UTF-16
-
UTF-32
-
-
一个汉字的存储, 如果是 GBK 编码, 占用两个字节, 如果是 UTF-8 字节, 占用三个字节
编码和解码
-
字符串中的编码与解码
-
编码
-
getBytes(): 使用平台 ( IDEA ) 默认字符集
-
getBytes(String charsetName): 设置字符集
-
-
解码
-
String(byte[] bytes); 使用平台 ( IDEA ) 默认字符集解码
-
String(byte[] bytes, String charsetName); 使用指定字符集解码
.
-
-
demo:解码和编码
package com.itxs.demo02;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/**
* @Classname : demo02
* @Description : TODO 编码和解码
* @Author : lin_refuel@qq.com
*/
public class demo02 {
public static void main(String[] args) throws UnsupportedEncodingException {
String s01 = "i'm Licinius,我是李锡尼";
//通过UTF-8的编码成字节数组
byte[] uf = s01.getBytes("UTF-8");
System.out.println(Arrays.toString(uf));//解析uf
//通过GBK的方式进行解析
//TODO byte[] gbk = s01.getBytes("GBK");
//TODO System.out.println(Arrays.toString(gbk));
//**********************************************
//通过GBK解码的方式解析UTF-8的解码形式的字节数组
System.out.println(new String(uf,"GBK"));
//运行结果:i'm Licinius,鎴戞槸鏉庨敗灏� 汉字部分会出乱码
//TODO 字符串进行解码成为字节数组时,要根据使用的解码方式,
//TODO 例如GBK去解析UTF-8解析的字节数组时,会出乱码
}
}
字符流写入文件
package com.itxs.demo02;
import java.io.*;
/**
* @Classname : demo03
* @Description : TODO 字符流写入文件
* @Author : lin_refuel@qq.com
*/
public class demo03 {
public static void main(String[] args) throws IOException {
//定义一个写入类
FileOutputStream fis = new FileOutputStream("D:/JAVA/ce/mini.txt");
//写入类封装成字符类
OutputStreamWriter ow = new OutputStreamWriter(fis, "UTF-8");
//写入两个字符
ow.write("小肆");
//进行shuax
ow.flush();
//关闭ow流
ow.close();//关闭封装的写入字符类ow,同时也会关闭写入类fis
//TODO *******************************************************************
//输出写入的字符
//对读取进行封装,封装成字符读取类
InputStreamReader IR = new InputStreamReader(new FileInputStream("D:/JAVA/ce/mini.txt"),"UTF-8");
int len; //返回的字节
while((len = IR.read())!=-1)
System.out.print((char)len);
IR.close();//关闭读取字符类
}
}
字符流读取
package com.itxs.demo02;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @Classname : demo04
* @Description : TODO 字符流读取
* @Author : lin_refuel@qq.com
*/
public class demo04 {
public static void main(String[] args) throws IOException {
//封装一个字节流读取,封装成为字符流读取类
InputStreamReader ir = new InputStreamReader(new FileInputStream("D:/JAVA/ce/mini.txt"));
// TODO ************************************************************************************
//一次读取一个字符的方式
/* int len;
while((len = ir.read())!= -1)
System.out.print((char)len);*/
//关闭字符流读取
// TODO**************************************************************************************
//一次读取一个 TODO 字符数组
char[] c = new char[1024];
int len;//字符的有效长度
while((len = ir.read(c))!= -1)
System.out.println(new String(c,0,len));//字符数组,转字符串的形式
ir.close();
}
}
字符流文件复制操作
package com.itxs.demo02;
import java.io.*;
/**
* @Classname : demo06
* @Description : TODO 字符号流复制文件
* @Author : lin_refuel@qq.com
*/
public class demo06 {
public static void main(String[] args) throws IOException {
//封装一个字节流写入封装成字符流写入类,默认UTF-8
OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream("D:/JAVA/ce/mini2.txt"));
//封装一个字节流读取封装成为字符流读取
InputStreamReader ir = new InputStreamReader(new FileInputStream("D:/JAVA/ce/mini.txt"));
//TODO*****************************************************************
//先读取后写入
//一次读取一个字符
/* int len;
while((len = ir.read())!= -1) {
ow.write(len);
ow.flush(); //手动刷新
}*/
//TODO ****************************************************************
//一次读取一个字符数组
char[] r2 = new char[1024];
int len2;
while((len2 = ir.read(r2))!=-1){
ow.write(r2,0,len2);
ow.flush();//手动刷新
}
ow.close();
ir.close();
}
}
FileReader和Filewrite
package com.itxs.demo02;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* @Classname : demo07
* @Description : TODO FileReader 和 FileWrite
* @Author : lin_refuel@qq.com
*/
public class demo07 {
public static void main(String[] args) throws IOException {
//读取"D:/JAVA/ce/mini.txt"
FileReader fr = new FileReader("D:/JAVA/ce/mini.txt");
//写入"D:/JAVA/ce/Myyy.txt"
FileWriter fw = new FileWriter("D:/JAVA/ce/Myyy.txt");
//TODO******************************************************************
//一次读取一个字节
// int r ;
// while((r = fr.read())!=-1){
// fw.write(r);
// fw.flush();
// }
//
//TODO *****************************************************************
//一次读取一个字符数组
char[] c1 = new char[1024];
int len;//有效字符长度
while((len = fr.read(c1))!=-1){
fw.write(c1,0,len);
fw.flush();
}
fr.close();
fw.close();
}
}
字符流缓冲区
package com.itxs.demo02;
import java.io.*;
/**
* @Classname : demo08
* @Description : TODO 字符流的缓冲区
* @Author : lin_refuel@qq.com
*/
public class demo08 {
public static void main(String[] args) throws IOException {
//读取的原文件
String source = "D:/JAVA/ce/MyTest.txt";
//创造的新的文件,并写入
String target = "D:/JAVA/ce/MY2txt.txt";
//读取类缓冲
BufferedReader br = new BufferedReader(new FileReader(source));
//写入类缓冲
BufferedWriter bw = new BufferedWriter(new FileWriter(target));
//一个字符数组
char[] cs = new char[1024];//1k的大小
int len;//有效长度
//通过循环进行写入
while((len = br.read(cs))!=-1){
bw.write(cs,0,len);
bw.flush();//手动刷新
}
//关闭读取和写入
br.close();
bw.close();
}
}
缓冲区的特有方法
package com.itxs.demo02;
import java.io.*;
import java.util.stream.Stream;
/**
* @Classname : demo09
* @Description : TODO 字符流缓冲区的特有方法,一行一行输出
* @Author : lin_refuel@qq.com
*/
public class demo09 {
public static void main(String[] args) throws IOException {
//目标文件
String scr = "D:/JAVA/ce/MyTest.txt";
//写入文件
String copy = "D:/JAVA/ce/MyNewTest.txt";
// 读取类进行封装
BufferedReader br = new BufferedReader(new FileReader(scr));
// 写入类进行封装
BufferedWriter bw = new BufferedWriter(new FileWriter(copy));
// 调用方法
String sc;
//循环写入
while ((sc = br.readLine())!=null){
bw.write(sc);
bw.newLine();
bw.flush();
}
//关闭读取和写入
br.close();
bw.close();
}
}