天天看點

黑馬程式員_<<轉換流(InputStreamReader,OutputStreamWriter)>>1.位元組流轉換成字元流(InputStreamReader)2. 位元組輸入流轉換成字元輸入流(OutputStreamWriter)3.     流操作(轉換流練習)4. 流操作規律5. 改變标準輸入輸出裝置6. 異常日志檔案7.系統屬性資訊

--------------------ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! --------------------

1.位元組流轉換成字元流(InputStreamReader)

            位元組流:InputStream   -------讀取

     字元流:Reader       ------讀取

     在位元組流讀取的時候用的是一個一個位元組的讀取方式或者是位元組數組的讀取方式,

在字元流中讀取的時候,除了有一個一個字元的讀取方式和數組 的讀取 方式外 ,在緩沖技術裡面有一行一行的讀取,這個方法在讀取的時候很好用也很方面,那麼我們就可以把位元組流的轉換成字元流,然後利用緩沖對象來使用讀取一行的方法。

字元流要向獲得從鍵盤錄入的資訊,那麼必須使用位元組流,然後把位元組流準換成字元流

步驟:

   1.準備好一個位元組流(InputStream  in)

   2.利用InputStreamReader(isr)把位元組流對象作為其構造函數的參數,new InputStreamReader(in)

   3.然後使用緩沖技術(BufferedReader對象封裝轉換流)newBufferedReader(isr),然後就可以使用讀取行的方法了。

   4.最後要關閉流

舉例:讀取鍵盤的錄入的資料

InputStream in = System.in;

     InputStreamReader isr =new InputStreamReader(in);

    BufferedReader br =newBufferedReader(isr);

然後我們就可以使用br對象紀念性讀取鍵盤錄入的資料了。

我們也可以把這三句轉換成一句。

BufferedReader bw = new BufferedReader (isr));

2. 位元組輸入流轉換成字元輸入流(OutputStreamWriter)

      字元流:Writer   -----寫入流

位元組流:OutputStream  ---寫入流

OutputStreamWriter 是字元流通向位元組流的橋梁:可使用指定的

charset

将要寫入流中的字元編碼成位元組。

步驟:

1.準備一個字元流

2.利用OutputStreamWriter(OutputStream out)把其轉換成位元組流,

3.可以利用其緩沖對象對其進行封裝。然後做相應的操作。

4.最後關閉流

 舉例:

OutputStream out = System.out;

OutputStreamWriter osw = new OutputStreamWriter(out);

BufferedWriter bw = new BufferedWriter(osw);

也可以将這三句合成一句話

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

3.     流操作(轉換流練習)

        1.   源:鍵盤錄入  (輸出)目的:控制台

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 ZhuanhuanDemo {
 
  public static void main(String[] args) throws IOException {
    /*InputStream in = System.in;//原始鍵盤
    InputStreamReader isr = new InputStreamReader(in);
    BufferedReader br = new BufferedReader(isr);//封裝類字元流*/
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
    /*OutputStream out = System.out;//輸出的目的是控制台
    OutputStreamWriter osw = new OutputStreamWriter(out);//将字元流轉換成位元組流
    BufferedWriter bw = new BufferedWriter(osw);*/
   
    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();
    }
 
  }
 
}結果:
張三
輸入的内容是:張三
李四
輸入的内容是:李四
abc
輸入的内容是:abc
over
           

            2.  源:鍵盤  輸出目的:檔案

就是将鍵盤錄入的資料寫到了檔案中

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class ZhuanhuanDemo {
 
  public static void main(String[] args) throws IOException {
 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:鍵盤
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream("F:\\demo.txt")));// 目的:檔案
 
    String line = null;
    while ((line = br.readLine()) != null) {
      if ("over".equals(line))
         break;
      bw.write(line);//寫入
      bw.newLine();
      bw.flush();
    }
    bw.close();// 關閉流
    br.close();// 關閉流
 
  }
 
}
 
           

    3. 源:檔案  目的:控制台

将檔案的内容列印在控制台上

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 ZhuanhuanDemo {
 
  public static void main(String[] args) throws IOException {
 
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\demo.txt")));// 源:文本
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));// 目的:控制台
 
    String line = null;
    while ((line = br.readLine()) != null) {
      bw.write(line);//輸出
      bw.newLine();
      bw.flush();
    }
    bw.close();// 關閉流
    br.close();// 關閉流
 
  }
 
}
結果:
張三
李四
王五
           

4. 流操作規律

1.明确源和目的

源:輸入流:InputStream   Reader

目的:輸出流:OutputStream Writer

2.操作的資料是否是純文字

     是:字元流

     不是:位元組流

3.當體系明确後,在明确要使用那個具體的對象。

通過裝置來進行區分:

源裝置:記憶體,硬碟,鍵盤

目的記憶體:記憶體,硬碟,控制台

需求:

1.将一個檔案資料存儲到另一個檔案中,複制檔案

 源:檔案  使用讀取流: InputStream Reader

            是否是文本檔案: 是:用Reader

             明确對象:明确裝置:硬碟中的檔案FileReader對象

提高效率。利用緩沖區。BufferedReader。

FileReader fr=new FileReader(“a.txt”);

BufferedReader br=new BufferedReader(fr);

目的 :檔案:OutputStream Writer

是否是純文字:Writer

裝置:硬碟中的檔案

提高效率。利用緩沖區。BufferedWriter。

對象:FileWriter

FileWriter fw=new FileWriter();

BufferedWriter bw=new BufferedWriter(fw);

2.需求

将鍵盤錄入的資料儲存到另一個檔案中。

源:InputStream Reader

純文字:Reader

