流操作的是文件的內(nèi)容,這個(gè)內(nèi)容始終需要存儲(chǔ)在文件中,否則等待程序關(guān)閉后就會(huì)煙消云散。數(shù)據(jù)存儲(chǔ)最終是以文件的形式保存在在操作系統(tǒng)中的磁盤(pán)上。Java中對(duì)應(yīng)的類是File。
//在磁盤(pán)中創(chuàng)建一個(gè)文件
File file = new File("d:\\test.txt");
//創(chuàng)建文件:
file.createNewFile();
//創(chuàng)建文件夾:
file.mkdir();
//檢測(cè)文件是否存在:
file.exists()
例子
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FileCreateDemo {public static void main(String[] args) {String path = FileReader.class.getResource("/").getFile();
String fileName = path + "/test.txt";
File file = new File(fileName);
// 創(chuàng)建文件
try {file.createNewFile();
System.out.println(file.exists());
String dirName = path + "/myFolder";
File dir = new File(dirName);
//創(chuàng)建文件夾
dir.mkdir();
System.out.println(dir.exists());
} catch (IOException e) {e.printStackTrace();
}
}
}
看下file對(duì)象的一些常用方法吧:
作用 | 函數(shù)簽名 |
---|---|
獲取文件名 | String getName() |
磁盤(pán)文件是否存在 | boolean exists() |
獲取文件的磁盤(pán)絕對(duì)地址 | String getAbsolutePath() |
列取文件夾下的文件列表有過(guò)濾器有文件名過(guò)濾器file必須是文件夾才能使用 | File[] listFiles() File[] listFiles(FileFilter filter)File[] listFiles(FilenameFilter filter)![]() |
創(chuàng)建文件夾 | boolean mkdir() |
創(chuàng)建文件指定目錄中創(chuàng)建指定前綴和后綴的文件 | boolean createNewFile()createTempFile(String prefix, String suffix, File directory) |
獲取父目錄![]() | String getParent()//上層文件路徑 File getParentFile()//上層文件 |
是否隱藏 | boolean isHidden() |
刪除文件 | boolean delete() |
例子
import java.io.File;
import java.io.FileReader;
public class FileInfoDemo {public static void main(String[] args) {//獲取當(dāng)前項(xiàng)目運(yùn)行時(shí)所在根目錄
String path = FileReader.class.getResource("/").getFile();
String fileName = path;
showFileInfo(fileName);
}
public static void showFileInfo(String fileName) {File file = new File(fileName);
for (File f : file.listFiles()) {String str = "";
if (f.isDirectory()){str = "文件夾";
//getAbsolutePath()獲取文件的磁盤(pán)絕對(duì)地址
showFileInfo(f.getAbsolutePath());
} else {str = "文件";
}
對(duì)象狀態(tài)在內(nèi)存中或者在網(wǎng)絡(luò)間傳輸?shù)臓顟B(tài)是瞬時(shí)狀態(tài),對(duì)象狀態(tài)被保存到磁盤(pán)的文件中(磁盤(pán)文件或數(shù)據(jù)庫(kù)文件中),是持久化狀態(tài)。而這個(gè)由瞬時(shí)到持久的過(guò)程稱為“持久化”。
以數(shù)據(jù)的流向分類,能夠讀取字節(jié)的序列的API對(duì)象成為輸入流(InputStream),能夠?qū)懭胱止?jié)序列的成為輸出流(OutputStream)。字節(jié)是計(jì)算機(jī)數(shù)據(jù)的存儲(chǔ)的形式,任何數(shù)據(jù)都可以使用字節(jié)流進(jìn)行讀寫(xiě)。JAVA中有專門(mén)提供了對(duì)于字符流的兩個(gè)抽象類Reader和Writer
分類: IO流按照操作對(duì)象:字節(jié)流和字符流 ; 按照流的方向分:輸入流和輸出流
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test {public static void main(String[] args)throws Exception { FileInputStream fis = new FileInputStream("D:\\工作文檔\\Test.java");
FileOutputStream fos = new FileOutputStream("D:\\工作文檔\\COPY\\Test2.java");
int n;
----------------------------方法一------------------------------------
while((n=fis.read()) != -1){//System.out.print((char)n);
fos.write(n);
}
----------------------------方法二------------------------------------
byte[] bytes = new byte[1024];
while((n=(fis.read(bytes))) != -1){//System.out.print((char)n);
fos.write(bytes,0,n);
}
fis.close();
fos.close();
}
}
多次運(yùn)行寫(xiě)入文件的內(nèi)容始終是最后的一次輸入,之前的寫(xiě)入都被覆蓋掉了。
構(gòu)造函數(shù)構(gòu)造出來(lái)的FileOutputStream(fileName) 是不支持追加內(nèi)容的
在輸出流從創(chuàng)建到關(guān)閉的過(guò)程中可以多次使用write寫(xiě)入數(shù)據(jù),
但是再次打開(kāi)流時(shí),文件會(huì)重頭寫(xiě),所以會(huì)覆蓋掉以前的內(nèi)容。
FileOutputStream fos = new FileOutputStream(fileName);
構(gòu)造追加內(nèi)容的輸出流:
FileOutputStream fos = new FileOutputStream(fileName,true);
更改后的代碼是能夠追加內(nèi)容到文件中。
fos.write(content.getBytes());//按照字節(jié)寫(xiě)
fis.read(bytes);//按照字節(jié)讀
fis.read(bytes,off,len)// byte 要存放讀取的字節(jié)數(shù)組,off起點(diǎn),len讀取長(zhǎng)度
fis.skip(len);//跳過(guò)多少字節(jié)
System.getProperty("file.encoding") //查看系統(tǒng)中文件的編碼。
//文件輸入輸出字節(jié)流的詳細(xì)API如下:
//FileInputStream字節(jié)流常用的API:
fis.skip(len);//跳過(guò)一定字節(jié)
fis.read();//按照字節(jié)逐個(gè)讀取
fis.read(byte[]);//從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組 b 中
fis.read(byte[],off,len);//將輸入流中最多l(xiāng)en個(gè)數(shù)據(jù)字節(jié)讀入byte數(shù)組的偏移位置off處
fis.close();//關(guān)閉輸入流
//FileOutputStream字節(jié)流常用的API
write(byte[] b);//將 b.length 個(gè)字節(jié)寫(xiě)入此輸出流
write(byte[] b, int off, int len);//將指定byte數(shù)組中從偏移量off開(kāi)始的len個(gè)字節(jié)寫(xiě)入此輸出流
write(int b);//將指定byte寫(xiě)入此輸出流
void flush();//刷新此輸出流,并強(qiáng)制將所有已緩沖的輸出字節(jié)寫(xiě)入該流中
close()//關(guān)閉流
字節(jié)流缺點(diǎn):在讀取文本的時(shí)候非常不方便,需要按照字節(jié)進(jìn)行操作,這也是字符流出現(xiàn)的原因。
字節(jié)流優(yōu)點(diǎn):字節(jié)流不僅可以操作文本,還可以操作讀取其他媒體:如mp3,圖片,還有視頻,這些都可以使用字節(jié)流進(jìn)行操作
例子:內(nèi)容讀取,追加兩位同學(xué)的信息,每行一條Lucy,女,15;Lilei,男,16
import java.io.*;
public class StudentFile {public static void main(String[] args) {String path = FileReader.class.getResource("/").getFile();
String fileName = path + "/student.data";
String info=StudentFile.readStudentInfo(fileName);
System.out.println(info);
String[] infos={"Lucy,女,15","Lilei,男,16"};
StudentFile.writeStr2File(fileName,infos);
info=StudentFile.readStudentInfo(fileName);
System.out.println(info);
}
public static void writeStr2File(String fileName, String[] infos) {try{ FileOutputStream fos = new FileOutputStream(fileName, true);
for (String line : infos) { line = "\r\n" + line;
fos.write(line.getBytes());
}
fos.close();
}catch(Exception e){ e.printStackTrace();
}
}
public static String readStudentInfo(String fileName) {try { FileInputStream fis = new FileInputStream(fileName);
//available()可以讀取的剩余字節(jié)數(shù)
byte[] bytes = new byte[fis.available()];
fis.close();
return new String(bytes);
} catch (Exception e) { e.printStackTrace();
}
return null;
}
}
序列化 (Serialization)將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程,可以通過(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。可序列化的對(duì)象,這個(gè)類必須是實(shí)現(xiàn)了Serializable接口的類,而且其成員變量也必須是可序列化的。
序列化: 父類如果是可序列化的,子類也是可序列化的;類的成員變量全部是可序列化的,類才能被正常可序列化。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-KLXRzqVn-1672105540832)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220727084250746.png)]
import java.io.FileReader;
import java.io.FileWriter;
public class Test2 {public static void main(String[] args)throws Exception { FileReader fr = new FileReader("D:\\工作文檔\\Test.java");
FileWriter fw = new FileWriter("D:\\工作文檔\\COPY\\Test2.java");
int n;
char[] chars = new char[1024];
while((n=fr.read(chars)) != -1){//System.out.print(n);
fw.write(chars,0,n);
}
fr.close();
fw.close();
}
}
字符輸出流
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-buiSfHPI-1672105540832)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220727085141225.png)]
import java.io.*;
public class Test3 {public static void main(String[] args)throws Exception { FileReader fr = new FileReader("D:\\工作文檔\\Test.java");
FileWriter fw = new FileWriter("D:\\工作文檔\\COPY\\Test2.java");
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
int count = 0;
String line = null;
while((line=br.readLine()) != null){count++
bw.write(line);
bw.newLine();
}
fr.close();
br.close();
bw.close();
fw.close();
}
}
總結(jié)
1) 流按照流向可以分為:輸入流/輸出流;按照操作的對(duì)象可以分為字符流/字節(jié)流
2)字節(jié)流的操作的基類是InputStream,OutputStream這是基本的抽象類。字符流的操作的基類是Reader,Writer這些是字符流的基本抽象類,它們不能直接被實(shí)例化,所以我們還需要進(jìn)行具體常見(jiàn)子類的學(xué)習(xí)
3) 磁盤(pán)文件的字節(jié)流FileInputStream FileOutputStream可以很方便的對(duì)磁盤(pán)上的文件進(jìn)行讀寫(xiě)和復(fù)制
4)對(duì)象流可以將對(duì)象的狀態(tài)進(jìn)行序列化和反序列化到磁盤(pán)上進(jìn)行存儲(chǔ)和恢復(fù),但是要求我們的對(duì)象包括其成員都要實(shí)現(xiàn)Serializable接口
入流/輸出流;按照操作的對(duì)象可以分為字符流/字節(jié)流
2)字節(jié)流的操作的基類是InputStream,OutputStream這是基本的抽象類。字符流的操作的基類是Reader,Writer這些是字符流的基本抽象類,它們不能直接被實(shí)例化,所以我們還需要進(jìn)行具體常見(jiàn)子類的學(xué)習(xí)
3) 磁盤(pán)文件的字節(jié)流FileInputStream FileOutputStream可以很方便的對(duì)磁盤(pán)上的文件進(jìn)行讀寫(xiě)和復(fù)制
4)對(duì)象流可以將對(duì)象的狀態(tài)進(jìn)行序列化和反序列化到磁盤(pán)上進(jìn)行存儲(chǔ)和恢復(fù),但是要求我們的對(duì)象包括其成員都要實(shí)現(xiàn)Serializable接口
5)使用字符流的子類讀取寫(xiě)入數(shù)據(jù)如FileReader FileWriter 以及帶緩存的字符流進(jìn)行按行讀取寫(xiě)入文件;File類是對(duì)磁盤(pán)上的文件和目錄的抽象,使用File類的方法:createNewFile()、mkdir()、mkdirs()、delete()、renameTo(File dest)、isDirectory()、isFile()、exists()、canRead()、isHidden()等方法,能進(jìn)行磁盤(pán)文件的管理
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文題目:java-IO流-創(chuàng)新互聯(lián)
文章URL:http://chinadenli.net/article24/ehpje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃、域名注冊(cè)、網(wǎng)站維護(hù)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容