File類
1.如何創(chuàng)建File類的實(shí)例
File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)
2.路徑:
相對(duì)路徑:相較于某個(gè)路徑下策添,指明的路徑亮蛔。
絕對(duì)路徑:包含盤符在內(nèi)的文件或文件目錄的路徑
3.路徑分隔符
windows:\
unix:/
public String getAbsolutePath():獲取絕對(duì)路徑
public String getPath() :獲 取路徑
public String getName() :獲取名稱
public String getParent():獲取上層文件目錄路徑诵肛。若無紊册,返回null
public long length() :獲取文件長(zhǎng)度(即:字節(jié)數(shù))假颇。不能獲取目錄的長(zhǎng)度。
public long lastModified() :獲取最后一次的修改時(shí)間,毫秒值
如下的兩個(gè)方法適用于文件目錄:
public String[] list() :獲取指定目錄下的所有文件或者文件目錄的名稱數(shù)組
public File[] listFiles() :獲取指定目錄下的所有文件或者文件目錄的File數(shù)組
//遞歸搜索.java結(jié)尾的文件
public class dome3 {
public static void main(String[] args) {
File file = new File("D:\\Users\\YTFar\\IdeaProjects\\xuexi");
dg(file);
}
private static void dg(File file) {
//獲取子文件或目錄
File[] files = file.listFiles();
int num = 0;
for (File files1 : files){
if (files1.isFile()){
if(files1.toString().toLowerCase().endsWith(".java")){
System.out.println(files1);
}
}else{
dg(files1);
}
}
}
}
IO流原理及流的分類
- I/O是Input/Output的縮寫,I/O技術(shù)是非常實(shí)用的技術(shù)氯质,用于處理設(shè)備之間的數(shù)據(jù)傳輸。如讀/寫文件祠斧,網(wǎng)絡(luò)通訊等闻察。
- Java程序中,對(duì)于數(shù)據(jù)的輸入琢锋、輸出操作以“流(stream)”的方式進(jìn)行辕漂。
- java.io包下提供了各種“流”類和接口,用以獲取不同種類的數(shù)據(jù)吩蔑,并通過標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù)钮热。
按操作數(shù)據(jù)單位不同分為:字節(jié)流(8 bit)填抬,字符流(16 bit)
按數(shù)據(jù)流的流向不同分為:輸入流烛芬,輸出流
按流的角色的不同分為:節(jié)點(diǎn)流,處理流
* 一飒责、流的分類:
* 1.操作數(shù)據(jù)單位:字節(jié)流赘娄、字符流
* 2.數(shù)據(jù)的流向:輸入流、輸出流
* 3.流的角色:節(jié)點(diǎn)流宏蛉、處理流
*
* 二遣臼、流的體系結(jié)構(gòu)
* 抽象基類 節(jié)點(diǎn)流(或文件流) 緩沖流(處理流的一種)
* InputStream FileInputStream (read(byte[] buffer)) BufferedInputStream (read(byte[] buffer))
* OutputStream FileOutputStream (write(byte[] buffer,0,len) BufferedOutputStream (write(byte[] buffer,0,len) / flush()
* Reader FileReader (read(char[] cbuf)) BufferedReader (read(char[] cbuf) / readLine())
* Writer FileWriter (write(char[] cbuf,0,len) BufferedWriter (write(char[] cbuf,0,len) / flush()
*
節(jié)點(diǎn)流(或文件流)
- 字符流
//文件復(fù)制
FileReader fr = null;
FileWriter fw = null;
try {
//1.創(chuàng)建File類的對(duì)象,指明讀入和寫出的文件
File srcFile = new File("123.txt");
File destFile = new File("1234.txt");
//不能使用字符流來處理圖片等字節(jié)數(shù)據(jù)
//File srcFile = new File("123.jpg");
//File destFile = new File("1234.jpg");
//2.創(chuàng)建輸入流和輸出流的對(duì)象
fr = new FileReader(srcFile);
fw = new FileWriter(destFile,true);//追加
//fis = new FileInputStream(srcFile);
//fos = new FileOutputStream(destFile);
//3.數(shù)據(jù)的讀入和寫出操作
char[] cbuf = new char[5];
//byte[] bytes = new byte[5];
int len;//記錄每次讀入到cbuf數(shù)組中的字符的個(gè)數(shù)
while((len = fr.read(cbuf)) != -1){
//String str = new String(cbuf,0,len);
//System.out.print(str);
//每次寫出len個(gè)字符
fw.write(cbuf,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.關(guān)閉流資源
try {
if(fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
緩沖流
- 緩沖流:
- 作用:提供流的讀取拾并、寫入的速度
提高讀寫速度的原因:內(nèi)部提供了一個(gè)緩沖區(qū) - 處理流揍堰,就是“套接”在已有的流的基礎(chǔ)上
--> FileInputStream -- BufferedInputStream
--> FileOutSream -- BufferedOutStream
--> FileReader -- BufferedReader
--> FileWriter -- BufferedWriter
- 先關(guān)閉外層的流鹏浅,在關(guān)閉內(nèi)層的流
- 關(guān)閉外層流的同時(shí),內(nèi)層流也會(huì)自動(dòng)地進(jìn)行關(guān)閉屏歹。
BufferedReader br = null;
BufferedWriter bw = null;
try {
//創(chuàng)建文件和相應(yīng)的流
br = new BufferedReader(new FileReader(new File("dbcp.txt")));
bw = new BufferedWriter(new FileWriter(new File("dbcp1.txt")));
//讀寫操作
//方式一:使用char[]數(shù)組
// char[] cbuf = new char[1024];
// int len;
// while((len = br.read(cbuf)) != -1){
// bw.write(cbuf,0,len);
// bw.flush();
// }
//方式二:使用String
String data;
while((data = br.readLine()) != null){
//方法一:
// bw.write(data + "\n");//data中不包含換行符
//方法二:
bw.write(data);//data中不包含換行符
bw.newLine();//提供換行的操作
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//關(guān)閉資源
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
轉(zhuǎn)換流
1.轉(zhuǎn)換流:屬于字符流
InputStreamReader:將一個(gè)字節(jié)的輸入流轉(zhuǎn)換為字符的輸入流
OutputStreamWriter:將一個(gè)字符的輸出流轉(zhuǎn)換為字節(jié)的輸出流
2.作用:提供字節(jié)流與字符流之間的轉(zhuǎn)換
- 解碼:字節(jié)隐砸、字節(jié)數(shù)組 --->字符數(shù)組、字符串
編碼:字符數(shù)組蝙眶、字符串 ---> 字節(jié)季希、字節(jié)數(shù)組
//1.造文件、造流
File file1 = new File("dbcp.txt");
File file2 = new File("dbcp_gbk.txt");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");//解碼
OutputStreamWriter osw = new OutputStreamWriter(fos,"gdk");//編碼
//2.讀寫過程
char[] cbuf = new char[20];
int len;
while((len = isr.read(cbuf)) != -1){
osw.write(cbuf,0,len);
}
//3.關(guān)閉資源
isr.close();
osw.close();
}
對(duì)象流
- ObjectInputStream
- ObjectOutputStream
用于存儲(chǔ)和讀取基本數(shù)據(jù)類型數(shù)據(jù)或對(duì)象的處理流幽纷。它的強(qiáng)大之處就是可
以把Java中的對(duì)象寫入到數(shù)據(jù)源中式塌,也能把對(duì)象從數(shù)據(jù)源中還原回來。
- 序列化:用ObjectOutputStream類保存基本類型數(shù)據(jù)或?qū)ο蟮臋C(jī)制
- 反序列化:用ObjectInputStream類讀取基本類型數(shù)據(jù)或?qū)ο蟮臋C(jī)制
- ObjectOutputStream和ObjectInputStream不能序列化static和transient修飾的成員變量
/ 對(duì)象序列化機(jī)制允許把內(nèi)存中的Java對(duì)象轉(zhuǎn)換成平臺(tái)無關(guān)的二進(jìn)制流友浸,從而允許把這種二進(jìn)制流持久地保存在磁盤上峰尝,或通過網(wǎng)絡(luò)將這種二進(jìn)制流傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。//當(dāng)其它程序獲取了這種二進(jìn)制流收恢,就可以恢復(fù)成原來的Java對(duì)象境析。
/ 序列化的好處在于可將任何實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)化為字節(jié)數(shù)據(jù),使其在保存和傳輸時(shí)可被還原
/ 序列化是 RMI(Remote Method Invoke – 遠(yuǎn)程方法調(diào)用)過程的參數(shù)和返回值都必須實(shí)現(xiàn)的機(jī)制派诬,而 RMI 是 JavaEE 的基礎(chǔ)劳淆。因此序列化機(jī)制是
JavaEE 平臺(tái)的基礎(chǔ)
/ 如果需要讓某個(gè)對(duì)象支持序列化機(jī)制,則必須讓對(duì)象所屬的類及其屬性是可序列化的默赂,為了讓某個(gè)類是可序列化的沛鸵,該類必須實(shí)現(xiàn)如下兩個(gè)接口之一。否則缆八,會(huì)拋出NotSerializableException異常
/ Serializable
/ Externalizable
* 對(duì)象流的使用
* 1.ObjectInputStream 和 ObjectOutputStream
* 2.作用:用于存儲(chǔ)和讀取基本數(shù)據(jù)類型數(shù)據(jù)或?qū)ο蟮奶幚砹髑K膹?qiáng)大之處就是可以把Java中的對(duì)象寫入到數(shù)據(jù)源中,也能把對(duì)象從數(shù)據(jù)源中還原回來奈辰。
*
* 3.要想一個(gè)java對(duì)象是可序列化的栏妖,需要滿足相應(yīng)的要求。見Person.java
*
* 4.序列化機(jī)制:
* 對(duì)象序列化機(jī)制允許把內(nèi)存中的Java對(duì)象轉(zhuǎn)換成平臺(tái)無關(guān)的二進(jìn)制流奖恰,從而允許把這種
* 二進(jìn)制流持久地保存在磁盤上吊趾,或通過網(wǎng)絡(luò)將這種二進(jìn)制流傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。
* 當(dāng)其它程序獲取了這種二進(jìn)制流瑟啃,就可以恢復(fù)成原來的Java對(duì)象论泛。
/*
序列化過程:將內(nèi)存中的java對(duì)象保存到磁盤中或通過網(wǎng)絡(luò)傳輸出去
使用ObjectOutputStream實(shí)現(xiàn)
*/
@Test
public void testObjectOutputStream(){
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
oos.writeObject(new String("我愛北京天安門"));
oos.flush();//刷新操作
oos.writeObject(new Person("王銘",23));
oos.flush();
oos.writeObject(new Person("張學(xué)良",23,1001,new Account(5000)));
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(oos != null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*
反序列化:將磁盤文件中的對(duì)象還原為內(nèi)存中的一個(gè)java對(duì)象
使用ObjectInputStream來實(shí)現(xiàn)
*/
@Test
public void testObjectInputStream(){
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("object.dat"));
Object obj = ois.readObject();
String str = (String) obj;
Person p = (Person) ois.readObject();
Person p1 = (Person) ois.readObject();
System.out.println(str);
System.out.println(p);
System.out.println(p1);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
凡是實(shí)現(xiàn)Serializable接口的類都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)變量:
- private static final long serialVersionUID;
時(shí)間:2019-12-14 09:00:02