1. 程式人生 > >javaAPI_IO流基礎_字節流基礎知識

javaAPI_IO流基礎_字節流基礎知識

leo linu api void 如果 tst class 設計思想 ole


IO流

1.IO流概述
所謂的IO流就是用來進行設備之間的數據傳輸的。


2.IO流分類
(1).按照數據流向
輸入流 讀取數據
輸出流 寫出數據
(2).按照數據類型
字節流
字節輸入流 讀取數據 InputStream
字節輸出流 寫出數據 OutputStream
字符流
字符輸入流 讀取數據 Reader
字符輸出流 寫出數據 Writer
什麽情況下使用哪種流呢?
如果數據所在的文件通過windows自帶的記事本打開並能讀懂裏面的內容,就用字符流。其他用字節流。
如果你什麽都不知道,就用字節流[由此可見,在IO流技術中,常用的也就是這四個操作]


3.OutputStream類
(1).由於該類是一個抽象的基類,所以不能夠實例化,所以我們需要學習其子類。

(2).FileOutputStream類

A:構造方法
FileOutputStream(File file)
FileOutputStream(String path)
FileOutputStream(String path,boolean true):指定是否需要追加,true表示可以追加,false表示不可以追加

註意事項1:
//創建對象
FileOutputStream fos = new FileOutputStream("test.txt");做了哪一些事情?

a:調用系統功能,創建文件test.txt
b: 創建fos對象
c: 把fos對象指向這一個文件

B:相關方法
public void write(int b);把一個字節寫入指定對象文件中
public void write(byte[] b);把一個字節數組寫入指定對象中
public void write(byte[] b,int off,int len);把字節數組的部分寫入指定對象中



C:方法測試:要求在項目的根目錄下面的文件test.txt中寫入字符串"helloworld"

public static void main(String[] args) throws IOException {
//創建對象
FileOutputStream fos = new FileOutputStream("test.txt");
fos.write("helloworld".getBytes());
//釋放資源(因為在傳遞這一個字節的通道一直在開著)
fos.close();
}

//註意:為什麽要關閉流對象?
a:為了讓流對象變成垃圾,方便資源回收。
b: 告訴系統去釋放和該文件相關的資源。


D:FileOutputStream實現數據換行以及數據追加
a:如何實現數據的換行?
在程序中,實現數據的換行可以加入表示符號:
windows:\r\n;
linux:\n
mac:\r
b:如何實現數據的追加寫入?
使用構造方法帶第二個參數是true的情況即可

c:代碼實現
public static void main(String[] args) throws IOException {
//創建對象
FileOutputStream fos = new FileOutputStream("test.txt",true);
for(int i = 0;i<10;i++){
fos.write(("helloworld"+i).getBytes());
fos.write("\r\n".getBytes());
}
//釋放資源(因為在傳遞這一個字節的通道一直在開著)
fos.close();
}


E:異常處理在FileOutputStream類中的使用
public static void main(String[] args) {
FileOutputStream fos = null;

try {
fos = new FileOutputStream("test.txt",true);
fos.write("helloworld".getBytes());
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{

if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}


4.FileInputStream類

(1).構造方法
FileInputStream(String path)

(2).相關方法
public int read():一次讀取一個字節,如果已經到達文件的末尾,則返回-1
public int read(byte[] b):一次讀取一個字節數組,如果已經到達文件的末尾,則返回-1


(3).使用FileInputStream讀取數據基本測試代碼[一次讀取一個字節]
public static void main(String[] args) throws IOException {
//創建對象
FileInputStream fis = new FileInputStream("test.txt");
//讀取數據
int by = 0;
//讀取,賦值,判斷
while ((by = fis.read()) != -1) {
System.out.print((char) by);
}
//釋放資源
fis.close();

}

(4).使用FileInputStream讀取數據基本測試代碼[一次讀取一個字節數組*****]
public static void main(String[] args) throws IOException {
//創建對象
FileInputStream fis = new FileInputStream("test.txt");
//讀取數據
//讀取數組的長度一般是1024或者是1024的整數倍,因為1k=1024個字節
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}
//釋放資源
fis.close();

}

5.字節緩沖輸出流(BufferedOutPutStream)/字節緩沖輸入流(BufferedInputStream)

(1).概述:
字節流一次讀寫一個數組的速度明顯比一次讀寫一個字節的速度快很多,這是加入了數組這樣的緩沖區效果,java本身在設計的時候,
也考慮到了這樣的設計思想(裝飾設計模式後面講解),所以提供了字節緩沖區流


(2).BufferedOutPutStream類
A:構造方法
BufferedOutPutStream(outPutStream out):創建一個緩沖區輸出流,使用默認緩沖區大小
BufferedOutPutStream(outPutStream out,int size):指定緩沖區大小,一般不用指定,使用默認就已經足夠了。

註意:
為什麽不傳遞一個具體的文件或者文件路徑,而是傳遞一個OutputStream對象呢?
原因很簡單,字節緩沖區流僅僅提供緩沖區,為高效而設計的。但是呢,真正的讀寫操作還得靠基本的流對象實現。


B:基本使用測試:
public static void main(String[] args) throws IOException {
// 簡單寫法
// BufferedOutputStream(OutputStream out)
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("bos.txt"));

// 寫數據
bos.write("hello".getBytes());

// 釋放資源
bos.close();
}


