File
File類型的構造方法
File(File parent, String child) 從父抽象路徑名和子路徑名字元串建立新的 File執行個體。 |
File(String pathname) 通過将給定的路徑名字元串轉換為抽象路徑名來建立新的 File執行個體。 |
File(String parent, String child) 從父路徑名字元串和子路徑名字元串建立新的 File執行個體。 |
File類型的建立方式
boolean | createNewFile() 當且僅當具有該名稱的檔案尚不存在時,原子地建立一個由該抽象路徑名命名的新的空檔案。 |
boolean | mkdir() 建立由此抽象路徑名命名的目錄。 |
boolean | mkdirs() 建立由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄。 |
練習:在D盤中a/b/c建立一個檔案,名稱叫HelloWorld.java
import java.io.File;
import java.io.IOException;
//注:沒D盤,用F盤代替了
public class Test01IO {
public static void main(String[] args) throws Exception {
File dir = new File("F:/a/b/c");
dir.mkdirs();
File file = new File(dir,"HelloWorld.java");
file.createNewFile();
}
}
File類型的删除方法
boolean | delete() 删除由此抽象路徑名表示的檔案或目錄。 |
注意事項:
在删除檔案夾的時候,隻能删除的空的檔案夾。
delete方法不走資源回收筒。
File類型的重命名功能
boolean | renameTo(File dest) 重命名由此抽象路徑名表示的檔案。 |
注意事項:
如果在同一個檔案夾下,修改路徑,就是重命名操作。
如果不在同一個檔案夾下,修改路徑,就是剪切操作。
(一開始File dest不能真實存在)
File類型中的判斷功能
boolean | exists() 測試此抽象路徑名表示的檔案或目錄是否存在。 |
boolean | isDirectory() 測試此抽象路徑名表示的檔案是否為目錄。 |
boolean | isFile() 測試此抽象路徑名表示的檔案是否為普通檔案。 |
File類型的擷取方法
String | getAbsolutePath() 傳回此抽象路徑名的絕對路徑名字元串。 |
String | getPath() 将此抽象路徑名轉換為路徑名字元串。 |
String | getName() 傳回由此抽象路徑名表示的檔案或目錄的名稱。 |
long | length() 傳回由此抽象路徑名表示的檔案的長度。 |
String[] | list() 傳回一個字元串數組,命名由此抽象路徑名表示的目錄中的檔案和目錄。 |
File[] | listFiles() 傳回一個抽象路徑名數組,表示由該抽象路徑名表示的目錄中的檔案。 |
練習一:
鍵盤錄入一個字元串,表示一個檔案夾路徑,如果不是檔案夾提示重新錄入,列印目前檔案夾下,所有的大于10M的字尾名名為.mp4檔案的絕對路徑。
isDirectory() listFiles() length() getName().endWiths(“mp4”) getAbsoultPath()
import java.io.File;
import java.util.Scanner;
public class Test01File {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean flag;
do {
flag = false;
System.out.println("請錄入一個字元串(檔案夾路徑):");
String path = sc.nextLine();
File file = new File(path);
if(file.isDirectory()) {//true當且僅當該抽象路徑名表示的檔案存在且為目錄時; false否則
printAbsolutePath(file);
}else {
System.out.println("親,您剛剛的錄入有誤,請重新錄入哦!");
flag = true;
}
}while(flag);
}
//列印目前檔案夾下,所有的大于10M的字尾名名為.mp4檔案的絕對路徑
private static void printAbsolutePath(File file) {
File[] files = file.listFiles();
for(File f : files) {//true當且僅當該抽象路徑名表示的檔案存在且為檔案時; false否則
if(f.isFile()) {
//1kb = 1024位元組 1mb = 1024kb
if(f.getName().endsWith(".mp4")&&f.length()>10*1024*1024) {
System.out.println(f.getAbsolutePath());
}
}else {
printAbsolutePath(f);
}
}
}
}
練習二:
鍵盤錄入一個檔案夾路徑,列印這個檔案夾下的所有檔案的絕對路徑(包含子檔案夾的内容)
import java.io.File;
import java.util.Scanner;
public class Test02File {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean flag;
do {
flag = false;
System.out.println("請錄入一個字元串(檔案夾路徑):");
String path = sc.nextLine();
File file = new File(path);
if(file.isDirectory()) {//true當且僅當該抽象路徑名表示的檔案存在且為目錄時; false否則
printAbsolutePath(file);
}else {
System.out.println("親,您剛剛的錄入有誤,請重新錄入哦!");
flag = true;
}
}while(flag);
}
private static void printAbsolutePath(File file) {
File[] files = file.listFiles();
for(File f : files) {//true當且僅當該抽象路徑名表示的檔案存在且為檔案時; false否則
if(f.isFile()) {
System.out.println(f.getAbsolutePath());
}else {
printAbsolutePath(f);
}
}
}
}
IO流(字元流、位元組流)
輸入輸出流是站在記憶體的角度上看的!站在記憶體的角度看待方向,從其它裝置進入到記憶體的,都是輸入,從記憶體到其它裝置,都是輸出
體系結構
位元組流:
位元組輸入流:InputStream
位元組輸出流: OutputStream
字元流:
字元輸入流:Reader
字元輸出流:Writer
InputStream
位元組輸入流的頂層父類
常用的方法 輸入流:讀取
abstract int | read() 從輸入流讀取資料的下一個位元組。 結束标志為-1 |
int | read(byte[] b) 從輸入流讀取一些位元組數,并将它們存儲到緩沖區 b 。 結束标志為-1 |
int | read(byte[] b, int off, int len) 從輸入流讀取最多 len位元組的資料到一個位元組數組。 |
Int len = read(byte[] buf);傳回值為覆寫位元組數組的長度。
使用InputStream的子類對象FileInputStream
FileInputStream的構造方法
FileInputStream(File file)
通過打開與實際檔案的連接配接建立一個 FileInputStream ,該檔案由檔案系統中的 File對象 file命名。
FileInputStream(String name)
通過打開與實際檔案的連接配接來建立一個 FileInputStream ,該檔案由檔案系統中的路徑名 name命名。
OutputStream
位元組輸出流的頂層抽象父類。
常用方法
void | write(byte[] b) 将 b.length位元組從指定的位元組數組寫入此輸出流。 |
void | write(byte[] b, int off, int len) 從指定的位元組數組寫入 len個位元組,從偏移 off開始輸出到此輸出流。 |
abstract void | write(int b) 将指定的位元組寫入此輸出流。 |
void | close() 關閉此檔案輸出流并釋放與此流相關聯的任何系統資源。 |
FileOutputStream
FileOutputStream(File file) 建立檔案輸出流以寫入由指定的 File對象表示的檔案。 |
FileOutputStream(File file, boolean append) 建立檔案輸出流以寫入由指定的 File對象表示的檔案。 |
FileOutputStream(String name) 建立檔案輸出流以指定的名稱寫入檔案。 |
FileOutputStream(String name, boolean append) 建立檔案輸出流以指定的名稱寫入檔案。 |
InputStream類型的read()方法和read(byte[] buf)方法的比較
讀取位元組個數的差別
read()方法一次隻讀取一個位元組
read(buf)方法一次可以讀取多個位元組,取決于數組的大小
傳回值不同
read()讀取到的是檔案位元組資訊是作為傳回值進行傳回的。
read(buf):讀取到的位元組存儲到數組中,傳回的是覆寫數組的長度。
高效緩沖流
BufferedInputStream和BufferedOutputStream
構造方法
BufferedInputStream(InputStream in)
建立一個 BufferedInputStream并儲存其參數,輸入流 in ,供以後使用。
BufferedOutputStream(OutputStream out)
建立一個新的緩沖輸出流,以将資料寫入指定的底層輸出流。
BufferedInputStream高效的原理:在該類型中準備一個數組,存儲位元組資訊,當外界調用read()方法想擷取一個位元組的時候,該對象從檔案中一次性讀取一8192個位元組到數組中,隻傳回一個位元組,再次調用讀取方法read(),隻需要從自帶的數組中去擷取資料即可,不再需要重新通路檔案。
BufferedOutpStream高效的原理:在該類中準備一個數組,存儲位元組資訊,當外界調用write()方法想寫出一個位元組的時候,該對象直接将這個位元組存儲到自已的數組中,而不重新整理到新檔案中,一直到該數組所有8192個位置全都占滿,該對象才把這個數組中所有的資料一次性寫到目标檔案中。
通用流的書寫格式
建立一個流和檔案進行關聯,提高效率加byte[],
加上高效緩沖流,自帶緩存。
輸出流中的close和flush的差別
close方法在調用的時候預設先會調用flush
close方法把流對象關閉掉了
flush隻是把緩沖區的資料重新整理到檔案中
字元流
字元輸入流:Reader
字元輸出流:Writer
位元組流雖然也可以操作字元,但是在操作中英文混合的時候,判斷起來較麻煩,需要判斷中英文的辨別,如果是英文的辨別,直接讀取一個位元組,如果是中文的辨別,需要再次讀取一個位元組拼接成兩個位元組,一塊讀取,這種操作判斷起來非常 麻煩,恰巧字元流幫咱們封裝這種判斷辨別的操作,是以直接可以使用字元流來操作中英文混合的字元。
Reader:
int | read() 讀一個字元 結束标志-1 |
int | read(char[] cbuf) 将字元讀入數組。 結束标志-1 |
Writer:
void | write(char[] cbuf) 寫入一個字元數組。 |
abstract void | write(char[] cbuf, int off, int len) 寫入字元數組的一部分。 |
void | write(int c) 寫一個字元 |
void | write(String str) 寫一個字元串 |
void | write(String str, int off, int len) 寫一個字元串的一部分。 |
abstract void | close() 關閉流,先重新整理。 |
abstract void | flush() 重新整理流。 |
練習:
字元流的複制粘貼操作
//字元流的複制粘貼操作
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
//複制粘貼docx文檔還是會出現亂碼,但是txt文檔就沒問題
public class Test02IO {
public static void main(String[] args) throws Exception {
//BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\課程資料\\正在學習\\大資料1028班\\Homework2019\\Homework20191104.docx"));
//BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/Homework20191104.docx"));
BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\課程資料\\正在學習\\大資料1028班\\Homework2019\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/a.txt"));
String str = "";
while((str=br.readLine())!=null) {
bw.write(str);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}