1.input 輸入,從硬盤到程序;output輸出,從程序到硬盤
2.字節(jié)輸出流outputstream
- 字節(jié)類寫任何文件均可以,字節(jié)是最基本存儲單元
- 抽象類,是輸出類所有類超類io包中
- 每次僅操作一個字節(jié)write(int);write(byte[])寫入字節(jié)數(shù)組;
write(byte[],int a,int b),從byte數(shù)組a索引開始寫入b個元素 - close(),關(guān)閉資源,必寫
- java操作對象都是調(diào)用操作系統(tǒng)完成
- 類命名都是前半部分是功能后半部分是父類:ByteArrayOutputStream
3.fileoutputstream
- 構(gòu)造方法綁定一個輸出目的,參數(shù)有file和String(文件名)
- 三步,創(chuàng)建綁定目的地,write,close
- 所有io異常均是ioexception
FileOutputStream fo=new FileOutputStream("c:\\a.txt");
fo.write(100);
fo.close();
輸出是d,會查詢編碼表
若在文本中輸出100則是三個數(shù)1,0,0,三個字節(jié)
漢字是兩個字節(jié)
想要字符串寫入可以:“hello”.getBytes()
流對象會創(chuàng)建新文件,若文件已存在則會全部覆蓋
- 續(xù)寫和換行在構(gòu)造方法里new FileOutputStream("c:\a.txt",true);true是在文件末尾寫,flase是在開頭寫入
- \r\n換行
- close寫在finally中,有異常拋出停止,文件創(chuàng)建失敗則不需要close
if (foS!=null) {
try {
foS.close();
} catch (IOException ix) {
ix.printStackTrace();
throw new RuntimeException("釋放資源失敗");
}
io出現(xiàn)問題軟件解決不了,直接拋出異常就好
4.字節(jié)輸入流FileInputStream
- read()讀一個字節(jié)
- read(byte[])讀一定量字節(jié)byte一般1024容量或者整數(shù)倍,但不可以太大
int lon=0;
byte[] arr=new byte[1024];
while ((lon=fiS.read(arr))!=-1) {
foS.write(arr, 0, lon);
}
同樣會按照ascii編碼表轉(zhuǎn)碼想看到原文件就char強轉(zhuǎn)
只能以lon來第三方替換,因為read一次就會換位讀到不同字節(jié)
read返回的數(shù)是讀到幾個字節(jié),裝進(jìn)arr數(shù)組會不停覆蓋之前讀進(jìn)去的元素
如果new byte[2]
讀abcde,第三次就會讀到e,但是顯示最后一次是[e,d],d是上一次留下的
讀到末尾結(jié)束標(biāo)記,jvm就會直接返回-1
- 復(fù)制
FileInputStream fiS=null;
FileOutputStream foS=null;
try {
fiS=new FileInputStream("C:\\Users\\Desktop\\java\\eclipse-SDK-3.7.2-win32.zip");
foS=new FileOutputStream("C:\\User\\Desktop\\a.zip");
int lon=0;
byte[] arr=new byte[1024];
while ((lon=fiS.read(arr))!=-1) {
foS.write(arr, 0, lon);
}
} catch (IOException ix) {
ix.printStackTrace();
throw new RuntimeException("復(fù)制失敗");
}finally
{
if (foS!=null) {
try {
foS.close();
} catch (IOException ix) {
ix.printStackTrace();
throw new RuntimeException("釋放資源失敗");
}finally
{
try {
if (fiS!=null) {
fiS.close();
}
} catch (IOException ix) {
ix.printStackTrace();
throw new RuntimeException("復(fù)制失敗");
}
}
}
}
單個字節(jié)復(fù)制太慢,用byte[]
為確保fis也可以close成功,需要在fos.close在使用一次finally
5.字符編碼表
- ascii一個字節(jié)7個位,最高位(首位)是0沒有正負(fù)之分
- 漢字兩個字節(jié),第一個字節(jié)負(fù)數(shù),第二個可能正數(shù)
- “abc”.getbyte()轉(zhuǎn)成編碼,String(byte[])數(shù)字轉(zhuǎn)字符是解碼
6.字符流filewriter,filereader
- 和字節(jié)流一樣,把byte[]變成char[]
- 每一次write之后需要調(diào)用flush()刷新,close也有刷新功能,但一起堆到close再刷新會耗時耗內(nèi)存(不刷時候臨時數(shù)據(jù)都在內(nèi)存)
int lon=0;
char[] arr=new char[1024];
while ((lon=fiS.read(arr))!=-1) {
foS.write(arr, 0, lon);
foS.flush();
}
打開能看懂的都是文本文件
字符流僅能用于文本編輯,復(fù)制圖片什么的都是壞的
僅有字符流在close之前需要使用flush,別的都不需要