1. 程式人生 > >IO流之字元流與字元緩衝流

IO流之字元流與字元緩衝流

在I/O類庫中,java.io.InputStream和java.io.OutputStream分別表示位元組輸入流和位元組輸出流,它們都是抽象類,不能例項化,資料流中的最小單位是位元組,所以叫做位元組流。

  

一、InputStream中的讀取資料的方法如下:

  1 、int read()

  功能:讀取一個位元組的資料,並且返回讀到得資料,如果返回-1,則表示讀到輸入流的末尾。

  2、int read(byte[] b)

  功能:從輸入流中讀取一定量的位元組,並將其儲存在位元組陣列b中,返回實際讀取的位元組數,如果返回-1,則表示讀到輸入流的末尾。

  3、int read(byte[] b, int off, int len)

  功能:將資料讀入一個位元組陣列,同時返回讀取的實際位元組數,如果返回-1,則表示讀到輸入流的末尾。off指定在陣列b中存放資料的起始偏移位置,len指定讀取的最大位元組數。

  4、available()

  功能:返回此輸入流下一個方法呼叫可以不受阻塞地從此輸入流讀取或跳過的估計位元組數。

  5、close()

  功能:關閉輸入流,釋放這個流的相關資源。

二、OutputStream中寫入資料的方法如下:

  1 、int write(int b)

  功能:將b的最低的一個位元組寫入此輸入流,其他三個位元組丟棄。

  2、int write(byte[] b)

  功能:將指定的位元組陣列b寫入此輸入流。

  3、int write(byte[] b, int off, int len)

  功能:將指定byte陣列中從偏移量off開始的len個位元組寫入輸入流。

  4、flush()

  功能:重新整理此輸入流並強制寫出所有緩衝的輸出位元組數。

  5、close()

  功能:關閉輸出流,釋放這個流的相關資源。

①位元組陣列輸入流:

