IO
3、字符流
3.1、字符流出现的原因
由于字节流操作中文不是特别方便,所以java就提供了字符流
- 字符流=字符流+编码表
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最底层操作会自动进行字节拼接成中文,如何是被是中文。
- 汉字在存储的时候,无论选择那种编码存储,第一个字节都是负数
3.1、字符流写数据的五种方式
- void write(int c)
写一个字符 - void write(char[] cbuf)
写入一个字符数组 - void write(char[] cbrf,int off,int len)
写入字符数组的一部分 - void write(String str)
写一个字符串 - void write(String str,int off,int len)
写一个字符串的一部分
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
//创建一个使用默认字符编码的OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\JavaProject\\czxJava\\fos.txt"));
//void write (int c):写一个字符
// osw.write(91);
// //void flush():刷新流
// osw.flush();
// osw.write(92);
// osw.flush();
// osw.write(93);
// char[] ch = {'a','b','c','d'};
// osw.write(ch,0,2);
String str = "hello,you are ...";
osw.write(str,0,str.length());
//释放资源
osw.close();
}
}
3.2、字符流读数据的俩种方式
- int read() 一次读一个字符数据
- int read(char[] cbuf) 一次读一个字符数组数据
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//InputStreamReader(InputStream in),创建一个使用默认字符集的InputStreamReader
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt"));
//int read() 一次读取一个字符数据
// int ch;
// while ((ch=isr.read())!=-1){
// System.out.print((char)ch);
// }
//int read(char[] cbuf) 一次读取一个字符数组数据
char[] ch = new char[1024];
int len;
while ((len=isr.read(ch))!=-1){
System.out.println(new String(ch,0,len));
}
//释放资源
isr.close();
}
}
3.2.1、案例1:复制Java
import java.io.*;
public class CopyDemo1 {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\JavaProject\\czxJava\\copy.java"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\JavaProject\\czxJava\\src\\JavaIO\\ConversionStreamDemo.java"));
//一次读写一个字符数据
// int len;
// while ((len = isr.read())!=-1){
// osw.write(len);
// }
//一次读取一个字符数组
char[] ch = new char[1024];
int len;
while ((len = isr.read(ch))!=-1){
osw.write(ch,0,len);
}
osw.close();
isr.close();
}
}
升级版
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\JavaProject\\czxJava\\src\\JavaIO\\ConversionStreamDemo.java");
FileWriter fw = new FileWriter("D:\\JavaProject\\czxJava\\copy.java");
int ch;
while ((ch=fr.read())!=-1){
fw.write(ch);
}
fr.close();
fw.close();
}
}
3.3、字符缓冲流
3.3.1、字符缓冲流
- BufferedWiter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者接受默认大小。默认值足够大,可用于大多数用途。
- BufferedReader:从字符输入流读取文本,缓冲字符,以提供单个字符,数组和字符串的高效读取,可以指定缓冲区的大小,或者使用默认大小。默认值足够大,可用于大多数用途。
import java.io.*;
public class BufferStreamDemo {
public static void main(String[] args) throws IOException {
/*
FileOutputStream fos = new FileOutputStream("D:\\JavaProject\\czxJava\\fos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//写数据
bos.write("hello,you are so stupid\r\n".getBytes());
bos.write("i'm serious\r\n".getBytes());
bos.close();
*/
FileInputStream fis = new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
// int data;
// while ((data = bis.read()) != -1){
// System.out.print((char)data);
// }
//一次读取一个字节数组
byte[] bys = new byte[1024];
int len;
while((len= bis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
System.out.println();
bis.close();
}
}
3.3.2、案例:复制java文件
import java.io.*;
public class CopyJava {
public static void main(String[] args) throws IOException {
//根据数据源创建字符缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("D:\\JavaProject\\czxJava\\src\\JavaIO\\StringDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\JavaProject\\czxJava\\copy.java"));
char[] ch = new char[1024];
int len;
while ((len=br.read(ch)) != -1){
bw.write(ch);
}
//关闭资源
bw.close();
br.close();
}
}
3.3.3、字符缓冲流特有功能
- Bufferedwriter:void newLin() 写一行行分隔符,行分隔符字符串有系统属性定义
- BufferedReader:String readLine() 读一行文字,结果包含行的内容的字符串,不包含任何行终止字符,如果流的结尾已经到达,则返回null。
import java.io.*;
public class BufferedStreamDemo1 {
public static void main(String[] args) throws IOException {
// BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\JavaProject\\czxJava\\bw.txt"));
//
// bw.write("hello,dhp");
//
// bw.close();
BufferedReader br = new BufferedReader(new FileReader("D:\\JavaProject\\czxJava\\bw.txt"));
/*
String line = br.readLine();
System.out.println(line);
line = br.readLine();
System.out.println(line);
line = br.readLine();
System.out.println(line);
line = br.readLine();
System.out.println(line);
*/
String line;
while ((line=br.readLine()) != null){
System.out.println( line);
}
br.close();
}
}