<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # JAVA之旅(二十七)——字節流的緩沖區,拷貝mp3,自定義字節流緩沖區,讀取鍵盤錄入,轉換流InputStreamReader,寫入轉換流,流操作的規律 * * * > 我們繼續來聊聊I/O ## 一.字節流的緩沖區 > 這個,和我們的字符流基本上沒有什么差別,我們來拷貝mp3,看例子 ~~~ // 通過字節流的緩沖區拷貝圖片 public static void copyMp3() { try { FileInputStream fi = new FileInputStream("audio.mp3"); BufferedInputStream buf = new BufferedInputStream(fi); FileOutputStream fio = new FileOutputStream("audioCapy.mp3"); BufferedOutputStream buo = new BufferedOutputStream(fio); int ch = 0; while ((ch = buf.read()) != -1) { buo.write(ch); } buf.close(); buo.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ~~~ > 這樣,就直接拷貝了 ![這里寫圖片描述](http://img.blog.csdn.net/20160709085335274) ## 二.自定義字節流緩沖區 > 我們隊緩沖區已經了解很多了,這樣的話,我們來嘗試解析他的原理然后自定義一個字節流的緩沖區出來,來看看對不對 ~~~ class MyBufferedImputStream { private InputStream in; private byte[] buf = new byte[1024]; private int pos = 0; private int count = 0; public MyBufferedImputStream(InputStream in) { this.in = in; } // 從緩沖區一次讀一個字節 public int myRead() throws IOException { // 通過in對象讀取硬盤上的數據,存儲在buf if (count == 0) { count = in.read(buf); if (count < 0) return -1; byte b = buf[pos]; count--; pos++; return b; } else if (count > 0) { byte b = buf[pos]; pos++; count--; return b; } return -1; } //關閉流 public void myClose() throws IOException { in.close(); } } ~~~ > 思路是比較清晰的,想知道對不對,小伙伴趕緊去試試 ## 三.讀取鍵盤錄入 > 這個其實早就要講,現在講就有點晚了,就是鍵盤輸入文字讀取 ~~~ package com.lgl.hellojava; import java.io.IOException; import java.io.InputStream; public class HelloJJAVA { public static void main(String[] args) throws IOException { /** * 通過鍵盤錄入數據 當錄入一行數據后,打印 發現over,停止 */ InputStream in = System.in; StringBuilder sb = new StringBuilder(); while (true) { int ch = in.read(); if (ch == '\r') continue; if (ch == '\n') { String s = sb.toString(); if ("over".equals(s)) break; System.out.println(s); // delte all sb.delete(0, sb.length()); } else sb.append(ch); } } } ~~~ > 當我們寫完之后就發現,這個寫法我們之前是有寫過的,就是readLine的原理,這樣的話,我們可以對其進行改造一下,但是這里就產生了一個新的問題,一個是字符流,一個是字節流,那這里也就產生了一個思考,能不能將字節流轉換成字符流,再去使用它緩沖區的readLine方法呢? ## 四.轉換流InputStreamReader > java中需要轉換流就會使用到轉換流,使用到了InputStreamReader,你會發現十分的方便的 ~~~ package com.lgl.hellojava; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class HelloJJAVA { public static void main(String[] args) throws IOException { //獲取鍵盤錄入對象 InputStream in = System.in; //轉換 InputStreamReader isr = new InputStreamReader(in); //提高效率 BufferedReader bur = new BufferedReader(isr); String line = null; while((line = bur.readLine()) != null){ if(line.equals("over")) break; System.out.println(line.toString()); } } } ~~~ > 我們來演示一下 ![這里寫圖片描述](http://img.blog.csdn.net/20160709095031952) ## 五.寫入轉換流 > 我們轉換流的read學完了,我們就來學習一下write.我們繼續增強上面的方法 ~~~ package com.lgl.hellojava; 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 HelloJJAVA { public static void main(String[] args) throws IOException { //獲取鍵盤錄入對象 InputStream in = System.in; //轉換 InputStreamReader isr = new InputStreamReader(in); //提高效率 BufferedReader bur = new BufferedReader(isr); OutputStream os = System.out; OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bufw = new BufferedWriter(osw); String line = null; while((line = bur.readLine()) != null){ if(line.equals("over")) break; bufw.write(line.toString()); bufw.newLine(); bufw.flush(); } } } ~~~ > OK,實現的功能也是正常的了; ## 六.流操作的規律 > 我們寫了這么多流,我們來總結一下規律 * 1? * 源:鍵盤錄入 * 目的:控制臺 * 2 : 需求:想把鍵盤錄入的數據存儲到一個文件中? * 源:鍵盤 * 目的:文件 * 3.需求:想要將一個文件的數據打印在控制臺上? * 源:文件 * 目的:控制臺 > 流操作的基本規律 * 最痛苦的就是不知道流對象要用哪一個 * 通過兩個明確來完成? * 1.明確源和目的? * 源:輸入流 InputStream Reader * 目的:輸出流 OutputStream writer * 2.明確操作的數據是否是純文本? * 是:字符流 * 不是:字節流 * 3.當體系明確后,再明確要使用哪個具體的對象? * 通過設備來進行區分 * 源設備:內存,硬盤,鍵盤 * 目的:內存,硬盤,控制臺。 > 前面兩個是比較重要的,也可以明確出來,第三個就是加分項了 > > I/O就先到這里了,我們下篇繼續聊,同時開始講File了 ## 有興趣的可以加群:555974449 版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看