文章目錄
- File類
-
- 構造方法:
- File類的建立功能:
- File類的删除功能
- 重命名功能:
- File的判斷功能
- File類的擷取功能
-
- 基本擷取功能
- 進階擷取功能
- 進階擷取功能
- 遞歸
- IO流
-
- BufferedInputStream
- BufferedOutputStream
- 字元流
- InputStreamReader
-
- OutputStreamWriter:字元輸出流(字元流通向位元組流的橋梁):轉換流
- FileReader/FileWriter ---繼承自InputStreamReader/OutputStreamWriter
- BufferedReader
- BufferedWriter
- 記憶體操作流:操作臨時資料
File類
構造方法:
- public File(String pathname):裡面目前檔案夾/檔案的路徑 (推薦方式)
- public File(String parent,String child):parent的字元串路徑名和child的字元串路徑名構造一個File
- public File(File parent,String child):參數1:需要描述parent的字元串路徑名和子檔案字元串路徑名:構造一個File
File類的建立功能:
- public boolean createNewFile()throws IOException:建立檔案
- public boolean mkdir():建立目錄(檔案夾):如果存在該檔案夾,傳回值false
- public boolean mkdirs():
-
建立目錄(檔案夾):建立多級目錄,如果父目錄不存在,會自動建立!
- 如果描述檔案或者檔案夾沒有指定盤符,相對路徑:預設是目前項目路徑下
File類的删除功能
-
public boolean delete():删除目錄/檔案,
- 如果删除的是目錄,那麼前提條件:目錄必須為空
重命名功能:
- 針對某個檔案操作
- public boolean renameTo(File dest):
- 需求:将目前項目下的高圓圓.jpg — 楊桃.jpg
- 情況1:
-
目前檔案的路徑和該名後的路徑相同,僅僅是改名字
- 情況2:
-
目前檔案的路徑名和該後面的路徑名不相同,剪切并重命名
File的判斷功能
-
public boolean isFile():判斷是否是檔案
-
public boolean isDirectory():判斷是否是檔案夾(目錄)
-
public boolean canRead():判斷是否可讀
-
public boolean canWrite():判斷是否可寫
-
public boolean exists():判斷所file表示的檔案/目錄是否存在
-
public boolean isAbsolute():判斷是否是絕對路徑
-
public boolean isHidden():判斷是否是隐藏檔案
File類的擷取功能
-
基本擷取功能
- public String getAbsolutePath():擷取絕對路徑名
- public String getPath():目前檔案所表示的路徑
- public long length():擷取檔案長度
-
public long lastModified():擷取目前檔案最後一次修改的時間(long:毫秒值)
進階擷取功能
- public File[] listFiles():擷取的是某個盤符下/目錄File數組(目錄中的檔案)
- public String[] list():擷取某個盤符/目錄的下的所有檔案以及目錄的字元串數組
分析: * 1)描述下d盤符 d:\\ * File類描述 * * 2)擷取目前盤符下所有的檔案/檔案夾所表示字元串數組/目錄下的檔案的File數組 * 3)判斷如果目前字元串數組或者File數組不為空,周遊擷取到每一個檔案/目錄 * 4)判斷目前file是否是表示的檔案 * 再次判斷是否以".jpg"結尾---->String --> endsWith(".jpg") * 5)輸出即可!
public class FileTest { public static void main(String[] args) { //描述下d盤符 d:\\ File file = new File("d:\\") ; //System.out.println(file); //public File[] listFiles() File[] fileArray = file.listFiles() ; //防止空指針 if(fileArray!=null) { //周遊 for(File f:fileArray) { //System.out.println(f); //判斷f對象是否描述的檔案 if(f.isFile()) { //是檔案 //還需要判斷:目前檔案是否以.jpg結尾 if(f.getName().endsWith(".jpg")) { //是以.jpg結尾 //輸出 System.out.println(f.getName()); } } } } } }
進階擷取功能
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
在調用這個方法的時候,清單已經擷取到了 * FilenameFilter:檔案名稱過濾器 * 抽象方法: * public class FileTest2 { public static void main(String[] args) { //描述一下D盤 File file = new File("D:\\") ; //public File[] listFiles(FilenameFilter filter):進階功能:擷取file表示的目錄中檔案的File數組 //參數為:檔案名稱過濾器 File[] fileArray = file.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { //return false; //業務: /** * "所有的以".jpg"結尾的檔案!" * dir表示是否檔案 * name是否"以.jpg結尾" */ /* File file = new File(dir,name) ; boolean flag1 = file.isFile() ; //true:是檔案 boolean flag2 = name.endsWith(".jpg") ;//true:檔案名稱是以.jpg結尾 //System.out.println(name); return flag1 && flag2 ; */ //一步走: return new File(dir,name).isFile() && name.endsWith(".jpg") ; } }) ; //周遊File數組 if(fileArray!=null) { for(File f:fileArray) { System.out.println(f.getName()); } } } } boolean accept(File dir,String name):是否将檔案添加到檔案清單中 * 傳回值為true:添加到指定檔案清單中; * 方法業務:根據具體的情況判斷 * "所有的以".jpg"結尾的檔案!" * dir表示是否檔案 * name是否"已.jpg結尾"
遞歸
什麼是方法遞歸呢? * 方法遞歸: * 就是方法本身調用方法一種現象! * * Math.max(10,Math.max(40,70)) ; 方法嵌套方法 * 舉例: * 僞代碼 * public void show(int n){ //10 * //出口條件(方法結束條件) * if(n<0){ * * * System.exit(0) ;//Java虛拟機終止了 * } * System.out.println(n) ; * show(n--) ; * } * * 遞歸: * 1)必須定義一個方法:方法調用方法 * 2)滿足一定的規律 * 3)方法必須有出口條件(結束條件)--->否則:就是死遞歸! * * *注意事項: * 構造方法不存在遞歸!
需求
* 需要删除帶内容的目錄
* 删除目前項目下:demo檔案夾
*
* 分析:
* 1)描述下目前demo檔案夾:File file = new File("demo") ;
* 2)定義一個方法:delete(file) 遞歸删除的方法(删除目錄)
* 2.1)進階擷取功能:擷取目前file所表示的檔案以及檔案夾的File數組[]
* 2.2)判斷目前File數組不為空
* 判斷目前file是否是檔案夾 isDirectory()
* 是檔案夾,回到2)步繼續調用
*
* 不是檔案夾,是檔案
* 直接删除:調用delete()删除(檢視删除的是
* 那個檔案:擷取檔案名稱)
*
* 2.3)删除檔案夾:調用delete()删除目前空目錄
public class Test3 {
public static void main(String[] args) {
//1)使用File 描述目前項目下的demo檔案夾
File srcFile = new File("demo") ;
//2)定義一個删除目錄的方法
delete(srcFile) ;
}
private static void delete(File srcFolder) {
//擷取srcFolder檔案夾下面的所有檔案以及檔案夾的File數組
File[] fileArray = srcFolder.listFiles() ;
if(fileArray!= null) {
//周遊
for(File file :fileArray) {
//擷取到每一個file對象,判斷目前是否是檔案夾
if(file.isDirectory()) {
//回到2)進行遞歸删除
delete(file);//aaa bbb ccc
}else {
//不是檔案夾,直接删除
System.out.println(file.getName()+"---"+file.delete());
}
}
//删除目錄
System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
}
}
}
IO流
IO流
* 在裝置之間進行資料傳輸的操作!
*
* 按流的方向劃分:
* 輸入流
* 輸出流
*
* 按流的類型劃分
* 位元組流
*
* 位元組輸入流:InputStream
* 位元組輸出流:OutputStream
* 字元流
* 字元輸入流:Reader
* 字元輸出流:Writer
*
* 字元流是在位元組輸入流之後出現的,解決了中文亂碼問題!
* 一般情況:針對某個文本檔案進行讀寫複制操作: 優先采用字元流 (使用記事本打開并且能讀懂!)
*
* 位元組流
*
* 位元組輸入流:InputStream
* 位元組輸出流:OutputStream
*
* 兩個抽象類,不能直接執行個體化,提供了一些具體的子類
* XXXInputStream
* XXXOutputStream
* 都是位元組輸入流和位元組輸出流的子類
*
* 需求:需要在目前項目下輸出檔案:fos.txt檔案,并同時輸出内容:"hello,OutputStream"
*
* FileOuputStream:針對檔案操作:檔案輸出流(檔案位元組輸出流)
* public FileOutputStream(String name):
* public FileOutputStream(File file)
* 推薦使用第一種:直接跟目前的具體路徑!
* 使用步驟
* 1)建立OutputStream位元組輸出流對象,同時指向某個檔案路徑
* 2)寫資料:給檔案中寫入内容
* 3)關閉相關的系統資源
檔案位元組輸入流:FileInputStream
*
* 構造方法
* public FileInputStream(String name)throws FileNotFoundException
* 讀資料
* public abstract int read():一次讀取一個位元組
* public int read(byte[] b) throws IOException:一次讀取一個位元組數組
*
* 使用步驟
* 1)建立FileInputStream對象:指向哪個檔案
* 2)讀資料 :public abstract int read():讀取一個位元組
* 展示結果
* 3)關閉資源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*
* 讀寫複制操作
*
* 在d盤下有一個FileInputStreamDemo.java檔案的内容
*
*
* 複制到目前項目路徑下:Copy.java檔案中
*
* 分析:
* 1)封裝d盤的檔案FileInputStreamDemo.java ---源檔案
* 使用輸入流讀取FileInputStreamDemo.java檔案的内容
*
* 2)封裝目标檔案:目前項目下:Copy.java
* 使用檔案位元組輸出流寫資料,将上面的内容複制進來!
*
* 3)兩種方式
* 要麼1)一次讀取一個位元組
* 要麼2)一次讀取一個位元組數組
*
*
* 複制圖檔檔案/視訊檔案...
*
*
*
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//封裝d盤的檔案FileInputStreamDemo.java ---源檔案
//建立位元組檔案輸入流對象
FileInputStream fis = new FileInputStream("d:\\FileInputStreamDemo.java") ;
//封裝目标檔案:目前項目下:Copy.java
FileOutputStream fos = new FileOutputStream("Copy.java") ;
/*
//讀寫複制操作
//方式1):1次讀取一個位元組
int by = 0 ;
while((by=fis.read())!=-1) {
//讀一個位元組,寫一個位元組到fos流對象中
fos.write(by);
}
*/
//方式2:一次讀取一個位元組數組
//定義一個數組
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=fis.read(bytes))!=-1) {
//寫一個位元組數組:從0開始,寫入實際位元組數
fos.write(bytes, 0, len);
}
//釋放資源
fos.close();
fis.close();
}
}
BufferedInputStream
- BufferedInputStream extends InputStream:位元組緩沖輸入流
- 構造方法
- BufferedInputStream(InputStream in)
BufferedOutputStream
- BufferedOutputStream extends OutputStream:位元組緩沖輸出流
- 構造方法
- public BufferedOutputStream(OutputStream out)
- 建立一個緩沖輸出流對象,預設緩沖區大小
- 目前:目前緩沖流隻是在流中提供了byte[] 緩沖區,預設足夠大,一般通過帶一個參的構造方法建立!
- 隻是提供緩沖區,具體檔案讀寫複制操作還是需要用底層流(InputStream/OutputStream)
字元流
InputStreamReader
InputStreamReader:字元輸入流 (字元流通向位元組流的橋梁)字元轉換輸入流
*
- 構造方法:
- public InputStreamReader(InputStream in):使用預設字元集進行解碼(gbk格式)
- public InputStreamReader(InputStream in, String charsetName)
- 使用指定的字元集進行解碼
- 成員方法:
- 讀的功能
- public int read():讀單個字元
- public int read(char[] cbuf):讀字元資料
- public int read(char[] cbuf,int offset,int len)讀字元數組的一部分
OutputStreamWriter:字元輸出流(字元流通向位元組流的橋梁):轉換流
- 構造方法
- public OutputStreamWriter(OutputStream out):gbk格式 使用預設字元集進行編碼的字元輸出流
- public OutputStreamWriter(OutputStream out, Charset cs)
- 使用指定的字元集構造出一個字元輸出流
- 成員方法
-
public void write(int c):寫入單個字元
-
public void write(char[] cbuf):寫入字元數組
-
public abstract void write(char[] cbuf,int off,int len) 寫入字元數組的一部分
-
public void write(String str):寫入字元串内容
-
public void write(String str,int off,int len):寫入字元串一部分
- flush()和close()
- 一個重新整理流:将緩沖的資料重新整理出來(中文:預設gbk格式:一個中文對兩個位元組),流重新整理之後還可以
- 繼續寫入資料;
- close()方法:将跟該流相關的系統資源釋放掉,
- 不再指向目前操作的檔案,關閉之後不能再寫入資料否則出現IOException
為了台灣字元流讀寫複制操作:
*
- 提供了字元轉換輸入流和字元轉換輸出流的便捷類
-
FileReader/FileWriter —繼承自InputStreamReader/OutputStreamWriter
- FileReader(String pathname)
- FileWriter(String pathname)
BufferedReader
- BufferedReader:字元緩沖輸入流
- 構造方法
- BufferedReader(Reader r):構造一個字元緩沖輸入流提供預設緩沖區大小
- 特有功能:
- public String readLine():一次讀取一行内容,當讀取到\n(換行了),就終止!
-
*Scanner(InputStream in)
*BufferedReader(Reader r):可以作為鍵盤錄入(使用流的方式)
BufferedWriter
- BufferedWriter:字元緩沖輸出流
- 将文本寫入字元輸出流,緩沖各個字元,進而提供單個字元、數組和字元串的高效寫入
- public BufferedWriter(Writer out):構造一個緩沖輸出流,預設緩沖區大小
- 成員方法
- 特有功能
-
public void newLine():寫入行的分隔符(換行)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
/**
*
* 鍵盤錄入:
*
* 1)Scanner(InputStream in)
* 2)BufferedReader(Reader r):可以作為鍵盤錄入(使用流的方式)
*
*
*/
public class Demo {
public static void main(String[] args) throws IOException {
/*
Scanner sc = new Scanner(System.in) ;
System.out.println("請您輸入String資料:");
String str = sc.nextLine() ;
System.out.println(str);
*/
//使用BufferedReader(Reader r):可以作為鍵盤錄入
/*
//分步走
InputStream in = System.in ;
//建立Reader流對象
Reader r = new InputStreamReader(in) ; //字元轉換流:通向位元組流的橋梁
//建立BufferedReader流對象
BufferedReader br = new BufferedReader(r) ;
*/
//一步走
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) ;
System.out.println("請您輸入一個資料:"); //"100" 數字字元串
//利用BufferedReader:的readLine()讀取一行資料
String line = br.readLine() ; //"100"
//String---int: Integer.parseInt(String str)
int num = Integer.parseInt(line) ;
System.out.println("您錄入的字元串是:"+num);
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 使用BufferedReader/BufferedWriter:讀寫複制操作:文本檔案複制
* 利用特有功能(一種新的方式)
*
* 項目下的Demo.java---複制到D盤下:a.java檔案中
* 使用BufferedReader:字元緩沖輸入流的readLine():一次讀取一行
* 使用BufferedWriter:newLine()可以實作換行
*
* 總結針對文本檔案的複制操作:
* InputStreamReader/OutputStreamWriter:一次讀取一個字元
* InputStreamReader/OutputStreamWriter:一次讀取一個字元數組
* (同上)
* FileReader/FileWriter一次讀取一個字元
* FileReader/FileWriter一次讀取一個字元數組
*
* BufferdReader/BufferedWriter:一次讀取一個字元
* BufferdReader/BufferedWriter:一次讀取一個字元數組
* BufferedReader/BufferedWriter:一次讀取一行
*
*
*
*/
public class Test {
public static void main(String[] args) throws IOException {
//封裝源檔案
BufferedReader br = new BufferedReader(new FileReader("Demo.java")) ;
//封裝目标檔案
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.java")) ;
//讀寫
String line = null ;
while((line=br.readLine())!=null) {
//讀一行,bw寫一行
bw.write(line);
bw.newLine();
bw.flush();
}
//釋放資源
bw.close();
br.close();
}
}
-
記憶體操作流:操作臨時資料
- ByteArrayOutputStream:記憶體操作輸出流
- 構造方法:
- public ByteArrayOutputStream(){}:構造一個預設的緩沖大小的輸出流對象
- 成員方法
- public byte[] toByteArray():将記憶體操作輸出流中流對象—數組格式
- ByteArrayInputStream:記憶體操作輸入流
- 構造方法:
-
public ByteArrayInputStream(byte[] buf):使用指定的位元組數組作為緩沖區,構造
dReader(new FileReader(“Demo.java”)) ;
//封裝目标檔案
BufferedWriter bw = new BufferedWriter(new FileWriter(“D:\a.java”)) ;
//讀寫
String line = null ;
while((line=br.readLine())!=null) {
//讀一行,bw寫一行
bw.write(line);
bw.newLine();
bw.flush();
}
//釋放資源
bw.close();
br.close();
}
}
* ## 記憶體操作流:操作臨時資料
* ByteArrayOutputStream:記憶體操作輸出流
* 構造方法:
* public ByteArrayOutputStream(){}:構造一個預設的緩沖大小的輸出流對象
* 成員方法
* public byte[] toByteArray():将記憶體操作輸出流中流對象---數組格式
*
* ByteArrayInputStream:記憶體操作輸入流
* 構造方法:
* public ByteArrayInputStream(byte[] buf):使用指定的位元組數組作為緩沖區,構造
* 記憶體操作輸入流