一.文件創(chuàng)建
File:文件和目錄路徑名的抽象表示形式,代表文件或者文件夾
//創(chuàng)建文件 完整路徑
String path = "E:\\Java89\\app\\src\\main\\java\\java08151";
//path\\1.txt 文件路徑以及文件名
File file = new File(path.concat("\\1.txt"));
//判斷文件是否存在
if (file.exists() == false){
//不存在 就創(chuàng)建
file.createNewFile();
}
這時候我們會發(fā)現(xiàn)createNewFile報(bào)錯,java.io,IOException
我們用throws關(guān)鍵字聲明拋出異常,調(diào)用者對其進(jìn)行處理
即在main函數(shù)末尾添加throws IOException,如下
public static void main(String[] args) throws IOException{
}
這時候我們運(yùn)行一下就會發(fā)現(xiàn)文件創(chuàng)建完成了

二.輸入輸出流詳解
1.Java流的分類
按流向分:
輸入流:程序可以從中讀取數(shù)據(jù)的流。
輸出流:程序能向其中寫入數(shù)據(jù)的流。
按數(shù)據(jù)傳輸單位分:
字節(jié)流:以字節(jié)為單位傳輸數(shù)據(jù)的流。
字符流:以字符為單位傳輸數(shù)據(jù)的流。
按功能分:
節(jié)點(diǎn)流:用于直接操作目標(biāo)設(shè)備的流
過濾流:是對一個已存在的流的鏈接和封裝,通過數(shù)據(jù)進(jìn)行處理為程序提供功能強(qiáng)大/靈活的讀寫功能。
2.Java.io 常用類
JDK所提供的所有流類位于java.io包中,都分別繼承自以下四種抽象流類:
InputStream:繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位都是字節(jié)(8位)。
OutputStream:繼承自O(shè)utputStream的流都是程序用于向外輸出數(shù)據(jù)的,且數(shù)據(jù)單位都是字節(jié)(8位)。
Reader:繼承自Reader的流否是用于向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位都是字符(16位)。
Writer:繼承自Writer的流都是程序用于向外輸出數(shù)據(jù)的,且數(shù)據(jù)單位都是字符(16位)。
流是一個很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時候,就會開啟一個通向數(shù)據(jù)源的流,這個數(shù)據(jù)源可以是文件,內(nèi)存,或者是網(wǎng)絡(luò)連接。類似的,當(dāng)程序需要寫入數(shù)據(jù)的時候,就會開啟一個通向目的地的流。這個時候你就可以想象數(shù)據(jù)好像在這其中“流”動一樣。如下圖

Java中的流分為兩種,一種是字節(jié)流,另一種是字符流,分別由四個抽象類來表示(每種流包括輸入和輸出兩種所以一共個四個):InputStream,OutputStream,Reader,Writer。Java中其他多種多樣變化的流均是由它們派生出來的;
stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或者是任何有能力接收數(shù)據(jù)的接收源。在java的io中,所有的stream都包括兩種類型:
(1)字節(jié)流
表示以字節(jié)為單位從stream中讀取或往stream中寫入信息
(2)字符流
1.流的層次結(jié)構(gòu)
定義:
(1).java將讀取數(shù)據(jù)對象成為輸入流,能向其寫入的對象叫輸出流。結(jié)構(gòu)圖如下:
輸入流

輸出流

