Java之IO轉換流

凌.風發表於2014-12-28
直接上碼:
 
讀取鍵盤錄入資料程式碼演示:
 
 
import java.io.IOException;
import java.io.InputStream;
 
 
/**
 *讀取鍵盤錄入的資料,並列印在控制檯上。
 *
 *鍵盤本身就是一個標準的輸入裝置,
 *對於Java而言,
 */
public class ReadKey {
 
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
// readKey();
  readKey_2();
 }
 
 public static void readKey() throws IOException {
  InputStream in = System.in;
 
  int ch = in.read();
  System.out.println(ch);
  int ch1 = in.read();
  System.out.println(ch1);
  int ch2 = in.read();
  System.out.println(ch2);
 
 }
 
 /**
  * 獲取使用者鍵盤錄入的資料,
  * 並將資料變成大寫顯示在控制檯上,
  * 如果使用者輸入的是over,則結束鍵盤錄入
  *
  * 思路:
  * 1,因為鍵盤錄入只讀取一個位元組,要判斷是否是over,需要先將讀到的位元組拼成字串 
  * 2,那就需要一個容器。可以使用StringBuilder
  * 3,在使用者回車之前將錄入的資料變成字串判斷即可。
  * @throws IOException
  */
 public static void readKey_2() throws IOException {
  //建立容器
  StringBuilder sb = new StringBuilder();
  //獲取鍵盤讀取流
  InputStream in = System.in;
  //定義變數記錄讀取到的位元組,並迴圈讀取。
  int ch = 0;
  while((ch = in.read())!=-1){
   //在儲存之前需要判斷是否是換行標記,因為換行標記不存
   if(ch == '\r')
    continue;
   if(ch == '\n'){
    String temp = sb.toString();
    if("over".equals(temp))
     break;
    System.out.println(temp.toUpperCase());
    sb.delete(0,sb.length());
   }else{
    sb.append((char)ch);
   }
  }
 }
}
 

  

流轉換:
    位元組流轉換成字元流InputStreamReader
 
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class TransStreamDemo {
 
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  //位元組流
  InputStream in = System.in;
  //將位元組轉換成字元的橋樑,即轉換流。
  InputStreamReader isr = new InputStreamReader(in);
 
  //字元流
  BufferedReader bufr = new BufferedReader(isr);
  String line = null;
  while((line=bufr.readLine())!=null){
   if("over".equals(line)){
    break;
   }
   System.out.println(line.toUpperCase());
  }
 }
}

  

 
    字元流轉換成位元組流OutputStreamWriter
 
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
 
public class TransStreamDemo {
 
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  //位元組流
  InputStream in = System.in;
  //將位元組轉換成字元的橋樑,即轉換流。
  InputStreamReader isr = new InputStreamReader(in);
 
  //字元流
  BufferedReader bufr = new BufferedReader(isr);
 
  OutputStream out = System.out;
  OutputStreamWriter osw = new OutputStreamWriter(out);
  BufferedWriter bufw = new BufferedWriter(osw);
 
  String line = null;
  while((line=bufr.readLine())!=null){
   if("over".equals(line)){
    break;
   }
   bufw.write(line.toUpperCase());
   bufw.newLine();
   bufw.flush();
  }
 }
}

  

        程式碼重寫
 
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class TransStreamDemo {
 
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); 
  String line = null;
  while((line=bufr.readLine())!=null){
   if("over".equals(line)){
    break;
   }
   bufw.write(line.toUpperCase());
   bufw.newLine();
   bufw.flush();
  }
 }
}
 

  

        複製檔案程式碼演示
 
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class TransStreamDemo {
 
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
  BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
  String line = null;
  while((line=bufr.readLine())!=null){
   if("over".equals(line)){
    break;
   }
   bufw.write(line);
   bufw.newLine();
   bufw.flush();
  }
 }
}
 
 

  

轉換流總結:
    InputStreamReader : 位元組到字元的橋樑,解碼
    OutputStreamWriter : 字元到位元組的橋樑,編碼
流的操作規律:
    首先需弄清楚操作規律的原因是:流的物件太多啦,往往不知道用哪一個物件合適。
    想要知道物件開發時用到哪些物件,只要通過四個條件去明確即可。
 
1, 明確源和目的(匯)
    源:InputStream 和 Reader
    目的:OutputStream 和 Writer
2,明確資料是否是純文字資料。
    源:
            是純文字:Reader
            不是純文字:InputStream
    目的:
            是純文字:Writer
            不是純文字:OutputStream
此時就明確了需要使用哪個體系
 
3,明確具體的裝置
    源裝置:
            硬碟:檔案File
            鍵盤:System.in
            記憶體:陣列
            網路:Socket流
    目的裝置:
            硬碟:檔案File
            控制檯:System.out
            記憶體:陣列
            網路:Socket流
 
4,是否需要其他額外功能。
    1)是否需要高效(緩衝區)
            是就加上Buffer
    2)轉換
    ......
 
 
 
使用轉換流的常見場景:
    1,源或者目的對應的裝置是位元組流,但是操作的卻是文字資料,可以使用轉換流作為橋樑,提高對本文操作的便捷
    2,操作文字涉及到具體的指定編碼表時,必須使用轉換流。
 
 
 

相關文章