一、java.io 包,輸入輸出包。當我們需要做文件的處理,比如上傳下載等,都需要使用到 java.io 包。
1、File 類:
(1)File 類的相關概念
①、File類是Java.io 包中很重要的一個類;
②、File類的對象可以表示文件,還可以表示目錄,在程序中一個 File 類對象可以代表一個文件或目錄;
③、File對象可以對文件或目錄的屬性進行操作,如文件名、最後修改日期,文件大小等;
④、File對象無法操作文件的具體數據,即不能直接對文件進行讀/寫操作。
(2)File類的4種構造方法
①、File(String pathname) 指定文件(或目錄)名和路徑創建文件對象;
②、File(File parent, String child) 根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例;
③、File(String parent, String child) 根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例;
④、File(URI uri) 通過將給定的 file: URI 轉換爲一個抽象路徑名來創建一個新的 File 實例。
例如:
//在當前目錄下創建一個與aaa.txt文件名相關聯的文件對象
File f1=new File("aaa.txt");
//指明詳細的路徑及文件名,請注意雙斜線或者用單反斜槓
File f2=new File("D:\\java\\Hello.java");
//指明詳細的路徑及目錄名,請注意雙斜線
File f3=new File("D:\\java");
(3)File類的常用的方法
boolean exists() 判斷文件是否存在,存在返回true,否則返回false;
boolean isFile() 判斷是否爲文件,是文件返回true,否則返回false;
boolean isDirectory() 判斷是否爲目錄,是目錄返回true,否則false;
String getName() 獲得文件名;
String getAbsolutePath() 獲得文件的絕對路徑;
long length() 獲得文件的長度(字節數);
boolean createNewFile() throws IOException 創建新文件,創建成功返回true,否則返回false,有可能拋 出IOException異常,必須捕捉;
boolean delete() 刪除文件,刪除成功返回true,否則返回false。
例如:
public static void main(String[] args) {
//創建File對象
File file = new File("notes.txt");
File dir = new File("E:\\project");
System.out.println("file是否是文件:" + file.isFile());
System.out.println("dir是否是目錄:" + dir.isDirectory());
System.out.println("file是否可讀:" + file.canRead());
System.out.println("file是否存在:" + file.exists());
}
File類的遍歷
public String[] list() 將目錄下的子目錄以及文件的名字,返回到String數組中
public File[] listFile() 將目錄下的子目錄以及文件的實例返回到File數組中
例如:
public static void main(String[] args) {
File file=new File("D:\\test");
String[] fileNameList=file.list(); //使用list方法
for(String s:fileNameList){
System.out.println(s);
}
File[] fileList=file.listFiles(); //使用listFiles方法
for(File f:fileList){
System.out.println(f.getAbsolutePath());
}
}
(4)文件/文件名過濾器
①、文件名的過濾器接口:interface FilenameFilter 常常用來過濾不符合規格的文件名
②、需要重寫 accept 方法自定義過濾器規則
方法:
boolean accept(File dir,String name)
dir:表示文件的當前目錄
name:表示當前目錄的子目錄或者文件的名字
③、File類中提供了使用文件名過濾器遍歷目錄的方法
方法:
String[] list(FilenameFilter filter)
把滿足指定過濾條件的文件和目錄,返回到String數組中
File[] listFiles(FilenameFilter filter)
把滿足制定過濾條件的文件和目錄,返回到File的數組中
例如:
import java.io.*;
public class FileNameFilterDemo {
public static void main(String [] args){
File file=new File("D:\\123");
String [] strfile=file.list(new NameFilter(".txt"));
for(String s : strfile){
System.out.println("後綴名是.txt文件是="+s);
}
}
}
class NameFilter implements FilenameFilter{
private String endStr;
public NameFilter(String endStr){
super();
this.endStr=endStr;
}
public boolean accept(File dir, String name) {
return name.endsWith(endStr);
}
}
④、文件過濾器接口:interface FileFilter 通常用於檢測文件是否存在
⑤、需重寫 accept 方法自定義過濾規則
方法:
boolean accept(File pathName)
pathName:表示當前目錄的子目錄或者文件的名字
⑥、File類中提供了使用文件過濾器遍歷目錄的方法
File[] listFiles(FilenameFilter filter) 把滿足制定過濾條件的文件盒目錄,返回到file數組中
例如:
public static void main(String[] args) {
File file=new File("D:\\123");
File [] files=file.listFiles(new Filter());
for(File fil : files){
System.out.println(fil+" 是目錄");
}
//過濾器的定義
class Filter implements FileFilter{
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
2、輸入和輸出的概念:
(1)輸入輸出(I/O)
①、是程序與外部設備或其他計算機進行交互的操作
②、幾乎所有的程序都具有輸入與輸出的操作
③、如從鍵盤上讀取數據,從本地或者網絡上的文件讀取數據或寫入數據等
④、通過輸入和輸出操作可以從外界接收信息,或者把信息傳遞給外界
⑤、Java把這些輸入和輸出操作用流來實現,通過統一的接口來表示,從而使程序設計更爲簡單
(2)輸入還是輸出是相對於內存來說的
(3)把數據讀到內存中,稱爲輸入,即 Input,進行數據的 read 操作
(4)從內存往外部設備寫數據,稱爲輸出,即 Output,進行數據的 write 操作
3、輸入輸出流:
(1)流按數據的傳輸方向分爲
①、輸入流:往內存中讀叫做輸入流
②、輸出流:從內存中往外面寫叫做輸出流
(2)所有輸入流都是 InputStream 類或者 Reader 類的子類
①、類名以 InputStream 結尾的類都是 InputStream 的子類
②、類名以 Reader 結尾的類都是 Reader 類的子類
(3)所有輸出流都是 OutputStream 類或者 Writer 類的子類
①、類名以 OutputStream 結尾的類都是 OutputStream 的子類
②、類名以 Writer 結尾的類都是 Writer 類的子類
4、根據輸入輸出是的編碼不同,可以分爲字節流和字符流:
從數據流編碼格式上劃分
-字節流
-字符流
InputStream 和 OutputStream 的子類都是字節流
-可以讀寫二進制文件,主要處理音頻,圖片,歌曲,字節流處理單元爲1字節
Reader 和 Writer 的子類都是字符流
-主要處理字符或者字符串,字符流處理單元爲2個字節
-字節流將讀取到的字節數據,去制定的編碼表中獲取對應文字
字節流中常用類
-字節輸入流 FileInputStream
-字節輸出流 FileOutputStream
字符流中常用類
-字符輸入流 FileReader
-字符輸出流 FileWriter
5、節點流和處理流:
根據封裝的類型不同流分爲
-節點流:如果流封裝的是某種特定的數據源,如文件,字符串,字符串數組等,稱爲節點流
-處理流:如果流封裝的是其他流對象,稱爲處理流。處理流提供了緩衝功能,提高讀寫效率
節點流常用類
字節輸入流:FileInputStream
字節輸出流:FileOutputStream
字符輸入流:FileReader
字符輸出流:FileWriter
處理流中常用的類
緩衝字節輸出流:BufferedOutputStream
緩衝字節輸入流:BufferedIutputStream
緩衝字符輸入流:BufferedReader
緩衝字符輸出流:BufferedWriter
處理流的特點
字符緩衝輸入流提供了讀取一行的方法 readLine()
字符緩衝輸出流提供了寫入一個空行的方法 newLine()
字符緩衝輸出流,把寫入的數據先寫入到內存,再使用 flush() 方法將內存數據刷到硬盤
注意:在使用字符緩衝輸出流是,一定先 flush(),然後 close(),避免數據的丟失
6、字節流和字符流的轉換:
(1)轉換流的由來
字符流與字節流之間的橋樑
方便了字符流與字節流之間的操作
(2)轉換流的應用
字節流中的數據都是字符時,轉成字符流操作更高效率
(3)字節流轉換成字符流的橋樑
-InputStreamReader
例如:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)
(4)字符流轉換成字節流的橋樑
-OutputStreamWriter
例如:
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputSttream out String charsetName)
注意:它讀入字節,並根據制定編碼方式,將之轉換爲字符流使用的編碼方式可能由名稱指定,或平臺可接受的 缺省編碼方式
(5)轉換流程圖
InputStream in = System.in;
||
InputStream isr = new InputStream(in);
||
BufferedReader br = new BufferedReader(isr);
||
String line = br.readLine();
(6)字符流轉成字節流圖解
FileOutputStream fs= new FileOutputStream("D:\\demo.txt");
||
OutputStreamWriter ow= new OutputStream(fs);
||
BufferWriter bw= new BufferedWriter(ow);
||
bw.write(line);