字符流=字节流+编码表
编码表
ASCII码表
ISO-8859-1 拉丁码表
gb2312 简体中文表
gbk 中文编码表升级
gb18030 GBK的取代版本
BIG-5 繁体字编码方案
Unicode 国际编码表/所有文字都用两个字节来表示,java使用的就是Unicode
UFT-8 最多用三个字节来表示一个字符
字符串的编码和解码
String(byte[] bytes, String charsetName) //通过制定的字符集解码字节数组
byte[ ] getBytes(String charsetName) //使用制定的字符集合把字符串编码为字节数组
编码:把看得懂的变成看不懂的 String---->byte[ ]
解码:把看不懂的变成看得懂的 byte[ ] ---->String
package cn.itcast_01;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/*
* String(byte[] bytes, String charsetName) //通过制定的字符集解码字节数组
byte[ ] getBytes(String charsetName) //使用制定的字符集合把字符串编码为字节数组
编码:把看得懂的变成看不懂的 String---->byte[ ]
解码:把看不懂的变成看得懂的 byte[ ] ---->String
*/
public class StringDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "你好";
// String---->byte[ ]
byte[] bys = s.getBytes();
byte[] bys2 = s.getBytes("GBK");
byte[] bys3 = s.getBytes("UTF-8");
System.out.println(Arrays.toString(bys)); //[-60, -29, -70, -61]
System.out.println(Arrays.toString(bys2)); //[-60, -29, -70, -61]
System.out.println(Arrays.toString(bys3)); //[-28, -67, -96, -27, -91, -67]
//byte[ ] ---->String
String ss = new String(bys);
String ss2 = new String(bys,"gbk");
String ss3 = new String(bys,"UTF-8");
System.out.println(ss); //你好
System.out.println(ss2); //你好
System.out.println(ss3); //???
byte[] bys31 = s.getBytes("UTF-8");
String ss31 = new String(bys31,"UTF-8");
System.out.println(ss31); //你好
}
}
类 OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName) //指定编码表
package cn.itcast_02;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
* OutputStreamWriter(OutputStream out) //默认编码表
* OutputStreamWriter(OutputStream out, String charsetName) //指定编码表
* 把字节流转换为字符流
* 字符流=字节流+编码表
*/
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
//创建对象
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("osw.txt")); //默认GBK
OutputStreamWriter osw2 = new OutputStreamWriter(
new FileOutputStream("osw2.txt"),"GBK"); //指定GBK
//写数据
osw.write("中国");
osw2.write("中国");
//释放
osw.close();
osw2.close();
}
}
类 OutputStreamReader
OutputStreamReader(OutputStream out, String charsetName) //指定编码表读取数据
package cn.itcast_02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* 类 OutputStreamReader
构造方法:
OutputStreamReader(OutputStream out) //默认编码表读取数据
OutputStreamReader(OutputStream out, String charsetName) //指定编码表读取数据
*/
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//创建对象
InputStreamReader isr = new InputStreamReader(
new FileInputStream("osw.txt"));
//读取
int ch =0;
while((ch=isr.read())!= -1){
System.out.print((char)ch);
}
//释放
isr.close();
}
}
字符流的5种写数据的方式:
* OutputStreamWriter写数据的方法
* public void write(int c) //写入单个字符
* public void write(char[] cbuf) //写入字符数组
* public void write(char[] cbuf,int off, int len) //写入字符数组的一部分
* public void write(String str) //写入字符串
* public void write(String str,int off,int len) //写入字符串的一部分
package cn.itcast_03;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
* OutputStreamWriter写数据的方法
* public void write(int c) //写入单个字符
* public void write(char[] cbuf) //写入字符数组
* public void write(char[] cbuf,int off, int len) //写入字符数组的一部分
* public void write(String str) //写入字符串
* public void write(String str,int off,int len) //写入字符串的一部分
*/
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
//创建字符流对象
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("osw3.txt"));
//写数据
osw.write('a');
osw.write(97);
//public void write(char[] cbuf) //写入字符数组
char[] chs = {'a','b','c','d'};
osw.write(chs);
// public void write(char[] cbuf,int off, int len) //写入字符数组的一部分
osw.write(chs, 0, 2);
//public void write(String str) //写入字符串
osw.write("中国你好");
//public void write(String str,int off,int len) //写入字符串的一部分
String str = "helloworld";
osw.write(str, 0, 6);
//刷新缓冲区
osw.flush(); //写入数据时,数据只存在缓冲区,还没到文件,所以要刷新后写入文件
//释放资源
osw.close();
}
}
字符流的2种读数据的方式:
* int read() 一次读取一个字符
* int read(char[] chs) 一次读取一个字符数组
package cn.itcast_03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* InputStreamReader的方法
* int read() 一次读取一个字符
* int read(char[] chs) 一次读取一个字符数组
*/
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//创建字符流对象
InputStreamReader isr = new InputStreamReader(
new FileInputStream("osw3.txt"));
//读出数据
//一次读取一个字符
int ch = 0;
while((ch = isr.read())!=-1){
System.out.print((char)ch);
}
//一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while((len=isr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
//释放资源
isr.close();
}
}
package cn.itcast_04;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
* 练习:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
*/
public class CopyFileTest_01 {
public static void main(String[] args) throws IOException {
//创建字符流对象
InputStreamReader isr = new InputStreamReader(
new FileInputStream("a.txt"));
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("b.txt"));
//读取写出数据
char[] chs = new char[1024];
int len = 0;
while((len = isr.read(chs))!=-1){
osw.write(chs, 0, len);
}
//刷新缓冲区
osw.flush();
//释放资源
isr.close();
osw.close();
}
}
————————————————————————————————————
字符缓冲流
BufferedWriter 字符缓冲输出刘
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法:
BufferedWriter(Writer out)
范例:
package cn.itcast_05;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
* BufferedWriter
*
*/
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲流对象
/* BufferedWriter bf = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("c.txt")));*/
//简写成
BufferedWriter bf = new BufferedWriter(
new FileWriter("c.txt"));
//写入数据
bf.write("hello");
bf.write("world");
bf.write("java");
bf.flush();
bf.close();
}
}
BufferedReader 字符缓冲输入流
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
构造方法:
BufferedReader(Reader in)
范例:
package cn.itcast_05;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/*
* BufferedReader
* 构造方法:
BufferedReader(Reader in)
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
//创建字符流对象
BufferedReader br = new BufferedReader(
new FileReader("b.txt"));
//读出数据
char[] chs = new char[1024];
int len;
while((len = br.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
//释放资源
br.close();
}
}
练习01:字符缓冲流复制文本文件
package cn.itcast_06;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 字符缓冲流复制文本文件
*/
public class CopyFileTest_01 {
public static void main(String[] args) throws IOException {
//创建缓冲流对象
BufferedReader br = new BufferedReader(
new FileReader("f:\\a.txt"));
BufferedWriter bw = new BufferedWriter(
new FileWriter("g:\\b.txt"));
//读写文件
char[] chs = new char[1024];
int len;
while((len = br.read(chs))!=-1){
bw.write(chs, 0, len);
}
//释放资源
br.close();
bw.close();
}
}
字符缓冲流的特殊方法:
* BufferedWrirer
* public void newLine() : 根据系统来决定换行符
范例:
package cn.itcast_06;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
* 字符缓冲流的特殊方法
* BufferedWrirer
* public void newLine() : 根据系统来决定换行符
* BufferedReader
* public void readLine() : 一次读取一行
*/
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
//输出数据
for (int x =0;x<10;x++){
bw.write("hello"+x);
bw.newLine(); //根据系统来决定换行符,自动识别系统
bw.flush();
}
//释放资源
bw.close();
}
}
* BufferedReader
* public void readLine() : 一次读取一行(根据换行符来决定)
范例:
package cn.itcast_06;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 字符缓冲流的特殊方法
* BufferedWrirer
* public void newLine() : 根据系统来决定换行符
* BufferedReader
* public void readLine() : 一次读取一行
*/
public class BufferedDemo {
public static void main(String[] args) throws IOException {
write();
read();
}
private static void read() throws IOException {
//创建字符缓冲输入流对象
BufferedReader bf = new BufferedReader(new FileReader("bw.txt"));
//输入数据
/* //方法一
char[] chs = new char[1024];
int len;
while((len = bf.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}*/
//方法二 //一次读取一行
String line = null;
while((line = bf.readLine())!=null){
System.out.println(line);
}
//释放资源
bf.close();
}
private static void write() throws IOException {
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
//输出数据
for (int x =0;x<10;x++){
bw.write("hello"+x);
bw.newLine(); //根据系统来决定换行符,自动识别系统
bw.flush();
}
//释放资源
bw.close();
}
}