java初識IO流及File類詳解
/**
* 初識IO流
* 輸入流input/reader,數(shù)據(jù)從數(shù)據(jù)源到程序。輸出流output/writer,數(shù)據(jù)從程序到目的地。輸入輸出是相對程序而言
* 字節(jié)流stream結尾,以字節(jié)為單位獲取數(shù)據(jù)。字符流reader/writer結尾,以字符為單位獲取數(shù)據(jù),字符char為2字節(jié)unicode
* 節(jié)點流,直接從數(shù)據(jù)源或目的地讀寫數(shù)據(jù)的流。處理流/包裝流,不直接連接數(shù)據(jù)源/目的地,對流進行處理/包裝的流
*/
public class firstIO {
? ?//使用FileInputStream和FileOutputStream進行文件讀寫操作
? ?//類結尾Stream代表字節(jié)流,input代表輸入流,output代表輸出流,file代表操作對象為文件,即以字節(jié)為單位對文件進行訪問的流,直接連接文件/數(shù)據(jù)源所以是節(jié)點流
? ?public static void main(String[] args) {
? ? ? ?String path = firstIO.class.getClassLoader().getResource("").getPath()+"testIO.txt";
? ? ? ?System.out.println(path);
? ? ? ?//路徑為"/C:/Users/86158/IdeaProjects/projectDIVA/out/production/iostream/testIO.txt"
? ? ? ?//.getResource()得到的是編譯后的class文件所在位置的路徑,在out目錄下而非當前正在編寫的java文件所在路徑
? ? ? ?try (FileOutputStream fos = new FileOutputStream(path)){
? ? ? ? ? ?//try-with-resource包裹io操作
? ? ? ? ? ?fos.write(97);
? ? ? ? ? ?//傳入int類型,轉化為字節(jié)存儲,當通過文本的方式讀取時才會轉換顯示為字符
? ? ? ? ? ?fos.write(100);
? ? ? ? ? ?fos.write(103);
? ? ? ? ? ?//Stream字節(jié)流是以字節(jié)為單位,存取的字符只能為0-255即對應ASCII碼
? ? ? ? ? ?fos.write(355);
? ? ? ? ? ?//當超過byte范圍會溢出,355-256=99對應字符c
? ? ? ? ? ?//作為文本文件打開時內容為“adgc”
? ? ? ?}catch (Exception e){
? ? ? ? ? ?//catch處理異常
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?try(FileInputStream fis = new FileInputStream(path)){
? ? ? ? ? ?for (int i = fis.read();i!=-1;i = fis.read()){
? ? ? ? ? ? ? ?//FileInputStream類的.read()為向后讀取一個字節(jié)/8位二進制數(shù),讀到字節(jié)時會返回十進制數(shù)值,返回值類型為int,作為文本讀取需要(char)手動轉換為字符,當文件讀完、向后讀不到字節(jié)時返回-1
? ? ? ? ? ? ? ?System.out.print((char) i);
? ? ? ? ? ? ? ?//文件中的換行符也會被讀取到,所以不需要println換行
? ? ? ? ? ? ? ?//結果為adgc
? ? ? ? ? ?}
? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?File f = new File("iostream/testFile.txt");
? ? ? ?//File文件類 將文件/目錄轉換為對象的包裝類,對文件/目錄包裝之后可以調用File類內的方法
? ? ? ?//創(chuàng)建File對象需要指定絕對路徑或相對路徑 new File("")默認生成當前項目目錄下的路徑
? ? ? ?System.out.println(f.getName());
? ? ? ?//.getName()只返回文件名,不包含路徑 結果為testFile.txt
? ? ? ?System.out.println(f.getPath());
? ? ? ?//.getPath()返回創(chuàng)建File對象時傳入的路徑,如果創(chuàng)建時傳入的是絕對路徑則返回絕對路徑,如果傳入的是相對路徑則返回相對路徑 結果為iostream\testFile.txt
? ? ? ?System.out.println(f.getAbsolutePath());
? ? ? ?//.getAbsolutePath()返回絕對路徑 結果為C:\Users\86158\IdeaProjects\projectDIVA\iostream\testFile.txt
? ? ? ?System.out.println(f.exists());
? ? ? ?//查詢文件/目錄f是否存在,結果為false
? ? ? ?try {
? ? ? ? ? ?System.out.println(f.createNewFile());
? ? ? ? ? ?//.createNewFile()創(chuàng)建新文件(非目錄),如果路徑中某級不存在或者已存在同名文件或目錄(含后綴的目錄)則創(chuàng)建失敗返回false,創(chuàng)建成功返回true
? ? ? ?} catch (IOException e) {
? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ?}
? ? ? ?System.out.println(f.delete());
? ? ? ?//刪除文件f,如果不存在則返回false,這里刪除只會刪除testFile.txt文件,目錄樹C:\Users\86158\IdeaProjects\projectDIVA\iostream不會刪除,因為目錄iostream是File("C:\Users\86158\IdeaProjects\projectDIVA\iostream")而不是C:\Users\86158\IdeaProjects\projectDIVA\iostream\testFile.txt
? ? ? ?System.out.println(f.isFile());
? ? ? ?//查詢f是否為文件,當沒有同名文件或者f為目錄時返回false
? ? ? ?System.out.println(f.length());
? ? ? ?//返回文件的字節(jié)數(shù),即文件大小,結果為0,f為空文件
? ? ? ?System.out.println(f.isHidden());
? ? ? ?//判斷文件f是否為隱藏文件,hidden隱藏的,結果為false
? ? ? ?System.out.println(f.isDirectory());
? ? ? ?//查詢f是否為目錄,不存在或f為文件時返回false,結果為false
? ? ? ?System.out.println(f.mkdir());
? ? ? ?//創(chuàng)建目錄f,當路徑中某級不存在或者f為文件或者目錄f已存在時返回false,結果為false
? ? ? ?System.out.println(f.mkdirs());
? ? ? ?//創(chuàng)建目錄樹f,當路徑中某級不存在時創(chuàng)建這些中間路徑,f為文件或者已存在目錄f時返回false,結果為false
? ? ? ?File f2 = f.getParentFile();
? ? ? ?//.getParentFile()返回上一級目錄的File對象
? ? ? ?System.out.println(f2.getPath());
? ? ? ?//結果為iostream,因為f使用相對路徑創(chuàng)建,所以f2也為相對路徑創(chuàng)建
? ? ? ?System.out.println(f.getParent());
? ? ? ?//.getParent()返回上一級的路徑字符串,結果為iostream和f2.getPath()相同
? ? ? ?String[] fileList = f2.list();
? ? ? ?//.list()返回目錄f2下的所有文件名
? ? ? ?System.out.println(Arrays.toString(fileList));
? ? ? ?//結果為[iostream.iml, src, testFile.txt],返回文件名不包含路徑
? ? ? ?File[] files = f2.listFiles();
? ? ? ?//.listFiles()返回目錄f2下的所有文件的File對象
? ? ? ?System.out.println(Arrays.toString(files));
? ? ? ?//結果為[iostream\iostream.iml, iostream\src, iostream\testFile.txt],直接打印File對象時.toString返回.getPath()
? ?}
}