2.InputStream類
inputstream類和outputstream類都為抽象類,不能創(chuàng)建對象,可以通過子類來實(shí)例化。
IputStream是輸入字節(jié)數(shù)據(jù)用的類,所以InputStream類提供了3種重載read方法。InputStream類中的常用方法:
(1)public abstract int read(); 讀取一個byte的數(shù)據(jù),返回值是高位補(bǔ)0的int類型值。
(2)public int read(byte b[ ] );讀取b.length個字節(jié)的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。該方法實(shí)際上是調(diào)用下一個方法實(shí)現(xiàn)的
(3)public int read(byte b[ ],int off,int len);從輸入流中最多讀取len個字節(jié)的數(shù)據(jù),存放到偏移量位off的b數(shù)組中。
(4)public int availabe();返回輸入流中可以讀取的字節(jié)數(shù)。注意:如果InputStream對象調(diào)用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調(diào)用才有用。
(5)public int close();我們在使用完后,必須對我們打開的流進(jìn)行關(guān)閉。
3.OutputStream類
OutputStream提供了3個write方法來做數(shù)據(jù)的輸出,這個是和InputStream是相對應(yīng)的。
(1).public void write(byte b[ ]);將參數(shù)b中的字節(jié)寫到輸出流。
(2).public void write(byte b[ ],int off,int len);將參數(shù)b的從偏移量off開始的len個字節(jié)寫到輸出流。
(3).public abstract void write(int b);先將Int轉(zhuǎn)換為byte類型,把低字節(jié)寫入到輸出流中。
(4).public void flush();將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū)。
(5).public void close();關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源。
注意:InputStream和OutputStream都是抽象類,不能創(chuàng)建這種類型的對象。
4.FileInputStream類
FileInputStream類是InputStream類的子類,用來處理以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流(從文件中讀取數(shù)據(jù))。使用方法:
File fin = new File("d:/abc.txt");
FileInputStream in = new FileInpuStream(fin);
5.FileOutputStream類
FileOutputStream類用來處理以文件作為數(shù)據(jù)流輸出目的的數(shù)據(jù)流(向文件中寫入數(shù)據(jù));一個表示文件名的字符串,也可以是File對象。
創(chuàng)建一個文件流對象的方法:
File f = new File("d:/abc.txt");
FileOutpuStream out = new FileOutpuStream(f);
例子1:向文件寫入數(shù)據(jù)-字節(jié)
FileOutputStream fos = new FileOutputStream(file);
// 2.調(diào)用write方法寫入
byte[] text = {'1','2','3','4'};
fos.write(text);
// 3.操作完畢需要關(guān)閉stream
fos.close();
運(yùn)行后,會看到創(chuàng)建的文件里由1234四個數(shù)字
例子2:向文件寫入數(shù)據(jù) - 字符流
FileWriter fw = new FileWriter(file);
char[] name = {'安','卓','開','發(fā)'};
fw.write(name);
fw.close();
運(yùn)行后發(fā)現(xiàn)創(chuàng)建的文件里1234已經(jīng)不見了 變成安卓開發(fā)四個字
注意:
(1)文件中寫數(shù)據(jù)時,若文件已經(jīng)存在,則覆蓋存在的文件;
(2)讀/寫操作結(jié)束時,應(yīng)調(diào)用close方法關(guān)閉流。
5.BufferedInputStream和BufferedOutputStream
BufferedInputStream和BufferedOutputStream為InputStream和OutputStream增加了內(nèi)存緩沖區(qū),根本目的是允許java的IO流一次操作多個字節(jié),從而提高系統(tǒng)的性能。
BufferedInputStream
功能:用這個類來解決“每次都要用數(shù)據(jù)的時候都要進(jìn)行物理讀取”的問題,也就是說用“緩沖區(qū)”
用法:它本身并不提供接口,只是提供一個緩沖區(qū)。需要連到一個“有接口的對象(interfaceobject)”
BufferedOutputStream
功能:用這個類解決“每次往流里寫數(shù)據(jù),都要進(jìn)行物理操作”的問題。也就是說“用緩沖區(qū)”。用flush()清空緩沖區(qū)。
用法:本身并不提供接口,只是加了一個緩沖區(qū)。需要連接一個有接口的對象。
BufferedInputStream定義了兩種構(gòu)造函數(shù)
(1)BufferedInputStream b = new BufferedInputStream(in);
(2)BufferedInputStream b = new BufferedInputStream(in,size);//指定大小
BufferedOutputStream中的flush方法可以強(qiáng)制輸出緩沖區(qū)的數(shù)據(jù)
6.對象序列化和反序列化
把java對象轉(zhuǎn)換成字節(jié)序列的過程成為對象序列化
把字節(jié)序列恢復(fù)到j(luò)ava對象的過程叫做對象的反序列化
序列化類的對象要求實(shí)現(xiàn)java.io.Serializable;
public ObjectInputStream (inputStream in)構(gòu)造方法 構(gòu)造輸入對象
final object readObject ()方法 從指定位置讀取對象
public ObjectOutputStream(inputStream in)構(gòu)造方法 構(gòu)造輸出對象
final void writeObejct() 方法 輸出對象的指定位置
對象序列化:對象轉(zhuǎn)換成字節(jié)
定義一個Person類
public class Person implements Serializable {
String name;
int age;
}
在MyClass類里向文件存一個對象
Person xw = new Person();
xw.name = "小王";
xw.age = 20;
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(xw);
oos.close();
對象反序列化:自己轉(zhuǎn)換成對象(從文件讀取一個對象)
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Person xw = (Person)ois.readObject();
System.out.println(xw.name+" "+xw.age);
ois.close();
輸出結(jié)果
小王 20
7.將一個文件copy到另外一個位置
//1.源文件的路徑
String sourcePath = "C:\\Users\\hp\\Desktop\\1.jpg";
//2.目標(biāo)文件的路徑
String desPath = "E:\\Java89\\app\\src\\main\\java\\java08151\\2.jpg";
//3.圖片 字節(jié)
FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(desPath);
byte[] in = new byte[1024];
int count = 0;
while ((count = fis.read(in)) != -1){
fos.write(in,0,count);
}
運(yùn)行后會發(fā)現(xiàn)

圖片成功復(fù)制