人們大多數時候的焦慮,大概是太想要一個那不確定的答案了吧。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一一? 陳長生.
1.認識文件
? ? ? ? 現實中,我們把一張一張有內容的紙整合在一起稱為文件,計算機中,通過硬盤這種I/O設備進行數據保存時,它會獨立成一個一個的單位保存,而這種以單位方式保存的也就稱為文件。
? ? ? ? 文件除了數據內容外,還有文件名,文件類型,文件大小等信息,我們稱為文件的元信息。
1.1.樹型模型組織 和 目錄
? ? ? ? 隨著文件的越來越多,對一批大量的文件我們就需要進行管理,而樹型模型就是個很好的管理模式,有父級,同級,子級,而這種我們一般稱為文件夾或目錄。
1.2.文件路徑(Path)
? ? ? ? 那么創建了文件如何在計算機查找那唯一的文件呢,我們一般用絕對路徑和相對路徑。
1.2.1.絕對路徑
? ? ? ? 絕對路徑就是一條完整的路徑,開頭是從盤符(例如:C:)開始的,可以從樹型的角度想,每個節點都是從根節點開始往下,而樹型中的根節點就是我們所謂的盤符。
例:D:\java相關\java ee\4.Java+EE初階課件\Java EE初階課件
1.2.2.相對路徑
? ? ? ? ?除了從根節點開始出發,我們還可以從任意節點查找,這種我們就稱為相對路徑。
例:\Java EE初階課件
1.3.文件類型
? ? ? ? 普通文件由于被保存的方式不同,我們也可以將文件分文本文件和二進制文件。
1.3.1.文本文件
? ? ? ? 被ascii碼編譯過的字符,每個字符都對應著一個ascii碼值。
1.3.2.二進制文件
????????文件內容通常由字節序列組成,不依賴于字符編碼。
2.JAVA中操作文件
? ? ? ? JAVA中通過File類對一個文件進行抽象的描述,注:有File對象并不代表該文件真實存在,它只是對文件或目錄路徑的抽象表示。
2.1.File類
2.1.1.File構造方法
import java.io.File;
import java.net.URI;
import java.net.URL;
//構造方法示例
public class text1 {public static void main(String[] args) {//File(URL url)//通過url來實例化File對象URI url =new File("text1.txt").toURI();//獲取當前類的路徑File file1 =new File(url);//File(String pathname)//通過絕對路徑來實例化File對象File file2=new File("text1.txt");//獲取當前類的路徑//File(String parent,string chile)//通過父路徑和子路徑來實例化File對象File file3=new File("C:/parent","chile.txt");//獲取當前類的路徑下的chile.class文件//File(File parent,String child)//通過實例化過的父路徑和每實例化過的子路徑來實例化路徑File Praent=new File("C:/parent");File file4=new File(Praent,"chile.txt");}
}
2.1.2.File方法
get相關的方法
//get相關方法
import java.io.File;
public class text2 {public static void main(String[] args) throws Exception {File file=new File("./text");//獲取文件名file.getName();//獲取父文件夾名file.getParent();//獲取文件路徑file.getPath();//獲取絕對路勁file.getAbsolutePath();//獲取規范路徑file.getCanonicalPath();}
}
文件與文件夾(目錄)的創建刪除
//文件與文件夾(目錄)的創建刪除
import java.io.File;
public class text3 {public static void main(String[] args) throws Exception {File file=new File("./text");//文件的創建file.createNewFile();//文件的刪除file.delete();//文件夾的創建file.mkdir();//多重文件夾的創建file.mkdirs();}
}
判斷
//判斷
import java.io.File;
public class text4 {public static void main(String[] args) {File file=new File("./text");//判斷是否是文件夾file.isDirectory();//判斷是否是文件file.isFile();}
}
3.數據流--文件內容的讀寫
? ? ? ? 文件內容的操作,一般分為讀文件(硬盤數據讀到內存中)和寫文件(內存的數據寫入硬盤),而我們計算機是用流對象來進行文件內容的操作。
3.1.流操作
????????
3.1.1.InputStream與FileInputStream
? ? ? ? JAVA提供的InputStream類可以提供讀取方法,但是因為它是抽象類,所以要有它的具體實現類FileputStream來實現讀取方法。
1)關閉資源
? ? ? ? JAVA中“關閉資源”是一個重要的操作,它能起到防止資源泄露,保證數據完整性的功能,在JAVA中有提供close()方法來關閉資源,但是大多數情況,我們都是使用try-with-resources(下面講到)。
2)輸出流
read()
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
//read()方法
public class text5 {public static void main(String[] args) throws Exception { //實例化一個File對象,指定文件路徑 File file=new File("./text.txt");//創建文件file.createNewFile();//實例化一個FileInputStream對象,指定文件路徑//try-with-resources語句,自動關閉資源try(InputStream input=new FileInputStream(file)){//循環讀取文件內容while(true){//讀取一個字節int c=input.read();//因為當read()方法讀取完文件中的內容后還會返回-1//所以當read()方法返回-1時,就說明文件中的內容已經全部讀取完了if(c==-1){break;}// 將讀取到的字節轉換為十六進制格式輸出// 適用于查看字節的原始值,不僅限于ASCII編碼的文本文件System.out.printf("0x%x",c);System.out.println();}} catch (Exception e) {e.printStackTrace();// TODO: handle exception}}
}
read(byte[] b)
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
//read(byte[] b)
public class text6 {public static void main(String[] args) throws Exception {//實例化File對象,指定文件路徑File file=new File("./ccs.txt");//創建文件file.createNewFile();//實例化一個FileInputStream對象,指定文件路徑//try-with-resources語句,自動關閉資源try(InputStream f1=new FileInputStream(file)){//循環讀取文件內容while(true){//定義一個byte數組,用于存儲讀取到的字節byte []bytes=new byte[1024];//調用read方法,將文件內容讀取到bytes數組中int n=f1.read(bytes);//如果read方法返回-1,表示文件已經讀取完畢if(n==-1){break;} //遍歷bytes數組,輸出每個字節的十六進制表示for(int i=0;i<n;i++){System.out.printf("0x%x",bytes[i]);System.out.println();}}}catch( Exception e){e.printStackTrace();} }
}
3)輸入流
write()
先創建一個空白的文本文件
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
//write()方法
//write()方法用于將數據寫入文件,數據可以是字節數組,也可以是單個字節。
public class text7 {public static void main(String[] args) throws IOException {//實例化一個File對象,指定文件路徑File input=new File("./demo1.txt");//創建文件input.createNewFile();//try-with-resources語句,自動關閉資源//FileOutputStream類是OutputStream的子類,用于將數據寫入文件try (OutputStream output = new FileOutputStream(input);){//寫入ascii為97,98,99,100的幾個字節output.write(97);output.write(98);output.write(99);output.write(100);} catch (Exception e) {e.printStackTrace();}}
}
運行后文本內容
內容為ascii為97,98,99,100的字符
write(byte[] b)方法
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
// write(byte[] b)方法
public class text8 {public static void main(String[] args) throws IOException {//實例化一個File對象,指定文件路徑File input=new File("./demo1.txt");//創建文件input.createNewFile();//try-with-resources語句,自動關閉資源//FileOutputStream類是OutputStream的子類,用于將數據寫入文件try (OutputStream output = new FileOutputStream(input);){//創建一個字節數組,存儲要寫入的字節byte[] bytes = {101,102,103,104};//將字節數組寫入文件output.write(bytes); } catch (Exception e) {e.printStackTrace();}}
}
運行后文本內容
由原本的abcd轉為efgh
append
????????明明沒有進行刪除操作,為什么abcd不見了呢?其實這個是因為它在每次運行時就創建一個新的文本,相當于將之前的內容清空然后再填入新的數據。
????????那有沒有什么辦法可以不清除之前的數據呢,答案是有的!
????????可以看到String name后面還有給參數,是boolean類型的append,該參數是判斷是否需要追加內容。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
// 追加方法
public class text9 {public static void main(String[] args) throws IOException {//實例化一個File對象,指定文件路徑File input=new File("./demo1.txt");//創建文件input.createNewFile();//try-with-resources語句,自動關閉資源//FileOutputStream類是OutputStream的子類,用于將數據寫入文件try (OutputStream output = new FileOutputStream(input,true);){//創建一個字節數組,存儲要寫入的字節byte[] bytes = {101,102,103,104};//將字節數組寫入文件output.write(bytes); } catch (Exception e) {e.printStackTrace();}}
}
運行后文本內容
可以看到已經成功追加數據了~~