所有的檔案和源代碼都開源在GitHub: https://github.com/kun213/DailyCode上了,希望我們可以一起加油,一起學習,一起交流,
day11【IO流】
今日學習內容-2020.10.10
@
目錄- day11【IO流】
- 今日學習內容-2020.10.10
- 一、File類
- 1、能夠說出File物件的創建方式
- 2、能夠使用File類常用方法
- 3、能夠辨別相對路徑和絕對路徑
- 4、能夠遍歷檔案夾
- 二、方法遞回
- 1、能夠解釋遞回的含義
- 2、能夠使用遞回的方式計算5的階乘
- 3、能夠說出使用遞回會記憶體溢位隱患的原因
- 三、IO流
- 1、能夠說出IO流的分類和功能
- 四、位元組流
- 五、位元組緩沖流
- 1、能夠使用位元組流緩沖流復制檔案
一、File類
1、能夠說出File物件的創建方式
File類的構造方法
- public File(String pathname) ` :通過將給定的路徑名字串轉換為抽象路徑名來創建新的 File實體,
public File(String parent,String child):從父路徑名字串和子路徑名字串創建新的 File實體,public File(File parent, String child):從父抽象路徑名和子路徑名字串創建新的 File實體,
代碼舉例:
/**
* File類構造方法
*/
public class FileDemo {
public static void main(String[] args) {
method_3();
}
/**
* File類構造方法
* File(File parent,String child)傳遞File型別的父路徑,和字串的子路徑
* 第一個引數是File物件
*/
public static void method_3(){
File parent = new File("E:\\JavaEE\\IdeaProjects");
File file = new File(parent,"basic-code");
System.out.println(file);
}
/**
* File類構造方法
* File(String parent,String child)傳遞字串的父路徑,和字串的子路徑
* 程式中,分的越開越好
* 單獨操作父路徑,單獨操作子路徑
*/
public static void method_2(){
File file = new File("E:\\JavaEE\\IdeaProjects","basic-code");
System.out.println(file);
}
/**
* File類構造方法
* File(String path)傳遞字串的路徑
*/
public static void method_1(){
File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
System.out.println(file);
}
}
注意:
- 一個File物件代表硬碟中實際存在的一個檔案或者目錄,
- 無論該路徑下是否存在檔案或者目錄,都不影響File物件的創建,
2、能夠使用File類常用方法
File類的獲取方法
public String getAbsolutePath():回傳此File的絕對路徑名字串,public String getPath():將此File轉換為路徑名字串,public String getName():回傳由此File表示的檔案或目錄的名稱,public long length():回傳由此File表示的檔案的長度,public File getParentFile()回傳由此File表示的檔案或目錄的父目錄,如果沒有父目錄,回傳null,
代碼舉例:
/**
* File類的獲取方法
* 基本上都是get開頭
*/
public class FileDemo {
public static void main(String[] args) {
method_5();
}
/**
* String getPath() 將構造方法中的路徑,轉成字串
*/
public static void method_5(){
File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
String path = file.getPath();
System.out.println(path.toString());
}
/**
* File getAbsoluteFile() 回傳File構造方法中路徑的絕對路徑形式
* 回傳值是File物件
*
* 注意: 直接傳遞檔案名,或者檔案夾名
* 獲取到的絕對路徑,將從IDEA的工程下計算
*/
public static void method_4(){
File file = new File("1.txt");
File abso = file.getAbsoluteFile();
System.out.println(abso);
}
/**
* long length() 獲取File構造方法中路徑表示的檔案的位元組數
*/
public static void method_3(){
File file = new File("E:\\開始學習的Java筆記和代碼\\測驗io\\1.txt");
long l = file.length();
System.out.println(l);
}
/**
* File getParentFile() 獲取,構造方法中封裝的路徑的父路徑
* 上一級檔案夾
* 方法的回傳值是File物件,可以方法呼叫鏈
* 如果此路徑名沒有父目錄,則回傳 null,
*/
public static void method_2(){
File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
File parent = file.getParentFile().getParentFile();//方法呼叫鏈
System.out.println(parent);
}
/**
* String getName() 回傳名字
* 獲取了,構造方法中封裝路徑,最后的名稱
* 名稱可能是檔案夾名,可能是檔案名
*/
public static void method_1(){
File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code");
String name = file.getName();
System.out.println(name);
}
}
3、能夠辨別相對路徑和絕對路徑
- 絕對路徑:從盤符開始的路徑,這是一個完整的路徑,絕對路徑具有唯一性,
- 相對路徑:相對于專案目錄的路徑,這是一個便捷的路徑,開發中經常使用,
public static void main(String[] args) {
// D盤下的bbb.java檔案
File f = new File("D:\\bbb.java");
System.out.println(f.getAbsolutePath());
// 專案下的bbb.java檔案
File f2 = new File("bbb.java");
System.out.println(f2.getAbsolutePath());
}
4、能夠遍歷檔案夾
public File[] listFiles()回傳一個File陣列,表示該File目錄中的所有的子檔案或目錄、public File[] listFiles(FileFilter filter)回傳一個File陣列,表示該File目錄中的所有的子檔案或目錄,filter是檔案過濾器,可以過濾不需要的檔案,
public static void main(String[] args) {
File dir = new File("d:\\java_code");
//獲取當前目錄下的檔案以及檔案夾物件,只要拿到了檔案物件,那么就可以獲取更多資訊
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file);
}
}
FileFilter介面
檔案過濾器介面,此介面的實作類可以傳遞給方法listFiles(),實作檔案的過濾功能
FileFilter介面方法:
public boolean accept(File path):方法引數就是listFiles()方法獲取到的檔案或者目錄的路徑,如果方法回傳true,表示需要此路徑,否則此路徑將被忽略,
遍歷目錄,獲取所有的Java檔案
public static void main(String[] args){
File dir = new File("d:\\demo");
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//判斷如果獲取到的是目錄,直接放行
if(pathname.isDirectory())
return true;
//獲取路徑中的檔案名,判斷是否java結尾,是就回傳true
//.toLowerCase是String 中的所有字符都轉換為小寫
return pathname.getName().toLowerCase().endsWith("java");
}
});
for(File file : files){
System.out.println(file);
}
}
二、方法遞回
1、能夠解釋遞回的含義
/**
* 方法的遞回呼叫: 撰寫程式上一個手段
* 方法自己呼叫自己,具有方法語言,都可以使用遞回
* 解決問題:
* 目錄遍歷案例,功能是確定的,就是制定目錄進行遍歷
* 遍歷的目錄,每次可能不同
*
* 功能的計算主體明確,計算中的引數每次是變化
*
* 方法自身呼叫注意事項:
* 1: 不能是死遞回,方法不停的進堆疊,不會出去,記憶體滿了,溢位
* 2: 遞回一定要有出口,能結束.但是如果進堆疊的方法過多也不可以
*
*/
2、能夠使用遞回的方式計算5的階乘
分析:分析:n的階乘:n! = n * (n-1) ... 3 * 2 * 1
實作代碼:
public class JieChengDemo {
public static void main(String[] args) {
int jieCheng = getJieCheng(5);
System.out.println(jieCheng);
}
/**
通過遞回演算法實作.
引數串列:int
回傳值型別: int
*/
public static int getJieCheng(int num){
/*
num為1時,方法回傳1,
相當于是方法的出口,num總有是1的情況
*/
if (num == 1){
return 1;
}else {
/*
num不為1時,方法回傳 num +(num-1)的累和
遞回呼叫getJieCheng方法
*/
return num * getJieCheng(num-1);
}
}
1~N遞回求和的代碼執行圖解:

注意:遞回一定要有條件限定,保證遞回能夠停止下來,否則就是死遞回,遞回次數不要太多,否則會發生堆疊記憶體溢位,會拋出StackOverflowError錯誤,
3、能夠說出使用遞回會記憶體溢位隱患的原因
函式呼叫的引數是通過堆疊空間來傳遞的,在呼叫程序中會占用執行緒的堆疊資源,
遞回呼叫只有走到最后的結束點后函式才能依次退出,而未到達最后的結束點之前,占用的堆疊空間一直沒有釋放,如果遞回呼叫次數過多,就可能導致占用的堆疊資源超過執行緒的最大值,從而導致堆疊溢位,導致程式的例外退出,
三、IO流
1、能夠說出IO流的分類和功能
根據資料的流向分為:輸入流和輸出流,
- 輸入流 :把資料從
其他設備上讀取到記憶體中的流, - 輸出流 :把資料從
記憶體中寫出到其他設備上的流,
格局資料的型別分為:位元組流和字符流,
- 位元組流 :以位元組為單位,讀寫資料的流,
- 字符流 :以字符為單位,讀寫資料的流,

四、位元組流
使用位元組流可以進行任何檔案的復制,因為位元組流操作的是組成檔案的最小單元-位元組,
復制原理圖解:

代碼實作
/**
* 位元組流復制檔案,任意檔案
* 不能是檔案夾
*/
public static void main(String[] args) throws IOException {
// 1.創建流物件
// 1.1 指定資料源
FileInputStream fis = new FileInputStream("D:\\test.jpg");
// 1.2 指定目的地
FileOutputStream fos = new FileOutputStream("test_copy.jpg");
// 2.讀寫資料
// 2.1 定義陣列
byte[] b = new byte[1024];
// 2.2 定義長度
int len;
// 2.3 回圈讀取
while ((len = fis.read(b))!=-1) {
// 2.4 寫出資料
fos.write(b, 0 , len);
}
// 3.關閉資源
fos.close();
fis.close();
}
五、位元組緩沖流
1、能夠使用位元組流緩沖流復制檔案
緩沖流:針對基礎流物件進行高效處理的流物件,或者為基礎流增加功能,
位元組緩沖流:BufferedInputStream,BufferedOutputStream
緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖區讀寫,減少系統IO次數,從而提高讀寫的效率,
構造方法
public BufferedInputStream(InputStream in):創建一個 新的緩沖輸入流,public BufferedOutputStream(OutputStream out): 創建一個新的緩沖輸出流,
// 創建位元組緩沖輸入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 創建位元組緩沖輸出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
注意:在使用緩沖流時,必須傳遞基礎流,
代碼實作:緩沖流+陣列方式:
public static void main(String[] args) throws FileNotFoundException {
// 記錄開始時間
long start = System.currentTimeMillis();
// 創建流物件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk8.exe"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));
// 讀寫資料
int len = 0;
byte[] bytes = new byte[8*1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0 , len);
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("緩沖流使用陣列復制時間:"+(end - start)+" 毫秒");
}
緩沖流使用陣列復制時間:666 毫秒
ew BufferedOutputStream(new FileOutputStream("copy.exe"));
// 讀寫資料
int len = 0;
byte[] bytes = new byte[8*1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0 , len);
}
// 記錄結束時間
long end = System.currentTimeMillis();
System.out.println("緩沖流使用陣列復制時間:"+(end - start)+" 毫秒");
}
緩沖流使用陣列復制時間:666 毫秒
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166757.html
標籤:Java
上一篇:myBatis 入門學習
