
🙉專欄推薦:Java入門知識🙉
🙉?內容推薦:JUC常見類🙉
🐹今日詩詞:東風吹柳日初長,雨馀芳草斜陽🐹
??點贊???收藏??關注💬卑微小博主🙏
??點贊???收藏??關注💬卑微小博主🙏
目錄
什么是IO
什么是文件
文件的存儲
文件的路徑
絕對路徑
相對路徑
文件檢索
文本文件和二進制文件
Java操作文件
File類
patSeparator
File的構造方法
常見函數方法
文件創建
基準目錄
文件刪除
創建一級目錄
創建多級目錄
文件重命名
讀寫文件,打開關閉文件
字節流讀數據
read()方法無參版本
read(byte [] bytes)方法有參版本
read(bytep[] bytes, int off, int len)
關閉文件
文件描述符表
字節流寫數據
字符流讀數據
Unicode和Utf8編碼
字符流寫數據
字符流和字節流與Scanner的愛情火花
文件搜索功能
文件復制功能
文件內容搜索功能
美圖分享
什么是IO
這個不是靠感覺來的, 有人為的規定
什么是文件
文件夾是不是文件?
是文件: 文件夾被稱作目錄文件, 也是文件的一種
文件的存儲
文件存儲背后的數據結構是一個多叉樹
文件的路徑
絕對路徑
windows從此電腦出發, 此電腦到指定文件的路徑稱為絕對路徑
相對路徑
從某一文件出發, 某一文件到指定文件的路徑被稱為相對路徑
文件檢索
檢索通過? ?./? ?和 ../? 兩個基礎操作檢索
舉例:
1. 在bin目錄下查找qq.exe文件
2. 在bin目錄的上一級目錄(QQ目錄)查找qq.exe
3. 在其他目錄下查找qq.exe
文本文件和二進制文件
文本文件: 存儲文本數據, 這些數據是合法的字符
二進制文件: 存啥都行(本質上是01都構成的)
如何區分文本文件和二進制文件
方法: 使用記事本打開, 亂碼的是二進制文件, 不亂碼的就是文本文件
Java操作文件
Java標準庫內置了File類, 可以用來對文件進行操作
我們來看看File的屬性和參數
File類
patSeparator
pathSeparator: 分割符?
File的構造方法
有三個構造方法
我們來看看第二個如何使用吧!
常見函數方法
文件創建
基準目錄
基準目錄: 通常是程序當前工作的目錄
文件刪除
還有一種刪除方式
deleteOnExit() 這種刪除方式是程序運行完畢后才會刪除文件
創建一級目錄
通過mkdir()方法創建出一級目錄
多級目錄就是目錄里面套目錄
創建多級目錄
通過mkdirs()方法創建多級目錄
文件重命名
?通過renameTo()方法進行文件重命名????????
讀寫文件,打開關閉文件
Java中讀文件寫文件打開關閉文件和"流"這樣的類相關
流(stream)分成字節流和字符流
字節流: 以字節為單位讀寫數據
字符流: 以字符為單位讀寫數據
字節流讀文件: InputStream
字節流寫文件: OutputStream
字符流寫文件: Writer
字符流讀文件: Reader
字節流和字符從文件中讀數據方法相同: read()
字節流和字符從文件中寫數據方法相同: write()
字節流讀數據
InputStream類: 這個類可以打開一個文件
類里的方法可以對文件進行讀取數據的操作
正確使用方法: 雖然他是一個抽象類需要實現read()方法, 但是這樣很麻煩,而且耦合性很大,
因此標準庫提供了它的子類, 已經幫我們實現好了, 這個子類就是FileInputStream
read()方法無參版本
read(byte [] bytes)方法有參版本
read(bytep[] bytes, int off, int len)
關閉文件
打開文件, 用完之后要關閉
關閉文件: close()
文件描述符表
文件描述符表: 記錄文件的IO信息
每打開文件時就會消耗資源記錄信息, 關閉問價就會釋放資源
close()方法是一個非常重要的方法, 打開文件之后一定要記得關閉, 某些情況下即使寫了close方法也不一定會執行到, 比如下面這種情況
文件沒有及時關閉的影響: 大部分情況下沒啥影響, 如果多次打開文件,不去關閉文件, 導致文件描述符表被占滿, 占滿之后執行打開文件操作就會失敗,
解決辦法
可以把close()方法放到finally中
這種寫法不是很優雅, 有一種更好的寫法
try with resource
注意: 并不是所有的類都能放到try( ) 里, 只有實現了Closeable接口的類才可以, 這種寫法在{ }
的代碼執行完畢后會自動調用close方法
字節流寫數據
OutputStream類: 這個類可以打開文件, 并且類里的方法可以向文件寫入數據
OutputStream類中的write方法可以讓我們向文件里寫入數據
字符流讀數據
Reader類用于讀取字符流數據, 并且會自動打開對應的文件
類里的read方法可以讀取字符類型的數據
read方法有四種版本
Unicode和Utf8編碼
字符流寫數據
Writer類: 可以打開指定文件, 如果不存在就會創建一個, 之后可以使用Writer類里的方法向文件中寫入數據
write方法有四個版本
字符流和字節流與Scanner的愛情火花
以前我們都是Scanner scanner = new Scanner(System.in)的方式去輸入信息
現在學了字節流和字符流讀寫數據, 因此可以讓他們配合使用
文件搜索功能
文件的基礎操作我們已經了解了, 我們可以基于這些方法寫一個文件搜索功能
明確需求:
1.?輸入一個路徑
2. 輸入一個關鍵詞
3. 在這個路徑下查找文件, 這個文件名和關鍵詞相同
文件復制功能
這個功能就比較簡單了
要求: 輸入兩個路徑復制路徑和目的路徑, 然后將復制路徑文件的內容復制到目的路徑文件中
解決步驟:?
1. 創建目的文件
2. 讀取文件內容
3. 將內容復制到指定目錄文件中
import java.util.*; import java.io.*; //復制文件操作 public class Solution {public static void main(String[] args) throws IOException {//輸入兩個文件路徑, 復制路徑和目標路徑Scanner scanner = new Scanner(System.in);System.out.println("請輸入要復制的文件路徑: ");String src = scanner.next();System.out.println("請輸入目的路徑: ");String des = scanner.next();//判斷路徑是否合法File srcfile = new File(src);if (!srcfile.isFile()) {System.out.println("輸入復制文件的路徑不合法");return;}File desfile = new File(des);if(!desfile.getParentFile().isDirectory()) {//因為目的文件本事就不存在,所以判斷它上一級目錄文件存不存在System.out.println("輸入的目的路徑非法");return;}//1.創建文件//這里通過寫的方式自動創建文件OutputStream outputStream = new FileOutputStream(desfile);//2.讀取文件內容InputStream inputStream = new FileInputStream(srcfile);//3.寫入文件內容int a = 0;while (a != -1) {byte[] bytes = new byte[1024];a = inputStream.read(bytes);outputStream.write(bytes);}} }
測試一下
文件內容搜索功能
要交:
輸入一個路徑和關鍵詞, 在這個路徑下, 查找文件內容(不是文件名)包含關鍵詞的文件
解題步驟
1. 判斷路徑是否非法
2. 遍歷文件
3. 遍歷文件內容
4. 返回文件路徑
import java.util.*; import java.io.*; public class Solution {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);System.out.println("請輸入要搜索的路徑: ");String path = scanner.next();System.out.println("請輸入文件內容的關鍵詞: ");String str = scanner.next();//1.判斷路徑是否存在File pathfile = new File(path);if (!pathfile.exists()) {System.out.println("搜索路徑非法!");return;}//2. 遍歷路徑下的所有文件SearchFile(pathfile, str);}public static void SearchFile(File pathfile, String str) throws IOException {if (pathfile == null) {return;}if (pathfile.isDirectory()) {File[] files = pathfile.listFiles();//如果是一個目錄文件就繼續遞歸for (File file : files) {SearchFile(file, str);}} else {//是普通文件, 就遍歷文件內容Searchstr(pathfile, str);}}public static void Searchstr(File pathfile, String str) throws IOException{Reader reader = new FileReader(pathfile);int a = 0;StringBuilder tmp = new StringBuilder();while( a != -1) {a = reader.read();tmp.append((char) a);if (tmp.indexOf(str) >= 0) {System.out.println("找到了符合條件的文件: " + pathfile.getAbsolutePath());return;}}} }
運行結果
美圖分享
?🎆謝謝你的閱讀和耐心!祝愿你在編程的道路上取得更多的成功與喜悅!"🎆?🎄
??點贊收藏加關注,學習知識不迷路??
🎉??💪🎉??💪🎉??💪🎉??💪🎉
👍😏??點贊??收藏??關注😏👍
👍😏??點贊??收藏??關注😏👍
👍😏??點贊??收藏??關注😏👍
🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?🙆?♂?