Java IO流系列(四)—— 從位元組流及其緩衝區到轉換流
阿新 • • 發佈:2019-02-16
前言:位元組流和前面的字元流在用法上大同小異,故而簡述帶過,不再詳述。主要是搞清楚兩者的差異,知道什麼時候用位元組流,比如說我們的圖片,System.in, System.out都是位元組流。本文將以複製圖片的小例子簡述位元組流及其緩衝區,最後引出轉換流與前面的字元流做統一。
原文出處:http://blog.csdn.net/u014158743/article/details/52695142
使用位元組流複製圖片
圖片是以位元組的形式儲存的,故而只能用位元組流不能用字元流。
public static void main(String[] args)
{
//使用位元組流複製圖片
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
fis = new FileInputStream("s.jpg");
fos = new FileOutputStream("s_copy.jpg");
byte[] arr = new byte[1024];
int len =0;
while((len = fis.read(arr))!=-1)
{
fos.write(arr,0 ,len);
}
}
catch (IOException e)
{
throw new RuntimeException("圖片複製失敗");
}
finally
{
if(fis!=null)
try
{
fis.close();
}
catch (IOException e)
{
throw new RuntimeException("檔案讀取流關閉失敗" );
}
if(fos!=null)
try
{
fos.close();
}
catch (IOException e)
{
throw new RuntimeException("檔案寫入流關閉失敗");
}
}
}
使用位元組流緩衝區複製圖片
套上緩衝區減少磁碟讀寫次數,可以增加傳輸速率,提高效能。
public static void main(String[] args)
{
//使用位元組流的緩衝區複製圖片
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
bis = new BufferedInputStream(new FileInputStream("s.jpg"));
bos = new BufferedOutputStream(new FileOutputStream("s_copy_2.jpg"));
byte[] arr = new byte[1024];
int len = 0;
while((len = bis.read(arr))!=-1)
{
bos.write(arr,0,len);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(bis!=null)
try
{
bis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
if(bos!=null)
try
{
bos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
轉換流
/*
使用 System.in實現鍵盤迴圈讀取資料,
實現的程式碼比較麻煩
可以用BufferedReader的readLine()方法的實現,簡化書寫
使用BufferedReader的readLine()方法的實現鍵盤錄入資料
鍵盤輸入流:System.in---位元組輸入流
BufferedReader:字元輸入流
把位元組輸入流轉成字元輸入流:
轉換流:
InputStreamReader:把位元組流轉成字元流
OutputStreamWriter:
*/
import java.io.*;
class Demo
{
public static void main(String[] args)throws IOException
{
//標準的輸入流
InputStream in = System.in;
//把位元組輸入流轉成字元輸入流
InputStreamReader isr = new InputStreamReader(in);
//為了提高效率,把字元輸入流傳遞給BufferedReader的構造方法
BufferedReader br = new BufferedReader(isr);
//標準的輸出流
PrintStream out = System.out;
//把位元組輸出流轉成字元輸出流
OutputStreamWriter osw = new OutputStreamWriter(out);
//為了提高效率,把字元輸出流傳遞給BufferedWriter的構造方法
BufferedWriter bw = new BufferedWriter(osw);
String line = null;
while((line = br.readLine())!=null)
{
if("over".equals(line))
break;
//out.println(line);
bw.write(line);
bw.newLine();//向控制檯寫入換行
bw.flush();
}
br.close();
}
}
指定輸出編碼格式
class Demo
{
public static void main(String[] args) throws IOException
{
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf.txt"),"utf-8");
osw.write("你好");
osw.close();
}
}
System.in和System.out
import java.io.*;
class Demo
{
public static void main(String[] args) throws IOException
{
//System.setIn(new FileInputStream("temp.txt"));//改變標準的輸入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.setOut(new PrintStream("temp2.txt"));//改變標準的輸出
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line = br.readLine())!=null)
{
if("over".equals(line))
break;
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}