java基础----IO-----第四天
第4天 IO流
今日內(nèi)容介紹
u?字節(jié)流
u?字符流
第4章?字節(jié)流
1.1?字節(jié)輸出流OutputStream
OutputStream此抽象類,是表示輸出字節(jié)流的所有類的超類。操作的數(shù)據(jù)都是字節(jié),定義了輸出字節(jié)流的基本共性功能方法。
輸出流中定義都是寫write方法,如下圖:
?
1.1.1?FileOutputStream類
OutputStream有很多子類,其中子類FileOutputStream可用來寫入數(shù)據(jù)到文件。
FileOutputStream類,即文件輸出流,是用于將數(shù)據(jù)寫入 File的輸出流。
l?構(gòu)造方法
?
1.1.2?FileOutputStream類寫入數(shù)據(jù)到文件中
l?將數(shù)據(jù)寫到文件中,代碼演示:
public?class?FileOutputStreamDemo {
public?static?void?main(String[] args) throws?IOException {
//需求:將數(shù)據(jù)寫入到文件中。
//創(chuàng)建存儲數(shù)據(jù)的文件。
File file = new?File("c:\\file.txt");
//創(chuàng)建一個用于操作文件的字節(jié)輸出流對象。一創(chuàng)建就必須明確數(shù)據(jù)存儲目的地。
//輸出流目的是文件,會自動創(chuàng)建。如果文件存在,則覆蓋。
FileOutputStream fos = new?FileOutputStream(file);
//調(diào)用父類中的write方法。
byte[] data = "abcde".getBytes();
fos.write(data);
//關(guān)閉流資源。
fos.close();
}
}
?
1.1.3?給文件中續(xù)寫和換行
我們直接new?FileOutputStream(file)這樣創(chuàng)建對象,寫入數(shù)據(jù),會覆蓋原有的文件,那么我們想在原有的文件中續(xù)寫內(nèi)容怎么辦呢?
繼續(xù)查閱FileOutputStream的API。發(fā)現(xiàn)在FileOutputStream的構(gòu)造函數(shù)中,可以接受一個boolean類型的值,如果值true,就會在文件末位繼續(xù)添加。
l?構(gòu)造方法
?
l?給文件中續(xù)寫數(shù)據(jù)和換行,代碼演示:
public?class?FileOutputStreamDemo2 {
public?static?void?main(String[] args) throws?Exception {
File file = new?File("c:\\file.txt");
FileOutputStream fos = new?FileOutputStream(file, true);
String str = "\r\n"+"itcast";
fos.write(str.getBytes());
fos.close();
}
}
1.1.4?IO異常的處理
在前面編寫代碼中都發(fā)生了IO的異常。我們在實際開發(fā)中,對異常時如何處理的,我們來演示一下。
public?class?FileOutputStreamDemo3 {
public?static?void?main(String[] args) {
File file = new?File("c:\\file.txt");
//定義FileOutputStream的引用
FileOutputStream fos = null;
try?{
//創(chuàng)建FileOutputStream對象
fos = new?FileOutputStream(file);
//寫出數(shù)據(jù)
fos.write("abcde".getBytes());
} catch?(IOException e) {
System.out.println(e.toString() + "----");
} finally?{
//一定要判斷fos是否為null,只有不為null時,才可以關(guān)閉資源
if?(fos != null) {
try?{
fos.close();
} catch?(IOException e) {
throw?new?RuntimeException("");
}
}
}
}
}
1.2?字節(jié)輸入流InputStream
通過前面的學(xué)習(xí),我們可以把內(nèi)存中的數(shù)據(jù)寫出到文件中,那如何想把內(nèi)存中的數(shù)據(jù)讀到內(nèi)存中,我們通過InputStream可以實現(xiàn)。InputStream此抽象類,是表示字節(jié)輸入流的所有類的超類。,定義了字節(jié)輸入流的基本共性功能方法。
?
l?int read():讀取一個字節(jié)并返回,沒有字節(jié)返回-1.
l?int read(byte[]): 讀取一定量的字節(jié)數(shù),并存儲到字節(jié)數(shù)組中,返回讀取到的字節(jié)數(shù)。
1.2.1?FileInputStream類
InputStream有很多子類,其中子類FileInputStream可用來讀取文件內(nèi)容。
FileInputStream 從文件系統(tǒng)中的某個文件中獲得輸入字節(jié)。
l?構(gòu)造方法
?
1.2.2?FileInputStream類讀取數(shù)據(jù)read方法
在讀取文件中的數(shù)據(jù)時,調(diào)用read方法,實現(xiàn)從文件中讀取數(shù)據(jù)
?
l?從文件中讀取數(shù)據(jù),代碼演示:
public?class?FileInputStreamDemo {
public?static?void?main(String[] args) throws?IOException {
File file = new?File("c:\\file.txt");
//創(chuàng)建一個字節(jié)輸入流對象,必須明確數(shù)據(jù)源,其實就是創(chuàng)建字節(jié)讀取流和數(shù)據(jù)源相關(guān)聯(lián)。
FileInputStream fis = new?FileInputStream(file);
//讀取數(shù)據(jù)。使用 read();一次讀一個字節(jié)。
int?ch = 0;
while((ch=fis.read())!=-1){
System.out.pr}intln("ch="+(char)ch);
?
// 關(guān)閉資源。
fis.close();
}
}
?
1.2.3?讀取數(shù)據(jù)read(byte[])方法
在讀取文件中的數(shù)據(jù)時,調(diào)用read方法,每次只能讀取一個,太麻煩了,于是我們可以定義數(shù)組作為臨時的存儲容器,這時可以調(diào)用重載的read方法,一次可以讀取多個字符。
?
public?class?FileInputStreamDemo2 {
public?static?void?main(String[] args) throws?IOException {
/*
?* 演示第二個讀取方法, read(byte[]);
?*/
File file = new?File("c:\\file.txt");
// 創(chuàng)建一個字節(jié)輸入流對象,必須明確數(shù)據(jù)源,其實就是創(chuàng)建字節(jié)讀取流和數(shù)據(jù)源相關(guān)聯(lián)。
FileInputStream fis = new?FileInputStream(file);
//創(chuàng)建一個字節(jié)數(shù)組。
byte[] buf = new?byte[1024];//長度可以定義成1024的整數(shù)倍。
int?len = 0;
while((len=fis.read(buf))!=-1){
System.out.println(new?String(buf,0,len));
}
fis.close();
}
}
1.3?字節(jié)流練習(xí)
既然會了文件的讀和寫操作了,那么我們就要在這個基礎(chǔ)上進行更為復(fù)雜的操作。使用讀寫操作完成文件的復(fù)制。
1.3.1?復(fù)制文件
原理;讀取一個已有的數(shù)據(jù),并將這些讀到的數(shù)據(jù)寫入到另一個文件中。
?
public?class?CopyFileTest {
public?static?void?main(String[] args) throws?IOException {
//1,明確源和目的。
File srcFile = new?File("c:\\YesDir\test.JPG");
File destFile = new?File("copyTest.JPG");
//2,明確字節(jié)流 輸入流和源相關(guān)聯(lián),輸出流和目的關(guān)聯(lián)。
FileInputStream fis = new?FileInputStream(srcFile);
FileOutputStream fos = new?FileOutputStream(destFile);
//3, 使用輸入流的讀取方法讀取字節(jié),并將字節(jié)寫入到目的中。
int?ch = 0;
while((ch=fis.read())!=-1){
fos.write(ch);
}
//4,關(guān)閉資源。
fos.close();
fis.close();
}
}
上述代碼輸入流和輸出流之間是通過ch這個變量進行數(shù)據(jù)交換的。
上述復(fù)制文件有個問題,每次都從源文件讀取一個,然后在寫到指定文件,接著再讀取一個字符,然后再寫一個,一直這樣下去。效率極低。
1.3.2?緩沖數(shù)組方式復(fù)制文件
上述代碼復(fù)制文件效率太低了,并且頻繁的從文件讀數(shù)據(jù),和寫數(shù)據(jù),能不能一次多把文件中多個數(shù)據(jù)都讀進內(nèi)容中,然后在一次寫出去,這樣的速度一定會比前面代碼速度快。
public?class?CopyFileByBufferTest {
public?static?void?main(String[] args) throws?IOException {
File srcFile = new?File("c:\\YesDir\test.JPG");
File destFile = new?File("copyTest.JPG");
// 明確字節(jié)流 輸入流和源相關(guān)聯(lián),輸出流和目的關(guān)聯(lián)。
FileInputStream fis = new?FileInputStream(srcFile);
FileOutputStream fos = new?FileOutputStream(destFile);
//定義一個緩沖區(qū)。
byte[] buf = new?byte[1024];
int?len = 0;
while?((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);// 將數(shù)組中的指定長度的數(shù)據(jù)寫入到輸出流中。
}
// 關(guān)閉資源。
fos.close();
fis.close();
}
}
第2章?字符流
總結(jié)
以上是生活随笔為你收集整理的java基础----IO-----第四天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1天考3科、机考、2科,今年二建考试有哪
- 下一篇: ad hoc检索 routing检索