內容
1.文件簡介
2.File類使用
3.IO流
一.文件簡介
1.文件是什么東西
文件:可以是目錄(平常理解的文件夾),也可以是具體的文件(文本、圖片、音頻、視頻等等)
2.文件的操作
1.創建文件
2.判斷文件是否存在
3.寫入相應的數據
(注意:File沒有具體的讀取和寫入的方法,數據的讀取和寫入通過IO流操作)
4.刪除
3.目錄的操作
1.創建目錄(文件夾)
2.判斷目錄是否存在
3.對目錄進行相應操作(往目錄中copy文件等)
4.刪除目錄
二.File類使用
1.注意點
①File創建出的對象,可以指向指定的一個文件。這個被指向的文件可以存在,也可以不存在。當該文件不存在時,new File(“文件路徑”)不會創建這個文件
②File有專門創建文件和目錄的方法。分別是createNewFile()和mkdir()
③可理解為:File是 文件和目錄 路徑名的抽象表示形式
2.File使用示例(針對文件)
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
//1.讓file對象指向指定的一個文件(有可能存在,也有可能不存在)
File file = new File("C:\\Users\\劉金豪\\Desktop\\temp");
//new File并不會創建這個文件
//2.判斷文件是否存在
if(!file.exists()) {
//3.創建文件(這段程序在此之前不會真正創建一個文件)
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.File使用示例(針對目錄)
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
File file = new File("C:\\Users\\劉金豪\\Desktop","newFile");
if(file.exists()) {
return;
}
try {
//創建目錄
file.mkdir();
}catch(NullPointerException e) {
e.printStackTrace();
}
}
}
4.刪除文件
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
//1.得到這個文件
File parent = new File("C:\\\\Users\\\\劉金豪\\\\Desktop");
File file = new File(parent,"file");
if(file.exists()) {
file.delete();
}
}
}
5.File中的常用方法
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
//1.得到這個文件
File file = new File("C:\\Users\\劉金豪\\Desktop\\newFile");
//2.判斷是文件還是目錄
if(file.isDirectory()) {
System.out.println("是目錄");
}
if(file.isFile()) {
System.out.println("是文件");
}
//3.1查看當前目錄的所有內容(列出來所有文件的名稱)
String[] fileNameList = file.list();
for(String name:fileNameList) {
System.out.println(name);
}
//3.2文件過濾
String[] fileNameListAccept = file.list(new FilenameFilter() {
@Override
public boolean accept(File arg0, String arg1) {
//返回true,即滿足條件,當前文件就會被過濾出來
//如果返回false,則不滿足條件,就不會被過濾出來
//arg0是文件夾的路徑,arg1是文件的名稱
File f = new File(arg0,arg1);
if(f.isFile()) {
return true;
}
return false;
}
});
for(String name:fileNameListAccept) {
System.out.println(name);
}
//3.3得到file中的文件,并且輸出絕對路徑(與3.2有相通之處)
File[] files = file.listFiles();
for(File f:files) {
System.out.println(f.getAbsolutePath());
}
}
}
輸出結果
文件1
文件2
文件1
文件2
C:\Users\劉金豪\Desktop\newFile\文件1
C:\Users\劉金豪\Desktop\newFile\文件2
三.IO流
1.IO流簡介
輸入流和輸出流不是絕對的,而是相對于內存來說的,再準確一點來說就是相對于內存中正在運行的程序來說的,更精確一點就是相對于正在運行的進程來說的。
輸出:內存 -> 外部(硬盤/網絡/打印機等外部設備)
輸入:外部(硬盤/網絡/打印機等外部設備) ->內存
2.舉例
比如我們常用的復制粘貼,假如把桌面的東西再復制到桌面上,那么會經過:硬盤(也就是這里的桌面)上的目標文件通過輸入流到內存,再通過輸出流到硬盤(也就是這里的桌面)
3.數據的儲存方式(字節和字符)
有兩種:
1.以字節形式存儲 比如:圖片、視頻、音頻、exe(二進制,點開看不懂)
2.以字符形式存儲 比如:文本(點開能看懂)
這兩種數據存儲形式不一樣,那么讀取的方式就不同。如果是二進制文件,那么就需要用字節流讀取。如果是文本,那就可以用字符流讀取。
4.字節流和字符流
①字節輸入輸出流是InputStream 和 OutputStream。這兩個都是抽象類
字符輸入輸出流是 Reader 輸出是Writer。這兩個也是抽象類
②具體實現類:
字節流的輸入流FileInputStream 輸出流FileOutputStream
字符流輸入流 FileReader輸出流FileWriter
③注意:當使用IO流時,不需要的資源一般需要自己手動釋放(關閉文件)
5.流的形象理解
可以把流當作水流的通路,創建流就是擰開水龍頭,這個時候水就可以從源頭順著水管流到需要的地方(這里的水就類似Java中的數據,水流的通道即水管就是Java中的流)到時候水流夠了之后就需要關閉水龍頭(也就是關閉流)
向文件中寫入文本
6.字符輸出流使用示例(其余與此類似)
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
//1.準備需要寫入的數據
String text = "hello";//這個已經在內存中存在了
//2.決定是選擇字符流還是字節流(是相當于輸出)
FileWriter fw = null;
try {
//是把內存中的文本內容寫到磁盤中,所以選擇字符輸出流
fw = new FileWriter("C:\\Users\\劉金豪\\Desktop\\temp");
//開始寫入數據
fw.write(text);
} catch (IOException e) {
e.printStackTrace();
}finally {
//3.關閉流
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意:凡是實現了closeable接口的類都可以在try(){
}的()里面創建對象
好處:當try代碼塊執行完畢或者有異常的時候,系統會自動關閉對應的對象
7.1使用字節輸入輸出流完成圖片復制粘貼(一次性讀取一個字節)
知識點:
①在des里面也要寫上圖片的名稱。如果復制的不是圖片,也需遵守此規則。
②read()不加參數就是一次讀取一個字節,當然也可以加參數,后面代碼會有介紹。當讀取完畢時,返回-1。
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
//1.保存圖片地址和拷貝到的地址
String src = "C:\\Users\\劉金豪\\Desktop\\mmexport1566548991556.jpg";
String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意這里,要再寫一個jpg
try (//2.將圖片讀取到內存中(輸入流),因為是圖片,所以是字節流
FileInputStream fis = new FileInputStream(src);
//3.將內存中的圖片寫到磁盤中(字節輸出流)
FileOutputStream fos = new FileOutputStream(des);
){
//每次獲取的一個字節
int b = 0;
while(true) {
//4.從輸入流里面獲取數據,寫入到輸出流
b = fis.read();//read不加參數是一個字節一個字節讀取
//一個字節一個字節地寫入內存
//讀完了就返回-1
//判斷是否讀取完畢
if(b == -1) {
break;
}
//5.一個字節一個字節地讀出去
fos.write(b);
}
} catch (Exception e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
7.2一次性讀取多個字節
知識點:read的參數一般是數組,如果加了參數,就直接把數據讀入這個參數里面了。
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
String src = "C:\\Users\\劉金豪\\Desktop\\mmexport1566548991556.jpg";
String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意這里,要再寫一個jpg
try (FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(des);
){
//字節數組,用于保存一次性讀取的多個數據
byte[] buffer = new byte[1024];//通常定義1024個字節
int len = 0;
while(true) {
//4.從輸入流里面獲取數據,寫入到輸出流
len = fis.read(buffer);
//判斷是否讀取完畢
if(len == -1) {
break;
}
//5.一個字節一個字節地讀出去
fos.write(buffer);//數據讀入buffer里面了
}
} catch (Exception e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
8.1使用字符流完成文本復制粘貼
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
String src = "C:\\Users\\劉金豪\\Desktop\\temp";
String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\temp";
try(FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(des);){
while(true) {
int ch = fr.read();
if(ch == -1) {
break;
}
fw.write(ch);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
8.2一次性讀取多個字符(和字節流的基本一樣)
import java.io.*;
import java.util.*;
public class 測試程序 {
public static void main(String[] args){
String src = "C:\\Users\\劉金豪\\Desktop\\temp";
String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\temp";
try(FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(des);){
char[] buffer = new char[1024];
while(true) {
int len = fr.read(buffer);
if(len == -1) {
break;
}
fw.write(buffer);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
總結
相比第一次學文件和IO流,這一次非常清晰。捋順了它們之間的關系,總之收獲頗豐。