今天對(duì)于Java中的文件的一些概念及用法來進(jìn)行相關(guān)的學(xué)習(xí)掂林。
技術(shù):
- 文件的讀寫
實(shí)際學(xué)習(xí):
其實(shí)文件的操作很簡(jiǎn)單伟葫,就是讀取文件刻坊,寫入文件。但在這之前醋虏,我們要先確定文件是否存在寻咒,如果不存在,就要?jiǎng)?chuàng)建一個(gè)文件颈嚼。創(chuàng)建文件毛秘,寫入數(shù)據(jù),保存數(shù)據(jù)阻课,關(guān)閉文件叫挟。下次重新打開的時(shí)候,讀取內(nèi)容抹恳。
文件有一個(gè)專門的類署驻,在Java中一切皆對(duì)象旺上。在Java中文件對(duì)應(yīng)的類是File。我們所需的是這個(gè)File.io流
File文件的操作:
1.//讀取文件的內(nèi)容
//I\O流
//流的方向:參考的是自己的內(nèi)存空間
//輸出流:從內(nèi)存空間將數(shù)據(jù)寫到外部設(shè)備(磁盤扬跋、硬盤钦听、光盤)
//輸入流:將外部數(shù)據(jù)寫到內(nèi)存中
//流:統(tǒng)一的管理數(shù)據(jù)的寫入和讀取
//輸出流:開發(fā)者只需要將內(nèi)存里面的數(shù)據(jù)寫到流里面
//輸入流:或者從流里面讀取數(shù)據(jù)
//輸出流:OutputStream(字節(jié)流) Writer字符流
//輸入流:InputStream(字節(jié)流) Reader字符流
//I\O流對(duì)象不屬于內(nèi)存對(duì)象朴上,需要自己關(guān)閉
//OutputStream和InputStream都是抽象類 不能直接使用
// 實(shí)際操作的子類:
//FileOutputStream/FileInputStream
//ObjectOutputStream/ObjectInputStream
//FileWriter/FileReader
這個(gè)圖就顯示了在Java里面的文件的讀寫的一個(gè)基本過程痪宰。
藍(lán)色的箭頭由內(nèi)存指向外部設(shè)備,這里代表的是文件的寫入乖订。從內(nèi)存空間將數(shù)據(jù)寫到外部設(shè)備(磁盤乍构、硬盤、光盤)哥遮。反之陵究,紅色的就是文件的讀取,從外部的設(shè)備讀取文件的數(shù)據(jù) 傳到內(nèi)存里面進(jìn)行加載仪召。
在數(shù)據(jù)的寫入和寫出時(shí)牲距,通過的就是流來實(shí)現(xiàn)钥庇。當(dāng)我們的從內(nèi)存中拿數(shù)據(jù)傳給外部設(shè)備(磁盤,光盤难述,投影儀等等)的時(shí)候胁后,分別都需要它們自己的傳遞方式才能傳遞給它們嗦枢。對(duì)于程序而言文虏,所需要的是一個(gè)統(tǒng)一性的操作,通過訪問這個(gè)操作年鸳,來給不同的外部設(shè)備傳遞數(shù)據(jù)搔确。那么這個(gè)統(tǒng)一性的操作就是Stream,就是所謂的流,來封裝數(shù)據(jù)的讀取和寫入座硕。封裝成流之后畦幢,我們只管把數(shù)據(jù)寫到流里面去宇葱,系統(tǒng)已經(jīng)幫我們實(shí)現(xiàn)這個(gè)流怎么寫入和寫出瘦真。流就是高度的統(tǒng)一。
接下來是我在創(chuàng)建文件時(shí)所寫的一些代碼诸尽。
1.創(chuàng)建文件:
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//創(chuàng)建文件 完整路徑
String path="D:\\android study\\yjx1\\src\\main\\java\\swu\\yjx\\day8";
File file=new File(path.concat("/1.txt"));
//判斷是否存在
if(file.exists()==false) {
//不存在就創(chuàng)建
file.createNewFile();
}
寫入字節(jié)流
//向文件里面寫入數(shù)據(jù)
//1.創(chuàng)建文件輸出流對(duì)象
FileOutputStream fos=new FileOutputStream(file);
//2.調(diào)用write方法寫入
byte[] text={'1','2','3','4'};
fos.write(text);
//3.操作完畢需要關(guān)閉stream對(duì)象
fos.close();
//讀取內(nèi)容
FileInputStream fis=new FileInputStream(file);
byte[] name=new byte[12];
fis.read(name);
fis.close();
System.out.println(new String(name));
寫入字符流
//向文件寫入數(shù)據(jù)-字符流
FileWriter fw=new FileWriter(file);
char[] name={'a','b','c','d'};
fw.write(name);
fw.close();
//讀取字符流
FileReader fr=new FileReader(file);
char[] book=new char[4];
int
count=fr.read(book);
fr.close();
System.out.print(count+""+new String(book));
//向文件里面存一個(gè)對(duì)象
//序列化 serializable(接口)
//如果要將一個(gè)對(duì)象保存起來印颤,必須實(shí)現(xiàn)Serializable接口
//如果對(duì)象內(nèi)部還有屬性變量是其他類的對(duì)象 這個(gè)類也必須實(shí)現(xiàn)Serializable接口
保存對(duì)象:
Perason xw=new Perason();
xw.name="小王";
xw.age=23;
OutputStream os=new FileOutputStream(file);
ObjectOutputStream oos=new ObjectOutputStream(os);
oos.writeObject(xw);
oos.close();
//從文件里面讀取對(duì)象
InputStream is=new FileInputStream(file) ;
ObjectInputStream ois=new ObjectInputStream(is);
Perason xw=(Perason) ois.readObject();
System.out.print(xw.name+""+xw.age);
ois.close();
這里是將一張圖片copy到了另一個(gè)位置您机。一般都可以用文件來保存圖片和視頻。對(duì)于其他較大的數(shù)據(jù)际看,則是由系統(tǒng)的數(shù)據(jù)庫來維持。
//將一個(gè)文件copy到另一個(gè)位置
//要知道1.源文件的路徑
String sourcePath="C:\\Users\\DAMEI\\Desktop\\1.jpg";
//2.目標(biāo)文件的路徑
String desPath="D:\\android study\\yjx1\\src\\main\\java\\swu\\yjx\\day8\\1.jpg";
//3.圖片的話用 字節(jié)
FileInputStream fis = new FileInputStream(sourcePath);//輸出流
FileOutputStream fos = new FileOutputStream(desPath);//輸入流
byte[] in = new byte[1024];
while (true) {
int count = fis.read(in);
if (count !=-1){
//讀取到內(nèi)容了
//將這次讀取的內(nèi)容寫入到目標(biāo)文件
fos.write(in,0,count);
}else {
break;
}
}
fis.close();
fos.close();
使?用BufferedInputStream和BufferedOutputStream提?高 讀寫的速度
long start=System.currentTimeMillis();
String sourcePath="C:\\Users\\DAMEI\\Desktop\\1.jpg";
String desPath="D:\\android study\\yjx1\\src\\main\\java\\swu\\yjx\\day8\\1.jpg";
InputStream is=new FileInputStream(sourcePath);
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream os=new FileOutputStream(desPath);
BufferedOutputStream bos = new BufferedOutputStream(os);//BufferedOutputStream 自己定義了一個(gè)字節(jié)數(shù)組
byte[] in = new byte[1024];
int count=0;
while ((count=bis.read(in))!=-1){
bos.write(in,0,count);
}
bis.close();
bos.close();
long end=System.currentTimeMillis();
System.out.println(end-start);
這里對(duì)于較小的數(shù)據(jù)來說可能讀寫速度想差不大矢否,但對(duì)于較大的而言仲闽,就有差距了。
今天對(duì)于Java中的文件的讀寫就闡述到這了僵朗,感謝大家的觀看赖欣,多多支持!Q槊怼!