(3).BufferedInputStream類

A:構造方法
BufferedInputStream(InputStream out):創建一個緩沖區輸入流,使用默認緩沖區大小
BufferedInputStream(InputStream out,int size):指定緩沖區大小,一般不用指定,使用默認就已經足夠了。

B:基本使用測試

public static void main(String[] args) throws IOException {
// BufferedInputStream(InputStream in)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bos.txt"));
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}

// 釋放資源
bis.close();
}





6.字節流常見的相關操作

(1).字節流復制粘貼文件[即上傳下載]
/*
* 需求:把c:\\a.txt內容復制到d:\\b.txt中
*
* 數據源:
* c:\\a.txt -- 讀取數據 -- FileInputStream
* 目的地:
* d:\\b.txt -- 寫出數據 -- FileOutputStream
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
// 封裝數據源
FileInputStream fis = new FileInputStream("c:\\a.txt");
FileOutputStream fos = new FileOutputStream("d:\\b.txt");

// 復制數據
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}

// 釋放資源
fos.close();
fis.close();
}
}


(2).使用4種方式復制MP4文件到指定文件中[*****]

/*
* 需求:把e:\\哥有老婆.mp4復制到當前項目目錄下的copy.mp4中
*
* 字節流四種方式復制文件:
* 基本字節流一次讀寫一個字節: 共耗時:117235毫秒
* 基本字節流一次讀寫一個字節數組: 共耗時:156毫秒
* 高效字節流一次讀寫一個字節: 共耗時:1141毫秒
* 高效字節流一次讀寫一個字節數組: 共耗時:47毫秒
*/
public class CopyMp4Demo {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
// method1("e:\\哥有老婆.mp4", "copy1.mp4");
// method2("e:\\哥有老婆.mp4", "copy2.mp4");
// method3("e:\\哥有老婆.mp4", "copy3.mp4");
method4("e:\\哥有老婆.mp4", "copy4.mp4");
long end = System.currentTimeMillis();
System.out.println("共耗時:" + (end - start) + "毫秒");
}

// 高效字節流一次讀寫一個字節數組:
public static void method4(String srcString, String destString)
throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
srcString));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destString));

byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}

bos.close();
bis.close();
}

// 高效字節流一次讀寫一個字節:
public static void method3(String srcString, String destString)
throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
srcString));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destString));

int by = 0;
while ((by = bis.read()) != -1) {
bos.write(by);

}

bos.close();
bis.close();
}

// 基本字節流一次讀寫一個字節數組
public static void method2(String srcString, String destString)
throws IOException {
FileInputStream fis = new FileInputStream(srcString);
FileOutputStream fos = new FileOutputStream(destString);

byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}

fos.close();
fis.close();
}

// 基本字節流一次讀寫一個字節
public static void method1(String srcString, String destString)
throws IOException {
FileInputStream fis = new FileInputStream(srcString);
FileOutputStream fos = new FileOutputStream(destString);

int by = 0;
while ((by = fis.read()) != -1) {
fos.write(by);
}

fos.close();
fis.close();
}
}

javaAPI_IO流基礎_字節流基礎知識