java字節(jié)流、字符流與轉(zhuǎn)換流過程
IO流概述
IO流: 輸入輸出流(Input/Output)
- 流是一組有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q或抽象。即數(shù)據(jù)在兩設(shè)備間的傳輸稱為流
- 流的本質(zhì)是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸特性將流抽象為各種類,方便更直觀的進(jìn)行數(shù)據(jù)操作。
IO流的分類
- 根據(jù)處理數(shù)據(jù)類型的不同分為:字符流和字節(jié)流
- 根據(jù)數(shù)據(jù)流向不同分為:輸入流(讀文件)和輸出流(寫文件)
字節(jié)流
字節(jié)輸出流
OutputStream類定義
public abstract class OutputStream extends Object implements Closeable,Flushable
此抽象類是表示輸出字節(jié)流的所有類的超類。輸出流接受輸出字節(jié)并將這些字節(jié)發(fā)送到InputSream類某個(gè)接收器要向文件中輸出,使用FileOutputStream類
字節(jié)輸入流
InputSream類定義
public abstract class InputStream extends Object implements Closeable
此抽象類便是字節(jié)輸入流的所有類的超類。
FileInputStream從文件系統(tǒng)中的某個(gè)文件中獲取輸入字節(jié)
實(shí)例代碼:
package com.booy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ByteStreamDemo {
//讀文件
public static void In() {
//確定要寫入的目標(biāo)文件
File file = new File("D:\\test\\test.txt");
//構(gòu)建一個(gè)文件輸入流對象
try {
InputStream in = new FileInputStream(file);
//把文件內(nèi)容讀出到程序中
byte[] bytes = new byte[1024];
StringBuilder buf = new StringBuilder();
int len = -1;//表示每次讀取的字節(jié)長度
//把數(shù)據(jù)讀入到數(shù)組中,并返回讀取的字節(jié)數(shù),當(dāng)不等于-1時(shí),表示讀取到數(shù)據(jù),等于-1表示文件已經(jīng)讀完
while((len=in.read(bytes))!=-1) {
//根據(jù)讀取到的字節(jié)數(shù)組,再轉(zhuǎn)換為字符串內(nèi)容,添加到StringBuilder中
buf.append(new String(bytes));
}
//測試打印
System.out.println("文件讀入成功:"+buf);
//關(guān)閉流
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//寫文件
public static void Out() {
//確定要輸出的目標(biāo)文件
File file = new File("D:\\test\\test.txt");
//構(gòu)建一個(gè)文件輸出流對象
try {
OutputStream out = new FileOutputStream(file,true);//true不寫為替換
//輸出的內(nèi)容
String info = "小橋流水人家\r\t";
//把內(nèi)容寫入到文件中
out.write(info.getBytes());
//關(guān)閉流
out.close();
System.out.println("文件寫入成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Out();
In();
}
}
/**
運(yùn)行結(jié)果:
文件寫入成功!
文件讀入成功: 小橋流水人家
小橋流水人家
*/
原理:
- 輸入/輸出字節(jié)流操作原理,每次只會(huì)操作一個(gè)字節(jié)(從文件中讀取或?qū)懭耄?/li>
- 字節(jié)操作流:默認(rèn)每次執(zhí)行寫入操作會(huì)把數(shù)據(jù)直接寫入文件
字符流
Writer
- 寫入字符流的抽象類。子類必須實(shí)現(xiàn)的方法僅有write(char[],int,int)、flush()和close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
- 與OutputString一樣,對文件的操作使用:FileWrite類完成。
Reader
- 用于讀取字符流的抽象類。子類必須實(shí)現(xiàn)的方法只有read(char[],int,int)和close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
- 使用FileReader類進(jìn)行實(shí)例化操作。
文件字符流會(huì)自帶緩存,默認(rèn)大小為1024字節(jié),在緩存滿后,或手動(dòng)刷新緩存,或關(guān)閉流時(shí)會(huì)把數(shù)據(jù)寫入文件中
如何選擇使用字節(jié)流還是字符流:
- 一般情況操作非文本文件時(shí),使用字節(jié)流,操作文本文件使用字符流
- 字符流的內(nèi)部實(shí)現(xiàn)還是字節(jié)流
實(shí)例代碼:
package com.booy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class CharStreamtDemo {
public static void main(String[] args) {
Out();
In();
}
private static void In() {
File file = new File("D:\\test\\test.txt");
try {
Reader in = new FileReader(file);
char[] cs = new char[1];
StringBuilder sbl = new StringBuilder();
int len = -1;
while((len=in.read(cs))!=-1) {
sbl.append(cs, 0, cs.length);
}
System.out.println(sbl);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void Out() {
File file = new File("D:\\test\\test.txt");
try {
Writer out = new FileWriter(file,true);
out.write(",古道西風(fēng)瘦馬");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
運(yùn)行結(jié)果:
小橋流水人家,古道西風(fēng)瘦馬
*/代碼實(shí)例:
指定一個(gè)盤符下的文件,將該文件復(fù)制到到指定的目錄下
文件的復(fù)制:從一個(gè)輸入流讀取數(shù)據(jù),然后通過輸出流寫入目標(biāo)位置
package com.booy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyFileDemo {
public static void main(String[] args) {
copy("D:\\test\\1.jpg","D:\\test\\my\\1.jpg");
}
private static void copy(String src,String target) {
File srcFile = new File(src);
File targetFile = new File(target);
InputStream in =null;
OutputStream out =null;
try {
in =new FileInputStream(srcFile);
out =new FileOutputStream(targetFile);
byte[] bytes = new byte[1024];
int len = -1;
while((len=in.read(bytes))!=-1) {
out.write(bytes, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if(in!=null)in.close();
if(out!=null)out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}字節(jié)字符轉(zhuǎn)換流
轉(zhuǎn)換流,可以將一個(gè)字節(jié)流轉(zhuǎn)換為字符流,也可以將一個(gè)字符流轉(zhuǎn)換為字節(jié)流
- OutputStreamWriter: 可以將輸出的字符流轉(zhuǎn)換為字節(jié)流的輸出形式
- InputStreamReader: 將輸入的字節(jié)流轉(zhuǎn)換為字符流輸入形式
實(shí)例代碼:
package com.booy;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
public class ChangerStringDemo {
public static void main(String[] args) throws FileNotFoundException {
//InputStream in = new FileInputStream("D:\\test\\test.txt");
//read(in);
OutputStream out = new FileOutputStream("D:\\test\\test.txt");
writer(out);
}
private static void read(InputStream in) {
Reader reader = new InputStreamReader(in,Charset.defaultCharset());
char[] cs = new char[1024];
int len = -1;
try {
while((len=reader.read(cs))!=-1) {
System.out.println(new String(cs,0,len));
}
cs.clone();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void writer(OutputStream out) {
Writer writ = new OutputStreamWriter(out,Charset.defaultCharset());
try {
writ.write("夕陽西下,斷腸人在天涯");
writ.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot整合redis修改分區(qū)的操作流程
這篇文章主要介紹了springboot整合redis修改分區(qū)的操作流程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式
在Web應(yīng)用程序開發(fā)中,統(tǒng)一數(shù)據(jù)返回格式對于前后端分離項(xiàng)目尤為重要,本文就來介紹一下SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Spring profile通過多種方法實(shí)現(xiàn)多環(huán)境支持
這篇文章主要介紹了Spring profile通過多種方法實(shí)現(xiàn)多環(huán)境支持,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的問題
這篇文章主要介紹了解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的情況,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
校驗(yàn)非空的注解@NotNull如何取得自定義的message
這篇文章主要介紹了校驗(yàn)非空的注解@NotNull如何取得自定義的message,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
如何在springboot中實(shí)現(xiàn)頁面的國際化
今天帶大家學(xué)習(xí)如何在springboot中實(shí)現(xiàn)頁面的國際化,文中有非常詳細(xì)的圖文解說及代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
SpringBoot任務(wù)調(diào)度器的實(shí)現(xiàn)代碼
SpringBoot自帶了任務(wù)調(diào)度器,通過注解的方式使用。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
Java Web使用簡單的批處理操作(記事本+Tomcat)
這篇文章主要介紹了Java Web使用簡單的批處理操作 ,需要的朋友可以參考下2014-10-10

