Java IO之處理流(緩衝流、轉換流)
阿新 • • 發佈:2019-02-14
一、處理流:
增強功能,提供效能,在節點流之上。
二、節點流與處理流的關係
節點流(位元組流、字元流)處於IO操作的第一線,所有操作必須通過它們進行;
處理流可以對其他流進行處理(提高效率或操作靈活性)。
三、緩衝流
1、位元組緩衝流
BufferedInputStream
BufferedOutputStream
package IOBuffer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 處理流(位元組緩衝流)
* 位元組流檔案拷貝+緩衝流,提高效能
* 緩衝流(節點流)
*/
@SuppressWarnings("all")
public class Demo01 {
public static void main(String[] args) {
String srcPath = "G:/1314.jpg";
String destPath = "G:/try/520.jpg" ;
try {
copyFile(srcPath,destPath);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void copyFile(String srcPath,String destPath) throws IOException
{
//1、建立聯絡 源存在(且為檔案)+目的地(檔案可以不存在)
File src = new File(srcPath);
File dest = new File(destPath);
if(!src.isFile())
{
System.out.println("只能拷貝檔案");
throw new IOException("只能拷貝檔案");
}
//2、選擇流 緩衝流(位元組輸入流)
InputStream is = new BufferedInputStream(new FileInputStream(src));
OutputStream os =new BufferedOutputStream(new FileOutputStream(dest)) ;
//3、檔案拷貝 迴圈+讀取+寫出
byte[] flush = new byte[1024];
int len = 0;
while(-1!=(len = is.read(flush)))
{
//寫出
os.write(flush,0,len);
}
os.flush();//強制刷出
//關閉流 先開啟後關閉
os.close();
is.close();
}
}
2、字元緩衝流
BufferedReader 新增readLine()讀取一個文字行。
BufferedWriter 新增newLine()寫入一個行分隔符。
package IOBuffer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
*
* 字元緩衝流+新增方法(不能發生多型)
*/
public class Demo02 {
public static void main(String[] args) {
String srcPath = "G:/oo.txt";
String destPath = "G:/xx.txt";
//建立源
File src = new File(srcPath);
File dest = new File(destPath);
//選擇流 緩衝流 如果後面要使用新增方法,就不能使用多型了。
//如果沒有使用子類的新增方法,可以使用多型方式。
/*Reader reader = null;
Writer writer = null;
reader =new BufferedReader(new FileReader(src)) ;
writer = new BufferedWriter(new FileWriter(dest));
reader.read(flush)
writer.write(flush,0,len)*/
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader =new BufferedReader(new FileReader(src)) ;
writer = new BufferedWriter(new FileWriter(dest));
//讀取操作
//新增方法操作的字元緩衝流
String line = null;//一行一行讀取 BufferedReader新增readLine()
while(null!=(line = reader.readLine()))
{
writer.write(line);
//writer.append("\r\n");//換行符
writer.newLine();//換行符 新增方法
}
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("檔案不存在");
} catch (IOException e) {
e.printStackTrace();
}
finally
{
if(null!=reader)
{
try {
writer.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、轉換流
(一)位元組流轉換為字元流,處理亂碼(編碼集、解碼集)
解碼:二進位制–>解碼字符集–>字元
編碼:字元–>編碼字符集–>二進位制
(二)為什麼會出現亂碼?
1、解碼與編碼的字符集不統一
2、位元組缺少,長度丟失
(三)檔案亂碼(通過轉換流進行處理)
package IOConver;
import java.io.UnsupportedEncodingException;
public class Demo01 {
public static void main(String[] args) {
test01();
System.out.println("-----------");
test02();
}
//解碼與編碼字符集字符集必須相同
public static void test01()
{
//解碼byte-->char
String str = "中國";//UTF-8
//編碼 char-->byte
byte[] data = str.getBytes();
//編碼與解碼的字符集統一
System.out.println(new String(data));
try {
data = str.getBytes("gbk");//設定編碼字符集 編碼
//不統一字符集,出現亂碼
System.out.println(new String(data));//解碼
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] data2;
try {
//編碼
data2 = "中國".getBytes("GBK");
//解碼
str = new String(data2,"GBK");
//str = new String(data2);//不指定 預設解碼UTF-8 會出現亂碼
System.out.println(new String(str));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
//位元組缺少,長度丟失
public static void test02(){
String str = "中國";
byte[] data;
data = str.getBytes();//編碼
//位元組數不完整
System.out.println(new String(data,0,4));
}
}
執行結果:
�й�
中國
-----------
中�
package IOConver;
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;
/**
* 轉換流:位元組轉為字元
* 1、輸出流OutputStreamWriter 編碼
* 2、輸入流InputStreamReader 解碼
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
//輸入檔案 解碼 (位元組到字元) 讀取 要顯示
//指定解碼字符集 BufferedReader字元流--InputStreamReader轉換流--FileInputStream位元組流
BufferedReader br = new BufferedReader
(
new InputStreamReader
(
new FileInputStream(new File("g:/writer.txt")),"UTF-8"
)
);//指定字元解碼集
//寫出檔案 編碼(字元到位元組)
BufferedWriter bw = new BufferedWriter
(
new OutputStreamWriter
(
new FileOutputStream(new File("G:/try/abdec.txt")),"UTF-8"
)
);
String info = null;
while(null!=(info = br.readLine()))
{
System.out.println(info);
bw.write(info+"\r\n");
}
bw.flush();
bw.close();
br.close();
}
}
執行結果:
每個人都有青春,
每個青春都有一個故事,
每個故事都有一個遺憾,
每個遺憾卻都存在著他的美好。ouye