3 字符流
3.1 为什么会出现字符流
由于字节流操作中文不是特别方便所以Java就提供字符流
字符流=字节流+编码表
3.2 字符串中的编码解码问题
编码:
- byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
- byte[] getBytes(String charsetName): 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
解码:
- String (byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
- String (byte[] bytes,String charsetName): 通过指定的字符集解码指定的字节数组来构造新的String
public static void main(String[] args) throws Exception {
String s="中国";
//使用平台默认方式编码
byte[] bys=s.getBytes();
System.out.println(Arrays.toString(bys));
//使用自定义编码方式
byte[] bytes = s.getBytes("GBK");
System.out.println(Arrays.toString(bytes));
//使用平台默认方式解码
String s1 = new String(bys);
System.out.println(s1);
//使用自定义解码方式
String s2 = new String(bytes,"GBK");
System.out.println(s2);
}
3.3 字符流中的编码解码问题
字符流抽象基类
- Reader: 字符输入流的抽象类
- Writer:字符输出流的抽象类
字符流中和编码解码问题相关的两个类:
- InputStreamReader:是从字节流到字符流的桥梁
- OutputStreamWriter:是从字符流到字节流的桥梁
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\itcast\\java.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
osw.write("中国");
osw.close();
FileInputStream fis= new FileInputStream("D:\\\\itcast\\\\java.txt");
InputStreamReader isr = new InputStreamReader(fis,"GBK");
int ch; while((ch=isr.read())!=-1)
{
System.out.print((char)ch);
}
isr.close();
}
3.4 字符流写数据的5种方式
方法名 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[ cbuf, int off, int len]) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void wite(String str, int off, int len) | 写一个字符串的一部分 |
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\itcast\\osw.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write(97);
osw.flush();//刷新流,将缓冲区的字符流写入文件
char[] ch= {'a','a','b','b'};
osw.write(ch);
osw.flush();
osw.write(ch,1,3);
osw.flush();
String s="abcdefg";
osw.write(s);
osw.flush();
osw.write(s,1,3);
osw.close();//先刷新再关闭
}
3.5 字符流读数据的2种方式
方法名 | 说明 |
---|---|
int read( ) | 一次读一个字符 |
int read(char[] cbuf) | 一次读一个字符数组 |
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\itcast\\osw.txt");
InputStreamReader isr = new InputStreamReader(fis);
//一次读一个字符
// int ch;
// while((ch=isr.read())!=-1) {
// System.out.print((char)ch);
// }
//一次读一个字符数组
char[] chs=new char[1024];
int len;
while((len=isr.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
isr.close();
}
3.6 字符缓冲流
字符缓冲流:
- BufferedWriter: 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途。
- BufferedReader: 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途。
构造方法:
- BufferedWriter( Writer out)
- BufferedReader(Reader in)
public static void main(String[] args) throws IOException {
// BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\itcast\\bw.txt"));
// bw.write("Hello\r\n");
// bw.write("world\r\n");
// bw.close();
BufferedReader br = new BufferedReader(new FileReader("D:\\itcast\\bw.txt"));
int ch;
while((ch=br.read())!=-1) {
System.out.print((char)ch);
}
}
3.7 字符缓冲流特有功能
BufferedWriter:
- void newLine( ): 写一行行分隔符,行分隔符字符由系统属性定义
BufferedReader:
- public String readLine( ): 读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
public static void main(String[] args) throws IOException {
//创建字符缓输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\itcast\\bw.txt"));
//写数据
for(int i=0; i<10; i++) {
bw.write("Hello "+i);
bw.newLine();
bw.flush();
}
bw.close();
}
案例
-
复制java文件
需求:将模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java
public static void main(String[] args) throws IOException { //根据数据源创建字符输入流对象 InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java")); //根据目的地创建字符输出流对象 OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("Copy.java")); //读写数据,复制文件 int ch; while((ch=isr.read())!=-1) { osw.write(ch); } /* char[] ch=new char[1024]; int len; while((len=isr.read(ch))!=-1) { osw.write(ch,0,len); } */ isr.close(); osw.close(); }
-
复制java文件改进版
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
FileReader isr=new FileReader("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java");
//根据目的地创建字符输出流对象
FileWriter osw=new FileWriter("Copy.java");
//读写数据,复制文件
/*
* int ch; while((ch=isr.read())!=-1) { osw.write(ch); }
*/
char[] ch=new char[1024];
int len;
while((len=isr.read(ch))!=-1) {
osw.write(ch,0,len);
}
isr.close();
osw.close();
}
- 复制 Java 文件(字符缓冲流改进版)
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
BufferedReader isr=new BufferedReader(new FileReader("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java"));
//根据目的地创建字符输出流对象
BufferedWriter osw=new BufferedWriter(new FileWriter("Copy.java"));
//读写数据,复制文件
/*
* int ch; while((ch=isr.read())!=-1) { osw.write(ch); }
*/
char[] ch=new char[1024];
int len;
while((len=isr.read(ch))!=-1) {
osw.write(ch,0,len);
}
isr.close();
osw.close();
}
- 复制 java 文件(字符缓冲流特有功能改进版)
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
BufferedReader br=new BufferedReader(new FileReader("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java"));
//根据目的地创建字符输出流对象
BufferedWriter bw=new BufferedWriter(new FileWriter("Copy.java"));
//读写数据,复制文件
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}