複製程式碼
 1 package com.iotest;
 2 
 3 import java.io.ByteArrayInputStream;
 4 import java.io.IOException;
 5 public class ByteArryInputStreamDemo {
6 public static void main(String[] args) throws IOException { 7 String str = "abcdefghijk"; 8 byte[] strBuf = str.getBytes(); //字串轉換成位元組陣列 9 ByteArrayInputStream bais = new ByteArrayInputStream(strBuf); 10 int data = bais.read(); //從位元組陣列輸入流讀取位元組 11 while(data!=-1){ 12 char upper = Character.toUpperCase((char)data); 13 System.out.print(upper+" "); 14 data = bais.read(); 15 } 16 bais.close(); 17 } 18 }
複製程式碼

程式執行結果:A B C D E F G H I J K

②位元組陣列輸出流:

複製程式碼
 1 package com.iotest;
 2 
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 
 6 public class ByteArrayOutputStreamDemo {
 7     public static void main(String[] args) throws IOException {
 8         ByteArrayOutputStream baos = new ByteArrayOutputStream();
 9         String s = "welcome to use ByteArrayOutputStreamDemo";
10         byte[] buf = s.getBytes();  
11         baos.write(buf); //將指定的byte陣列寫到位元組陣列輸出流中
12         System.out.println(baos.toString());  //將位元組陣列輸出流內容轉換成字串輸出
13         //將位元組陣列輸出流中的內容複製到位元組陣列中
14         byte[] b = baos.toByteArray();
15         for (int i = 0; i < b.length; i++) {
16             System.out.print((char)b[i]);
17         }
18         baos.close();
19     }
20 }
複製程式碼

程式執行結果:
welcome to use ByteArrayOutputStreamDemo
welcome to use ByteArrayOutputStreamDemo

③檔案輸入輸出流的使用

複製程式碼
 1 package com.iotest;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 //複製圖片
 9 public class FileInputStreamDemo {
10     public static void main(String[] args) throws IOException {
11         File file = new File("F:\\shar\\test\\logo17.gif");
12         FileInputStream fis = new FileInputStream(file); //建立一個輸入流
13         //建立一個輸出流,後面一個引數true表示追加,原有內容不會被清除,預設為false
14         FileOutputStream fos = new FileOutputStream("F:\\shar\\test\\logo18.gif",false);
15         int ch = 0;
16         //方式一
17         /*while((ch=fis.read()) != -1){
18             fos.write(ch);
19         }*/
20         //方式二
21         /*byte[] b = new byte[1024];
22         while((ch=fis.read(b)) != -1){
23             fos.write(b,0,ch);
24         }*/
25         //方式三
26         byte[] b = new byte[fis.available()];
27         fis.read(b); //首先把fis的內容讀到位元組陣列b裡面
28         fos.write(b);//再把位元組陣列b的內容通過輸出流寫到指定檔案
29         //關閉流
30         fos.close();
31         fis.close();
32     }
33 
34 }
複製程式碼

④管道流的使用:
  一個PipedInputStream物件必須和一個PipedOutputStream物件進行連線從而產生一個通訊管道。通常一個執行緒從管道輸出流寫入資料,另一個執行緒從管道輸入流中讀取資料。當執行緒A執行管道輸入流的read()方法時,如果暫時沒有資料,這個執行緒就會被阻塞,只有當執行緒B想管道輸出流寫了資料後,執行緒A才會恢復執行。

複製程式碼
package com.iotest;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/*
 * 管道流
 */
class Sender extends Thread{
    private PipedOutputStream out = new PipedOutputStream();
    public PipedOutputStream getOut() {
        return out;
    }
    @Override
    public void run() {

        String s = "hello world";
        try {
            out.write(s.getBytes());
            out.close();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
public class Receiver extends Thread{
    private PipedInputStream in;
    public Receiver(Sender sender) throws IOException {
        in = new PipedInputStream(sender.getOut());
    }
    @Override
    public void run() {
        try {
            int data;
            while((data=in.read())!=-1){
                System.out.print((char)data);
            }
            in.close();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    public static void main(String[] args) throws IOException {
        Sender sender = new Sender();
        Receiver r = new Receiver(sender);
        sender.start();
        r.start();
    }

}
複製程式碼


⑤緩衝流的使用:

複製程式碼
 1 package com.iotest;
 2 
 3 import java.io.BufferedInputStream;
 4 import java.io.BufferedOutputStream;
 5 import java.io.FileInputStream;
 6 import java.io.FileNotFoundException;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 
10 public class TestPrime {
11     private BufferedInputStream bis = null;
12     private BufferedOutputStream bos = null;
13     String fileName = "F:\\shar\\test\\test2.txt";
14     static int s,p;
15     //判斷是否是質數
16     public boolean isPrime(int n){
17         for(int i=2;i<=n/2;i++){
18             if(n%i == 0){
19                 return false;
20             }
21         }
22         return true;
23     }
24     void printPrime(int m) throws IOException{
25         //將位元組流轉緩衝流
26         bos = new BufferedOutputStream(new FileOutputStream(fileName));
27         int j = 0;
28         for (int i = 2; i < m; i++) {
29             if(isPrime(i)){
30                 j++;
31                 if(j%s == 0){
32                     String s = String.valueOf(i)+" ";
33                     bos.write(s.getBytes());
34                     bos.write("\r\n".getBytes());
35                 }else{
36                     String s = String.valueOf(i)+" ";
37                     bos.write(s.getBytes());
38                 }
39             }
40         }
41         bos.flush();
42         bos.close();
43     }
44     void getPrime() throws IOException{
45         //將位元組流轉緩衝流
46         bis = new BufferedInputStream(new FileInputStream(fileName));
47         int c = bis.read();
48         while(c != -1){
49             char ch = (char)c;
50             System.out.print(ch);
51             c = bis.read();
52         }
53     }
54     /**
55      * @param args
56      * @throws IOException 
57      */
58     public static void main(String[] args) throws IOException {
59         TestPrime t = new TestPrime();
60         p = 100;
61         s = 10;
62         t.printPrime(p);
63         t.getPrime();
64     }
65 
66 }
複製程式碼

相關推薦

萌新學Java初入門徑九----緩衝

轉換流 OutputStreamWriter(字元流轉向位元組流的橋樑) 1.將程式中的字元 按照 建立轉換流時給出的編碼格式 去查對應的碼錶(GBK就去查GBK格式的碼錶) 2.將查到的兩個或三個位元組 交給建立轉換流時 傳入的位元組流 3.最終時

【圖論】最大EK演算法Dinic演算法及最小費用最大

最大流: 給出一張網路圖,並指定源點和終點,每條邊都有它的容量,起點有著無限的流量,求從源點到經過的所有路徑的最終到達匯點的最大流量和。對於同一個節點,流入的流量之和和流出的流量之和相同,即假如結點1有12流量流入結點2,結點2分別有8流量流入結點3,4流量流入結點4,這種

《黑馬程式設計師》 合併檔案切割合併的工具類

class FileUtils { /* 檔案的切割與合併的工具類 */ public static void main(String[] args) { File file=new File("c:\\test.avi"); File srcD

網路最小費用最大

具體思路:建好圖之後,每一次從源點到匯點走最短路,如果能走到就加上,如果走不到就停止。具體注意細節在程式碼中解釋。 AC程式碼: #include<iostream> #include<string> #include<cstring&g

C語言寬字元——字符集字元編碼和寬字元之間的關係

前言: 距上一篇博文,已經是3個月的時間了,忙碌著專案開發,無暇顧及部落格。現在專案總算是結束了一個段落,是該總結的時候。4月份將會更新幾篇文章,都是在專案中遇到的問題,然後再深入瞭解之後總結出來的,希望通過這個平臺能與更多的人有更多的交流。 正文: 我在做日誌管理這一部

網路最小費用最大 D

題目連結 建圖: 源點到人的費用為0容量為1; 每個人到每個房子建一條邊,費用為這個房子到這個人的距離,容量為1; 房子到終點的費用為0容量為1; 做這個題時,找了半天bug,首先注意房子和人的個數不是n,誤以為n,調錯了好久,還有sum,num的初始

c: string 字元指標字元陣列的區分

來看一段簡單的程式碼,以區分字元指標與字元陣列在表達字串時的一些區別。 #include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) {

C語言 字元陣列字元指標比較

#include<stdio.h> /*   字元陣列會在定以後預先分配記憶體空間字串是常量所以會直接把字串拷貝到陣列中,   因為陣列地址不同,所以不相等·   字元指標不會預先分配記憶體空間,直接指向字串常量,所以地址相同.  */ void compare

IO字元字元緩衝

在I/O類庫中,java.io.InputStream和java.io.OutputStream分別表示位元組輸入流和位元組輸出流,它們都是抽象類,不能例項化,資料流中的最小單位是位元組,所以叫做位元組流。  一、InputStream中的讀取資料的方法如下:  1 、int

io學習位元組字元之間的轉換

一、 public class TypeToChar { /** 位元組流轉換成字元流* * 1、位元組流轉換成位元組流的物件,(InputStreamReader(叫做轉換流):作用:就是位元組流通* 向字元流之間轉換的橋樑,位元組流和字元流的轉換存在著編碼的方式。*

Java實用方法整理(二十二)——IO字元緩衝BufferedReader、BufferedWriter

1,描述 BufferedReader、BufferedWriter是java為了高效傳輸IO字元流而設計的一種緩衝類,用法和FileWriter,FileReader類似。BufferedReader、BufferedWriter只是對FileWriter,FileRea

IO(File類,IO的分類,位元組字元,轉換緩衝,物件序列化)

1.File類 File類可以在程式中 操作檔案和目錄。File類是通過建立File類物件,在呼叫File類的物件來進行相關操作的。 示例: --------------------- 本文來自 dajiahuooo 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/

Java:IO:探究位元組字元

前言---- 本來不想寫前言了,但是寫完,發現寫得太好了,遇到就好好看一看啊!!!! 注:歡迎轉載,轉載請註明來處 目錄 一. 簡單理解什麼是流? 二.位元組輸入流 三.位元組輸出流 四.流的正確關閉方式 五.字元輸入流 六.字元輸出流 七.位元組流和字元流的

Java IO字元

1.字元輸出流 Writer(只能寫入文字檔案) 1.1FileWriter類(writer的子類) 構造方法: public class FileWriterDemo { public static void main(String[] args) throws IOE

Java路:位元組字元

儘管可以使用File進行檔案的操作,但是如果要進行檔案內容的操作,在Java之中就必須通過兩類流操作完成。 Java的流操作分為位元組流和字元流兩種。 字元流處理的物件單元是Unicode字元,每個Unicode字元佔據2個位元組,而位元組流輸入輸出的資料是以單個位元組(Byte

Java——IO(三)字元的讀寫拷貝、裝飾設計模式

1.字元流的學習(FileReader與FileWriter):字元流是可以直接讀寫字元的IO流(只讀或者只寫時使用字元流)          (1)字元流讀取字元就要先讀取到位元組資料,然後轉化為字元;如果要寫出字元,需要把字元轉化為位元組再寫出          (2)讀

java IO--字元緩衝

/** * ClassName: BufferStreamDemo2 * @Description: 字元快取流 * 1.加入字元快取流,增強讀取功能(readLine) * 2.更高效的讀取資料 * FileReader:內部使用InputStreamReade

Java 高階程式設計-IO位元組字元

1. 簡介 2. 位元組輸出流OutputStream 3. 位元組輸入流InputStream 4. 字元輸出流Writer 5. 字元輸入流Reader 6. 位元組流與字元流的區別 7. 轉

IO(位元組,字元,緩衝)

一:IO流的分類(組織架構) 根據處理資料型別的不同分為:字元流和位元組流 根據資料流向不同分為:輸入流和輸出流     這麼龐大的體系裡面,常用的就那麼幾個,我們把它們抽取出來,如下圖:        二:字元位元組,輸入輸出流的概念      字元流和位元組流       字元流的由來: 因為資料

Java學習筆記--------IO字元實現純文字拷貝

字元流 輸入流:Reader,FileReader 輸出流:Writer,FileWriter 字元流只能處理純文字,全部為可見字元(.txt或者.html)。下面實現純文字的拷貝: public class CopyFileDemo { public sta