網(wǎng)站首頁 編程語言 正文
IO流
1.字符流簡介
-
字符流核心組成
- 核心組成:Reader–> 字符輸入流、Writer–> 字符輸出流、BufferedReader–>字符緩沖流讀取文件、BufferedWriterr–>字符緩沖流文寫入件
-
字符流
- 字節(jié)流能操作所有文件,而字符流操作文本文件比較方便
- 解決了亂碼問題
-
字節(jié)流與字符流的區(qū)別:
-
在所有的流操作里。字節(jié)永遠是最基礎(chǔ)的。任何基于字節(jié)的操作都是正確的
-
無論你是文本文件還是二進制的文件。如果確認流里面只有可打印的字符,包括英文的和各種國家的文字,也包括中文,那么可以考慮用字符流。由于編碼不同,多字節(jié)的字符可能占用多個字節(jié)。比如GBK的漢字就占用2個字節(jié),而UTF-8的漢字就占用3個字節(jié)。所以,字符流是根據(jù)指定的編碼,將1個或多個字節(jié)轉(zhuǎn)化為java里面的unicode的字符,然后進行操作
-
字符操作一般使用Writer,Reader等
-
字節(jié)操作一般都是InputStream,OutputStream以及各種包裝類,比如BufferedlnputStream和BufferedOutputStream等。
-
如果你確認你要處理的流是可打印的字符,那么使用字符流會看上去簡單一點。如果不確認,那么用字節(jié)流總是不會錯的。
-
一般操作非文本文件時,使用字節(jié)流;操作文本文件時,建議使用字符流。
-
2.字符流抽象類常見方法
2.1字符流抽象類
-
reader:字符輸入流
public int read(){}
public int read(char[] c){}
public int read(char[] b, int off, int len){}
-
Writer: 字符輸出流
public void write(int n){}
public void write(String str){}
public void write(char[] c){}
2.2文件字符流
-
FileReader:
- public int read(char[] c) // 從流中讀取多個字符,將讀到的內(nèi)容存入 c 數(shù)組,返回實際讀到的字符數(shù);如果達到文件的尾部,則返回 -1
-
FileWriter:
- public void write(String str) // 一次寫多個字符,將所有字符寫入輸出流
2.21 使用字節(jié)流讀取文本文件代碼演示
package stream.demo02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
// 傳統(tǒng)字節(jié)流讀取txt中文文本
/*
使用傳統(tǒng)字節(jié)流讀中文文本,會出現(xiàn)亂碼問題。因為字節(jié)流讀入文件內(nèi)容時是按照一個字節(jié)一個字節(jié)來讀。
而hello.txt 采用UTF-8 編碼格式,一個漢字占三字節(jié),一節(jié)流的讀入方式將一個漢字拆分為三字字節(jié),所以讀入內(nèi)容出現(xiàn)了亂碼
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
// 1. 創(chuàng)建FileInputStream對象
FileInputStream fis = new FileInputStream("D:\\hello.txt");
// 2. 讀取
int count=0;
while ((count=fis.read())!=-1){
System.out.print((char)count);
}//?¥??¥??-|?1 ????¤??¤???‘?? 亂碼
// 3. 關(guān)閉
fis.close();
}
}
運行結(jié)果
?¥??¥??-|?1 ????¤??¤???‘??
2.22 使用文件字符流讀取文件代碼演示
package stream.demo02;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
//使用filereader讀取文件
public class FileReaderTest {
public static void main(String[] args) throws IOException {
// 1. 創(chuàng)建FileReader 文件字符輸入流
FileReader frd = new FileReader("D:\\hello.txt");
/*
// 2. 讀取
// 2.1 單個字符讀取
int date=0;
while ((date=frd.read())!=-1){//讀取一個字符
System.out.print((char)date);
}
*/
//讀取多個字符
char[] bytes = new char[5];// 字符緩沖區(qū)讀取
int count=0;
while ((count=frd.read(bytes))!=-1){
System.out.println(new String(bytes,0,count));
}
// 3. 關(guān)閉
frd.close();
}
}
運行結(jié)果
好好學習,
天天向上
2.23 使用文件字符流寫入文件代碼演示
package stream.demo02;
import java.io.FileWriter;
import java.io.IOException;
//使用filewriter 寫入文件
public class FileWriteTest {
public static void main(String[] args) throws IOException {
// 1. 創(chuàng)建FileWriter對象
FileWriter fileWriter = new FileWriter("D:\\write.txt");
// 2. 寫入
for (int i = 0; i < 10; i++) {
fileWriter.write("要精通java\r\n");
fileWriter.flush();
}
System.out.println("執(zhí)行完畢");
// 3. 關(guān)閉
fileWriter.close();
}
}
運行結(jié)果
執(zhí)行完畢
2.24 利用字符流復制文件代碼演示
package stream.demo02;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
使用字節(jié)流可以復制任意文件
使用FileReader和FileWriter復制文本文件,不能復制圖片或二進制文件
一切類型文件都是以二進制010101的形式存儲在硬盤上,字符流讀取文件時是按照編碼格式例如UTF-8 讀取,而圖片音頻等文件沒有編碼格式,因此字符流讀入亂碼
*/
public class FileCopyTest {
public static void main(String[] args) throws IOException {
// 1. 創(chuàng)建 FileReader FileWriter
FileReader frd = new FileReader("D:\\write.txt");
FileWriter fwt = new FileWriter("D:\\write2.txt");
// 2. 讀寫
int count=0;
while ((count=frd.read())!=-1){
fwt.write(count);
fwt.flush();
}
frd.close();
fwt.close();
System.out.println("執(zhí)行完畢");
}
}
運行結(jié)果
執(zhí)行完畢
2.3 字符緩沖流
-
緩沖流:BufferedReader / BufferedWriter
- 高效讀寫
- 支持輸入換行符
- 可一次寫一行讀一行
2.31 字符緩沖輸入流代碼演示:
package stream.demo02;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
//使用字符緩沖流讀取文件
public class BufferReaderTest {
public static void main(String[] args) throws IOException {
// 創(chuàng)建緩沖流
FileReader flr = new FileReader("D:\\write.txt");
BufferedReader bufferedReader = new BufferedReader(flr);
/*
// 讀取
// 1. 第一種方式
char[] chars=new char[1024];
int count=0;
while ((count=bufferedReader.read(chars))!=-1){
System.out.println(new String(chars,0,count));
}
*/
// 2. 第二種方式 一行一行讀取
String st=null;
while ((st=bufferedReader.readLine())!=null){//readLine():一行一行讀取文件,返回值為String類型當沒有下一行時返回null
System.out.println(st);
}
// 關(guān)閉
bufferedReader.close();
System.out.println("執(zhí)行完畢");
}
}
運行結(jié)果
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
執(zhí)行完畢
2.32 字符緩沖輸出流代碼演示:
package stream.demo02;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
//使用字符緩沖流寫入文件
public class BufferWriterTest {
public static void main(String[] args) throws IOException {
// 1. 創(chuàng)建BufferedWriter對象
FileWriter fileWriter = new FileWriter("D:\\buffer.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
// 2. 寫入
for (int i = 0; i < 10; i++) {
bufferedWriter.write("我愛學習,學習愛我");
bufferedWriter.newLine(); // 寫入一個換行符 相當于windows \r\n linux \n
bufferedWriter.flush();
}
// 3. 關(guān)閉
bufferedWriter.close();// 此時會自動關(guān)閉fw
System.out.println("執(zhí)行完畢");
}
}
運行結(jié)果
執(zhí)行完畢
2.4 打印流
-
PrintWriter
- 封裝了 print() / println()方法,支持寫入后換行
- 支持數(shù)據(jù)原樣打印
2.41 打印流代碼演示:
package stream.demo02;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
//功能:將數(shù)據(jù)打印到文件里 數(shù)據(jù)在代碼里什么樣子,打印出來就是什么樣子
public class PrintWriterTest {
public static void main(String[] args) throws FileNotFoundException {
// 1 創(chuàng)建打印流
PrintWriter printWriter = new PrintWriter("D:\\print.txt");
// 2 打印
printWriter.println(65);
printWriter.println(true);
printWriter.println(3.1415);
printWriter.print("A");
// 3 關(guān)閉
printWriter.close();
System.out.println("打印完畢");
}
}
運行結(jié)果
打印完畢
2.5 轉(zhuǎn)換流
-
橋轉(zhuǎn)換流:InputStreamReader / OutputStreamWriter
- 可將字節(jié)流轉(zhuǎn)換為字符流
- 可設(shè)置字符的編碼方式
2.51 轉(zhuǎn)換流讀文件代碼演示:
package stream.demo03;
import java.io.*;
//使用inputStreamReader 讀取文件,指定使用的編碼 (和FileinputStream 最大區(qū)別就是可以指定編碼)
public class InputStreamReaderTest {
public static void main(String[] args) throws IOException {
// 1 創(chuàng)建InputStreamReader對象
FileInputStream fis = new FileInputStream("D:\\write.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fis,"utf-8");
// 2 讀取文件
int count=0;
while ((count=inputStreamReader.read())!=-1){
System.out.print((char)count);
}
// 3 關(guān)閉
inputStreamReader.close();
System.out.println("執(zhí)行完畢");
}
}
運行結(jié)果
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
執(zhí)行完畢
2.52 轉(zhuǎn)換流寫文件代碼演示:
package stream.demo03;
import java.io.*;
//轉(zhuǎn)換流 使用OutputStreamWriter 寫文件 使用指定的編碼
public class OutputStreamWriterTest {
public static void main(String[] args) throws IOException {
// 1 創(chuàng)建OutputStreamReader對象
FileOutputStream fos = new FileOutputStream("D:\\utf.txt");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos,"utf-8");
// 2 寫入
for (int i = 0; i < 10; i++) {
outputStreamWriter.write("我愛中國,熱愛祖國\n\r");// **\r:**回車,移動到當前行行首;
//**\n:**換行,換到當前位置的下一行,但是不會回到行首;
//**\r\n:**回車+換行,移動到下一行的行首
outputStreamWriter.flush();
}
// 3 關(guān)閉
outputStreamWriter.close();
System.out.println("執(zhí)行完畢");
}
}
運行結(jié)果
執(zhí)行完畢
3.File 類
-
概念:代表物理盤符中的一個文件或者文件夾
-
IO 流: 對文件的內(nèi)容操作.
-
File 類: 對文件自身進行操作,eg:刪除文件,文件重新命名等.
-
3.1 常用方法
-
目前常見的方法有:
-
createNewFile()
// 創(chuàng)建一個新文件 -
mkdir()
//創(chuàng)建文件夾 -
delete()
// 刪除文件或空文件夾 -
exists()
// 判斷 File 對象所代表的對象是否存在 -
getAbsolutePath()
// 獲取文件的絕對路徑 -
getName()
// 獲取名字 -
getParent()
// 獲取 文件/目錄 所在的目錄 -
isDirectory()
// 是否是目錄,而不是文件 -
isFile()
是否為文件,而不是目錄 -
length()
// 獲取文件的長度 -
listFiles()
// 列出目錄中所有內(nèi)容 -
renameTo()
// 更改文件的名字
-
3.1 文件操作代碼演示:
package stream.demo04;
import java.io.File;
import java.io.IOException;
import java.util.Date;
/*
File類的使用
1. 分隔符
2. 文件操作
3. 文件夾操作
*/
//對文件進行操作
public class FileTest {
public static void main(String[] args) throws Exception {
sepearatorTest();
fileOpTest();
}
// 1. 分隔符
public static void sepearatorTest(){
System.out.println("打印路徑分割符:"+File.pathSeparator);
System.out.println("名稱分割符:"+File.separator);
}
// 2. 文件操作
public static void fileOpTest() throws IOException, InterruptedException {
// 1. 創(chuàng)建文件
File file = new File("D:\\file.txt");
if(!file.exists()){// 是否存在
boolean newFile = file.createNewFile();
System.out.println("創(chuàng)建結(jié)果:"+newFile);
}
// 2. 刪除文件兩個刪除方法
// 2.1 直接刪除
//System.out.println("刪除結(jié)果:"+file.delete());
// 2.2 使用jvm退出時刪除
// file.deleteOnExit();
// Thread.sleep(5000);
// 3. 獲取文件信息
System.out.println("獲取文件絕對路徑"+file.getAbsolutePath());
System.out.println("獲取文件相對路徑"+file.getPath());
System.out.println("獲取文件名稱"+file.getName());
System.out.println("獲取文件父目錄"+file.getParent());
System.out.println("獲取文件的長度"+file.length());
System.out.println("獲取文件的創(chuàng)建時間"+new Date(file.lastModified()).toLocaleString());
// 4. 判斷
System.out.println("是否是文件:"+file.isFile());
System.out.println("是否可寫:"+file.canWrite());
System.out.println("是否隱藏:"+file.isHidden());
}
}
運行結(jié)果
打印路徑分割符:;
名稱分割符:\
獲取文件絕對路徑D:\file.txt
獲取文件相對路徑D:\file.txt
獲取文件名稱file.txt
獲取文件父目錄D:\
獲取文件的長度27
獲取文件的創(chuàng)建時間2022-7-7 16:31:48
是否是文件:true
是否可寫:true
是否隱藏:false
3.2 文件夾操作代碼演示:
package stream.demo04;
import java.io.File;
import java.io.FileFilter;
import java.util.Date;
//文件夾操作
public class DirOpeTest {
public static void main(String[] args) throws InterruptedException {
dirTest();
}
public static void dirTest() throws InterruptedException {
// 1. 創(chuàng)建文件夾
File dir = new File("D:\\aa\\bb\\cc");
if(!dir.exists()){
//dir.mkdir(); // 只能創(chuàng)建單級目錄
System.out.println("創(chuàng)建文件夾結(jié)果"+dir.mkdirs());// 創(chuàng)建多級目錄
}
// 2. 刪除文件夾
// 2.1 直接刪除
//dir.delete();// 只能刪除最底層空目錄
// 2.2 使用jvm刪除
// dir.deleteOnExit();
//Thread.sleep(5000);
// 3. 獲取文件夾信息
System.out.println("獲取文件夾絕對路徑:"+dir.getAbsolutePath());
System.out.println("獲取文件夾路徑:"+dir.getPath());
System.out.println("獲取父目錄:"+dir.getParent());
System.out.println("獲取最后一次調(diào)整時間:"+new Date(dir.lastModified()).toLocaleString());
System.out.println("獲取文件夾名稱:"+dir.getName());
// 4. 判斷
System.out.println("判斷文件夾是否存在:"+dir.exists());
System.out.println("是否隱藏:"+dir.isHidden());
// 5. 遍歷文件夾 使用list()
File dir2 = new File("D:\\aa");
String[] list = dir2.list();
System.out.println("=======================");
for (String s : list) {
System.out.println(s);
}
System.out.println("------------FileFilter的使用-------------------");
//使用listFiles() 遍歷文件夾
File[] files = dir2.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.getName().endsWith("jpg")){
return true;
}
return false;
}
});
for (File file : files) {
System.out.println(file.getName());
}
}
}
運行結(jié)果
獲取文件夾絕對路徑:D:\aa\bb\cc
獲取文件夾路徑:D:\aa\bb\cc
獲取父目錄:D:\aa\bb
獲取最后一次調(diào)整時間:2022-7-12 20:39:30
獲取文件夾名稱:cc
判斷文件夾是否存在:true
是否隱藏:false
=======================
13-1F113092322-50.jpg
13-1F1130Z915.jpg
bb
------------FileFilter的使用-------------------
13-1F113092322-50.jpg
13-1F1130Z915.jpg
3.3 文件夾遍歷操作代碼演示:
package stream.demo04;
import java.io.File;
//文件夾遍歷操作
public class ListdirDemo {
public static void main(String[] args) {
listDir(new File("D:\\aa"));
deleteDir(new File("D:\\aa"));
}
//遞歸遍歷文件夾所有文件
public static void listDir(File dir){
File[] files = dir.listFiles();//獲取文件夾中所有文件
System.out.println(dir.getAbsolutePath());
if(files!=null&&files.length>0){
for (File file : files) {//遍歷files 文件夾中所有內(nèi)容
if (file.isDirectory()){//若該內(nèi)容是一個文件夾,則遞歸調(diào)用listDIr()方法,進入該文件夾然后重復判斷文件夾是否還有文件夾
listDir(file);
}else {
System.out.println(file.getAbsolutePath()//直到遞歸內(nèi)容不是文件夾為止,打印當前文件內(nèi)容的絕對路徑
);
}
}
}
}
//遞歸 刪除文件夾及所有文件
public static void deleteDir(File dir){
File[] files = dir.listFiles();
if(files!=null&&files.length>0){
for (File file : files) {
if (file.isDirectory()){//files中有子文件夾和文件,判斷當前內(nèi)容是否是文件,是文件遞歸調(diào)用方法,進入子文件夾
deleteDir(file);//遞歸
}else {
//刪除文件
System.out.println(file.getAbsolutePath()+"刪除文件:"+file.delete());
}
}
}
System.out.println(dir.getAbsolutePath()+"刪除:"+dir.delete());//當該文件夾中內(nèi)容刪除完畢時,刪除文件夾
}
}
運行結(jié)果
D:\aa
D:\aa\13-1F113092322-50.jpg
D:\aa\13-1F1130Z915.jpg
D:\aa\bb
D:\aa\bb\cc
D:\aa\bb\fjogan.jfif
D:\aa\bb\girl_cloth1.jpg
D:\aa\bb\girl_cloth2.jpg
D:\aa\bb\i1636011671_2947_0.jpg
D:\aa\bb\idCard1.png
D:\aa\bb\increment.meta
D:\aa\13-1F113092322-50.jpg刪除文件:true
D:\aa\13-1F1130Z915.jpg刪除文件:true
D:\aa\bb\cc刪除:true
D:\aa\bb\fjogan.jfif刪除文件:true
D:\aa\bb\girl_cloth1.jpg刪除文件:true
D:\aa\bb\girl_cloth2.jpg刪除文件:true
D:\aa\bb\i1636011671_2947_0.jpg刪除文件:true
D:\aa\bb\idCard1.png刪除文件:true
D:\aa\bb\increment.meta刪除文件:true
D:\aa\bb刪除:true
D:\aa刪除:true
————————————————————————————————————————————————————————————————————————————
更多參考
千峰教育-IO框架
原文鏈接:https://blog.csdn.net/qq_60501861/article/details/125751606
相關(guān)推薦
- 2022-05-25 Windows系統(tǒng)修改Jenkins端口號_win服務(wù)器
- 2022-05-24 Python?6種基本變量操作技巧總結(jié)_python
- 2022-03-23 圖形學之Unity渲染管線流程分析_C#教程
- 2022-10-16 安裝出現(xiàn):Requirement?already?satisfied解決辦法_python
- 2022-03-03 【問題】remote: Support for password authentication wa
- 2023-02-26 go?defer?return?panic?執(zhí)行順序示例詳解_Golang
- 2024-07-15 SpringBoot使用itext導出pdf(含圖片和表格)
- 2023-03-04 c++元編程模板函數(shù)重載匹配規(guī)則示例詳解_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支