说明:总结这种东西,要是自己肚子里没有电墨水还真的是不那么容易做到,说错了不仅害了别人也害了自己。反正不懂的直接百度,不管是理论还是代码都是一堆一堆的。。。下面直接贴出测试代码
===========================================
下面进行FileWriter和FileReader类的测试:(原先测试的时候没有给其设置编码,所以导致中文乱码,以下已经设置了GBK编码,所以读写不会出现乱码。)
package com.lin.filewriterandreader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import org.junit.Test;
public class TestWriterAndReader {
@Test
public void testFileReader(){
// FileReader fr = null;
InputStreamReader isr = null;
try {
File file = new File("C:/Users/Administrator/Desktop/hello1.txt");
// fr = new FileReader(file);
isr = new InputStreamReader(new FileInputStream(file), "GBK");
//每次读取的字符数
char[] c = new char[24];
//记录每次读取的长度
int len;
while((len = isr.read(c)) != -1){
String str = new String(c, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(isr!=null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*==========================================================*/
/**
* 使用FileReader FileWriter 可以实现文本文件的复制。
* 对于非文本文件(视频、音频、图片等),只能使用字节流!
**/
@Test
public void testFileInputStreamOutputStream(){
//1.提供读入、写出的文件
File file1 = new File("C:/Users/Administrator/Desktop/hello1.txt");
File file2 = new File("C:/Users/Administrator/Desktop/hello2.txt");
//2.提供相应的流
//输入流对应的文件一点要存在,否则抛出异常。输出流对应的文件可以不存在,执行过程中会自动创建。
// FileReader fr = null;
// FileWriter fw = null;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
// fr = new FileReader(file1);
// fw = new FileWriter(file2);
isr = new InputStreamReader(new FileInputStream(file1), "GBK");
osw = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
//3.实现文件的读取并写入(复制)
char[] c = new char[24];//每次读取到的数据要写入的数组
int len;//每次读入到byte中的字节的长度
while((len=isr.read(c)) != -1){
osw.write(c, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(isr!=null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(osw!=null){
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
=================================================
下面进行BufferedReader和BufferedWriter类的测试:(同样解决了中文乱码,都是一样的处理方式)
package com.lin.bufferedwriterreader;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import org.junit.Test;
/**
IO的体系
* 抽象基类 节点流(文件流) 缓冲流(处理流的一种,可以提升文件操作的效率)
* InputStream FileInputStream BufferedInputStream
* OutputStream FileOutputStream BufferedOutputStream(写完数据后要调用flush())
* Reader FileReader BufferedReader(readLine())
* Writer FileWriter BufferedWriter(写完数据后要调用flush())
**/
public class TestBuffered {
@Test
public void testBufferedReader(){
BufferedReader br = null;
BufferedWriter wr = null;
try {
File file = new File("C:\\Users\\Administrator\\Desktop\\1.txt");
File file2 = new File("C:\\Users\\Administrator\\Desktop\\3.txt");
// FileReader fr = new FileReader(file);
// FileWriter fw = new FileWriter(file2);
InputStreamReader inStream = new InputStreamReader(new FileInputStream(file), "GBK");
OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
br = new BufferedReader(inStream);
wr = new BufferedWriter(writerStream);
/*char[] c = new char[1024];
int len;
while((len=br.read(c))!=-1){
String str = new String(c,0,len);
System.out.println(str);
}*/
String str;
while((str=br.readLine())!=null){
System.out.println(str);//,每次读取一行数据并每次显示一行数据在控制台上
wr.write(str+"\n");//将读取的数据存储在文件中
wr.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//使用BufferedInputStream和BufferedOutputStream实现非文本文件的复制
@Test
public void BufferedInputOutputStream(){
//3.将创建的结点流的对象作为形参传递给缓冲流的构造器中
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.提供读入、写出的文件
File file1 = new File("C:\\Users\\Administrator\\Desktop\\7.jpg");
File file2 = new File("C:\\Users\\Administrator\\Desktop\\72.jpg");
//2.创建相应的节点流,FileInputStream、FileOutputStream
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//4.具体的实现文件复制的操作
byte[] b = new byte[1024];//每次读取的字节数
int len;//用来记录每次读取的字节数的长度
while((len=bis.read(b))!=-1){
bos.write(b,0,len);
bos.flush();//如果最后一次读取的时候数据没有存满,则强制发送,否则有可能在一直等待
}
} catch (IOException e) {
e.printStackTrace();
}finally{//关闭相应的流
if(bos!=null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bis!=null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
======================================================
小结,在实际开发中缓冲流最经常被使用:BufferedInputStream、BufferedOutputStream(写完数据后要调用flush())、BufferedReader(readLine())、BufferedWriter(写完数据后要调用flush()) 。原因当然是相比之前的流来说可以提升文件操作的效率啦~~