說明:總結這種東西,要是自己肚子裏沒有電墨水還真的是不那麼容易做到,說錯了不僅害了別人也害了自己。反正不懂的直接百度,不管是理論還是代碼都是一堆一堆的。。。下面直接貼出測試代碼
===========================================
下面進行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()) 。原因當然是相比之前的流來說可以提升文件操作的效率啦~~