Java笔记 字符流
1. OutputStreamWriter类
构造方法
构建流对象
FileOutputStream fileOutput = new FileOutputStream("TestIO\\demo04.txt");
OutputStreamWriter writer = new OutputStreamWriter(fileOutput,"GBK");
方法的调用
writer.write("我是一个好人");
writer.write(new char[] {'的','额'});
writer.flush();
想要在程序结束前将缓冲区里的数据写入磁盘,除了填满缓冲区或关闭输出流外,还可以主动调用flush()方法。
2. InputStreamReader类
构造方法
构建流对象
InputStreamReader reader = new InputStreamReader(new FileInputStream("TestIO\\demo04.txt"),"GBK");
System.out.println((char)reader.read());//read()返回的是一个int类型的字节
char[] data = new char[1024];
int length = reader.read(data); // read(data)返回的是所读字节数
System.out.println(new String(data,0,length));
3. FileReader类
FileReader是InputStreamReader的子类,重写了构造方法,其他方法基本没变
构造方法
构建流对象
FileReader writer = new FileReader(TestIO\\demo04.txt");
4. FileWriter类
FileWriter是OutputStreamWriter的子类,重写了构造方法,其他方法基本没变
构造方法
构造流对象
FileWriter reader = new FileWriter("TestIO\\demo04.txt");
5. BufferedWriter
使用缓冲流,可提高字符流处理的效率
构造方法
构建流对象
BufferedWriter writer = new BufferedWriter(new FileWriter("TestIO\\demo05.txt"));
方法的调用
writer.write("www.sikiedu.com是一个很...的网站",0,3);
writer.flush();
6. BufferedReader
构造方法
构建流对象
BufferedReader reader = new BufferedReader(new FileReader("TestIO\\demo04.txt"));方法的调用
System.out.println((char)reader.read());
char[] data = new char[1024];
reader.read(data);
System.out.println(new String(data));
7. 练习,运用字符流进行复制
导入包:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.junit.Test;
测试方法:
public class Demo13_Practice {
@Test
public void testCopy() {
long start = System.currentTimeMillis();//记录法一开始复制的时间
copyByChar("TestIO\\demo04.txt", "TestIO\\demo05.txt");//调用法一复制
System.out.println(System.currentTimeMillis()-start);//输出复制法一所用时间
start = System.currentTimeMillis();//记录法二开始复制的时间
copyByCharArray("TestIO\\demo04.txt", "TestIO\\demo06.txt");//调用法二复制
System.out.println(System.currentTimeMillis()-start);//输出复制法二所用时间
}
法一,使用read();方法一个字节一个字节复制,效率慢,该方法返回的是一个int类型的字节
public void copyByChar(String sourceName,String targetName) {
BufferedReader reader=null;
//声明流对象 放在try外部,以便在finally关闭流
BufferedWriter writer = null;
try {
reader = new BufferedReader(new FileReader(sourceName));
//构建流对象
writer = new BufferedWriter(new FileWriter(targetName));
int data = -1;
while( (data = reader.read())!=-1 ) {
writer.write(data);
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer!=null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(reader!=null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
法二,使用read(byte[] b)方法进行字节数组复制,效率快,该方法返回的是所读字节数。
public void copyByCharArray(String sourceName,String targetName) {
BufferedReader reader=null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new FileReader(sourceName));
writer = new BufferedWriter(new FileWriter(targetName));
char[] data = new char[1024];
int length = -1;
while( (length = reader.read(data))!=-1 ) {
writer.write(data, 0, length);
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer!=null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(reader!=null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}