裝置:鍵盤 對象 System.in

 InputStreamReader idr=new InputStreamReader(System.in);

 提高效率用BufferedReader

BufferedReader bufr=new BufferedReader(idr);

目的:OurStream ,Writer

     純文字:Writer

 裝置:硬體的檔案

  FileWrite fw=new FileWriter(“檔案”);

 BufferefWriter bufW=new BufferefWriter(fw);

要指定編碼方式,必須使用轉換流,OutputStreamWriter擴充:指定編碼方式

OutputStreamWriter(OutputStream out,String charsetName)      

OutputStreamWriter osw=new OutputStreamWriter(newFileOutputStream(“F:\\demo.txt”,”utf-8”))這制訂了編碼方式;

在轉換流構造方法中指定。

當需要指定編碼方式的時候,那麼就需要此轉換流OutputStreamWriter。

當需要指定編碼方式的時候那麼就需要轉換流來操作。

當需要讀取别的編碼方式的檔案的時候,也得需要使用轉換流

位元組流不用重新整理緩沖區,字元流要重新整理緩沖區

public class ZhuanhuanDemo {
 
  public static void main(String[] args) throws IOException {
 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:鍵盤
    /*預設的編碼是jbk。*/
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
         new FileOutputStream("F:\\demo1.txt"),"utf-8"));// 目的:控制台
 
    String line = null;
    while ((line = br.readLine()) != null) {
      if ("over".equals(line))
         break;
      bw.write(line);// 輸出
      bw.newLine();
      bw.flush();
    }
    bw.close();// 關閉流
    br.close();// 關閉流
 
  }
           

當你輸入兩個漢字就結束的話,那麼檔案大小是8個位元組,要是預設的話就是6個位元組,指定GBK的話,那也是6個位元組,是以可以确認預設的是GBK編碼。

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 ZhuanhuanDemo {
 
  public static void main(String[] args) throws IOException {
 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:鍵盤
    /*預設的編碼是jbk。*/
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
         new FileOutputStream("F:\\demo1.txt"),"utf-8"));// 目的:控制台
 
    String line = null;
    while ((line = br.readLine()) != null) {
      if ("over".equals(line))
         break;
      bw.write(line);// 輸出
      bw.newLine();
      bw.flush();
    }
    bw.close();// 關閉流
    br.close();// 關閉流
 
  }
 
}
           

5. 改變标準輸入輸出裝置

public static void main(String[] args) throws IOException {
/*
 * static void setIn(InputStream in)改變輸入裝置
 * static void setOut(PrintStream out)改變輸出的裝置目的
 * */
    System.setIn(new FileInputStream("F:\\demo.txt"));//把輸入裝置定義到了一個檔案流上,就是源:檔案
    System.setOut(new PrintStream("F:\\demo1.txt"));//把輸入裝置定義到一個檔案上,就是把内容輸入到一個檔案中
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:鍵盤
    /*預設的編碼是jbk。*/
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
         new FileOutputStream("F:\\demo1.txt"),"utf-8"));// 目的:控制台
 
    String line = null;
    while ((line = br.readLine()) != null) {
      if ("over".equals(line))
         break;
      bw.write(line);// 輸出
      bw.newLine();
      bw.flush();
    }
    bw.close();// 關閉流
    br.close();// 關閉流
 
  }
           

6. 異常日志檔案

      我們可以将程式中出現的異常儲存到一個檔案中,那麼我就可以友善我們檢視,在開發中也是把異常列印到檔案中,不可能讓使用者看到異常。我們也可以下載下傳logf4工具,這是專門處理異常的工具。

下面我們寫一個位元組的異常日志檔案。

void  

printStackTrace(PrintStream s)

          将此 throwable 及其追蹤輸出到指定的輸出流。
public class ExceptionDemo {
  public static void main(String[] args) {
    try {
      int a = 4 / 0;
    } catch (Exception e) {
      try {
         PrintStream ps = new PrintStream("F:\\exception.log");
         SimpleDateFormat sdf = new SimpleDateFormat(
             "yyyy-MM-DDHH:mm:ss");
         String s = sdf.format(new Date());
         ps.println(s);//将日期傳進入
         e.printStackTrace(ps);// 将流傳入,指定目的
      } catch (FileNotFoundException e1) {
         System.out.println("日志檔案建立失敗");
      }
 
    }
 
  }
 
}
 
結果:
           
黑馬程式員_<<轉換流(InputStreamReader,OutputStreamWriter)>>1.位元組流轉換成字元流(InputStreamReader)2. 位元組輸入流轉換成字元輸入流(OutputStreamWriter)3.     流操作(轉換流練習)4. 流操作規律5. 改變标準輸入輸出裝置6. 異常日志檔案7.系統屬性資訊

7.系統屬性資訊

系統日志

将系統的實作存到檔案中

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Properties;
 
public class PropertiesDemo {
 
  public static void main(String[] args) {
    /*list(PrintStream out)将屬性清單輸出到指定的輸出流。*/
    Properties p=new Properties();
    p=System.getProperties();
    try {
      p.list(new PrintStream("F:\\SystemInfo.txt"));
    } catch (FileNotFoundException e) {
      System.out.println("建立檔案失敗");
    }
  }
 
}
 
           
黑馬程式員_<<轉換流(InputStreamReader,OutputStreamWriter)>>1.位元組流轉換成字元流(InputStreamReader)2. 位元組輸入流轉換成字元輸入流(OutputStreamWriter)3.     流操作(轉換流練習)4. 流操作規律5. 改變标準輸入輸出裝置6. 異常日志檔案7.系統屬性資訊

--------------------ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! --------------------