Java中io流解析及代碼實例
IO流
Java中IO流分為兩種,字節(jié)流和字符流,顧名思義字節(jié)流就是按照字節(jié)來讀取和寫入的,字符劉是按照字符來存取的;常用的文件讀取用的就是字符流,在網(wǎng)絡(luò)通信里面用的就是字節(jié)流
下面這張圖是Java中IO流的總體框架:

字節(jié)流
Java中字節(jié)流一般都是以stream結(jié)尾的,輸入的字節(jié)流叫InputStream,輸出字節(jié)流叫OutputStream;InputStream和OutputStream是表示自己輸入/輸出的所有類的超類,是抽象類(abstract)
常用的字節(jié)流有:
1.FileInputStream/FileOutputStream 2.BufferedInputStream/BufferedOutputStream 3.SequenceInputStream(序列流) 4.ObjectInputStream/ObjectOutputStream(對象的輸入輸出流) 5.PrintStream(打印流)
字符流
Java中輸入字符流是以Reader結(jié)尾的,輸出字符流是以Writer結(jié)尾的,比如我們常見的FileReader和FileWriter就是個字符流,Reader和Witer是輸入/輸出字符流的超類,也是抽象類
常用的字符流有:
1.FileReader/FileWriter 2.BufferedReader/BufferedWriter 3.InputStremReader/OutputStreamWriter(轉(zhuǎn)換流)
轉(zhuǎn)換流
轉(zhuǎn)換流就是將字節(jié)流轉(zhuǎn)換為字符流的類,有兩種:
·InputStreamReader ·OutputStreamWriter
InputStreamReader是個字符流(Reader),需要包裝一個字節(jié)流(InputStream);
OutputStreamWriter是個字符流(Writer),需要包裝一個字節(jié)流(OutputStream)
包裝(decorate)
包裝的作用的就是在原始的對象的基礎(chǔ)上增加新的功能,比如BufferedReader包裝一個Reader,實際就是對Reader功能的增強;原始的Reader只能按照一個字符一個字符的讀取,經(jīng)過包裝之后形成的BufferedReader就具有了新的功能:直接讀取一行(readLine)的功能,直觀上說這就是所謂的Decorate.
在設(shè)計模式上這就是典型的裝飾模式,其特點是:
1.裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互 2.裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結(jié)構(gòu)就可以在外部增加附加的功能
對應(yīng)到我們上來就是,BufferedReader和Reader都是個Reader,通過包裝之后BufferedReader功能增強,但是依然可以當(dāng)做Reader來用(OO的父類引用可以指向子類)
例子
字節(jié)流的例子
將mp3文件切割成多份數(shù),然后重新組合起來
package cn.xdian.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
public class Demo2 {
public static void main(String[] args) throws IOException {
cutFile();
//切割MP3文件
mergeFlile();
//合并MP3文件
}
//合并MP3
public static void mergeFlile() throws IOException{
File dir = new File("/home/gavinzhou/music_test");
//找到文件夾下所有的MP3文件
Vector<FileInputStream> vector = new Vector<FileInputStream>();
File[] files = dir.listFiles();
for (File file : files){
if(file.getName().endsWith(".mp3")){
vector.add(new FileInputStream(file));
}
}
//通過Vector獲取迭代器
Enumeration<FileInputStream> e = vector.elements();
//創(chuàng)建序列流
SequenceInputStream inputStream = new SequenceInputStream(e);
//輸出流
FileOutputStream fileOutputStream = new FileOutputStream("/home/gavinzhou/conbine.mp3");
//讀取分割的MP3文件
byte[] buf = new byte[1024];
int length = 0 ;
while((length = inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//關(guān)閉流
fileOutputStream.close();
inputStream.close();
}
//切割MP3
public static void cutFile() throws IOException{
File file = new File("/home/gavinzhou/test.mp3");
File dir = new File("/home/gavinzhou/music_test");
//輸入字節(jié)流
FileInputStream fileInputStream = new FileInputStream(file);
//讀取文件
byte[] buf = new byte[1024*1024];
int length = 0;
for (int i = 0 ; (length = fileInputStream.read(buf))!=-1 ; i++){
FileOutputStream fileOutputStream = new FileOutputStream(new File(dir,"part"+i+".mp3"));
fileOutputStream.write(buf,0,length);
fileOutputStream.close();
}
//關(guān)閉流
fileInputStream.close();
}
}
字符流的例子
拷貝文件A變?yōu)槲募﨎
package cn.xidian.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File sourceFile = new File("/home/gavinzhou/a.txt");
File desFile = new File("/home/gavinzhou/b.txt");
//創(chuàng)建輸入流
BufferedReader input = new BufferedReader(new FileReader(sourceFile));
//創(chuàng)建輸出流
BufferedWriter output = new BufferedWriter(new FileWriter(desFile));
//讀取源文件,寫入到新的文件
String line = null;
while((line = input.readLine()) != null){
output.write(line);
output.newLine();
}
//關(guān)閉輸入輸出流
input.close();
output.close();
}
}
打印流的例子
package cn.xidian.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
/*
打印流可以打印任意類型的數(shù)據(jù),打印數(shù)據(jù)之前都會先把數(shù)據(jù)轉(zhuǎn)換成字符串再進行打印
*/
class Animal{
String name;
String color;
public Animal(String name,String color){
this.name = name;
this.color = color;
}
@Override
public String toString() {
return "名字:"+this.name+ " 顏色:"+ this.color;
}
}
public class Demo6 {
public static void main(String[] args) throws IOException {
/*
File file = new File("/home/gavinzhou/a.txt");
//創(chuàng)建打印流
PrintStream printStream = new PrintStream(file);
//打印任何信息到文件中
printStream.println(97);
printStream.println(3.14);
printStream.println('a');
printStream.println(true);
Animal a = new Animal("老鼠", "黑色");
printStream.println(a);
//更改標(biāo)準(zhǔn)的輸入輸出
System.setOut(printStream); //標(biāo)準(zhǔn)輸出是到屏幕上
System.out.println("test.......");
*/
//收集異常的日志信息。
File logFile = new File("/home/gavinzhou/test.log");
PrintStream logPrintStream = new PrintStream( new FileOutputStream(logFile,true) );
try{
int c = 4/0;
//引起異常
System.out.println("c="+c);
int[] arr = null;
System.out.println(arr.length);
}
catch(Exception e){
e.printStackTrace(logPrintStream);
//輸出到文件而不是屏幕上
}
}
}
總結(jié)
以上就是本文關(guān)于Java中io流解析及代碼實例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
解決logback-classic 使用testCompile的打包問題
這篇文章主要介紹了解決logback-classic 使用testCompile的打包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式
這篇文章主要介紹了SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Springboot集成Springbrick實現(xiàn)動態(tài)插件的步驟詳解
這篇文章主要介紹了Springboot集成Springbrick實現(xiàn)動態(tài)插件的詳細過程,文中的流程通過代碼示例介紹的非常詳細,感興趣的同學(xué)可以參考一下2023-06-06
SpringBoot Test 多線程報錯的根本原因(dataSource already
在使用Springboot test進行相關(guān)測試的時候,發(fā)現(xiàn)開啟線程操作數(shù)據(jù)庫的時候異常,這篇文章主要介紹了SpringBoot Test 多線程報錯:dataSource already closed的根本原因及解決方法,需要的朋友可以參考下2022-06-06
SpringBoot實現(xiàn)接口校驗簽名調(diào)用的項目實踐
在以SpringBoot開發(fā)后臺API接口時,會存在哪些接口不安全的因素呢?通常如何去解決的呢?本文主要介紹了SpringBoot實現(xiàn)接口校驗簽名調(diào)用的項目實踐,感興趣的可以了解一下2023-09-09
idea中springboot項目連接數(shù)據(jù)庫報錯的原因解析
這篇文章主要介紹了idea中springboot項目連接數(shù)據(jù)庫報錯的原因解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
springboot如何重定向攜帶數(shù)據(jù) RedirectAttributes
這篇文章主要介紹了springboot如何重定向攜帶數(shù)據(jù) RedirectAttributes,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java Mail與Apache Mail發(fā)送郵件示例
這篇文章主要介紹了Java Mail與Apache Mail發(fā)送郵件示例的相關(guān)資料,需要的朋友可以參考下2014-10-10

