文件操作:
文件操作其實就是一個FIle類;我們學習文件操作就是學習File類中的方法;
文件基操:
第一部分:學習文件的基本操作(先扒源碼以及文檔)
Constructor | Description |
---|---|
File(File parent, String child) |
給定要操作的問價的父路徑和子文件名稱 |
File(String pathname) |
給定一個要操作文件的完整路徑 |
Modifier and Type | Method | Description |
---|---|---|
boolean | public boolean createNewFile() throws IOException | 創建文件 |
boolean |
delete() |
刪除文件 |
boolean |
exists() |
判斷給定路徑是否存在 |
來個實例:
import java.io.File;
import java.io.IOException;
public class FIleDelCre {
public static void main(String[] args) throws IOException {
File file = new File("e:\\IOFileSource\\xbhog.txt");
if(file.exists()){
file.delete();
}else{
System.out.println(file.createNewFile());
}
}
}
createNewFile
:如果指定的文件不存在且已成功創建,則為True;如果指定的文件已經存在,則為False
知識點(敲黑板):
路徑分隔符:解決不同操作系統下的路徑符號問題(windows->“\”;Linux->“/”);
File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"xbhog.txt");
注:
/**
* The system-dependent default name-separator character, represented as a
* string for convenience. This string contains a single character, namely
* {@link #separatorChar}.
*/
public static final String separator = "" + separatorChar;
對父路徑操作的方法:
import java.io.File;
import java.io.IOException;
public class FIleDelCre {
public static void main(String[] args) throws IOException {
File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"test"+File.separator+"demo"+File.separator+"xbhog.txt");
if(!file.getParentFile().exists()){ //如果該文件的父目錄不存在
/*
file.getParentFile().mkdirs(); //進行創建多級父目錄
mkdirs底層進行遞歸調用,實現多級目錄創建
file.getParentFile().mkdir(); //進行創建一個父目錄
*/
}
if(file.exists()){
file.delete();
}else{
System.out.println(file.createNewFile());
}
}
}
注:mkdirs與mkdir的區別,最好進入源碼中查看
文件列表顯示:
流程圖:
import java.io.File;
public class FilePwd {
public static void main(String[] args) {
File file = new File("D:" + File.separator);
listDir(file);
}
public static void listDir(File file){
if(file.isDirectory()){
File[] Dirs = file.listFiles();
while(Dirs != null){
for (int i = 0; i < Dirs.length; i++) {
listDir(Dirs[i]); //遞歸調用
}
}
}
System.out.println(file);
}
}
文件批量更名:
情景:
在數據采集的過程中由於操作失誤,使得xbhog-log文件夾下的所有文件后綴采用了.java
,為了修正這一錯誤,要求使得該目錄下的所有文件后綴統一替換成.txt
,同時也需要考慮多級目錄下的文件更名操作。
import java.io.File;
public class FIleChangeName {
public static void main(String[] args) {
File file = new File("D:" + File.separator + "xbhog-log");
renameDir(file);
}
public static void renameDir(File file){
if(file.isDirectory()){
File[] dirs = file.listFiles();
for (int i = 0; i < dirs.length; i++) {
renameDir(dirs[i]); //遞歸調用
}
}else {
if (file.isFile()){ //判斷是否為文件
String fileName = null; //文件名稱
if(file.getName().endsWith(".java")){ //判斷是否以.java為結尾
fileName = file.getName().substring(0,file.getName().lastIndexOf("."))+".txt";
File newfile = new File(file.getParentFile(), fileName); //新的文件名稱
file.renameTo(newfile); //重命名
}
}
}
}
}
字節流與字符流:
字節流:outputStream
以及inputStream
字符流:Writer
以及Reader
對資源操作的基本步驟:(文件為例)--嚴格按照下面步驟
- 如果要操作的資源是文件的話,首先需要通過File類對象找到一個要操作的文件路徑
- 通過字節流或者字符流的子類為字節流或字符流的對象實例化(向上轉型)
- 執行讀寫操作
- 關閉資源
OutputStream字節輸入流
常用的類普通方法:
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
關閉此輸出流並釋放與此流關聯的任何系統資源。 |
void |
flush() |
刷新此輸出流並強制寫入任何已緩沖的輸出字節。 |
void |
write(byte[] b) |
輸出單個字節數據 |
void |
write(byte[] b, int off, int len) |
輸出部分字節數據 |
abstract void |
write(int b) |
輸出一組字節數據 |
對文件的操作需要其OutputStream下的子類FileOutputStream來實現對象的實例化;
其常用的構造方法是:
Constructor | Description |
---|---|
FileOutputStream(File file) |
創建一個文件輸出流,以寫入由指定file對象表示的文件。 |
FileOutputStream(File file, boolean append) |
創建一個文件輸出流,以寫入由指定file對象表示的文件。如果第二個參數為真,則字節將被寫到文件的末尾而不是開頭 |
實例:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class FIleOutputStearm {
public static void main(String[] args) throws IOException {
File file = new File("xbhog.txt");
if(!file.exists()){
file.createNewFile();
}
OutputStream outputStearm = new FileOutputStream(file);
String str = "歡迎來到xbhog的博客";
outputStearm.write(str.getBytes(StandardCharsets.UTF_8));
outputStearm.close();
}
}
文件內容的追加:
OutputStream stream = new FileOutputStream(file, true);
String addStr = "-----這是追加的內容------";
stream.write(addStr.getBytes());
stream.close();
InputStream字節輸入流:
該類的常用方法:
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
關閉輸出流 |
abstract int |
read() |
讀取單個字節數據,如果現在已經讀取到底了,返回-1 |
int |
read(byte[] b) |
讀取一組字節數據,返回的是讀取的個數,如果沒有數據已經讀取到底則返回-1 |
int |
read(byte[] b, int off, int len) |
讀取一組字節數據(只占數組的部分) |
byte[] |
readAllBytes() |
讀取輸入流全部字節數據,JDK 1.9后新增 |
long |
transferTo(OutputStream out) |
輸入流轉存到輸出流,JDK 1.9之后新增 |
對文件的操作需要其InputStream下的子類FileInputStream來實現對象的實例化;
讀取文件的固定用法:
- 創建文件輸入流---
InputStream input = new FileInputStream(file)
- 設置數據的讀取緩存區----
new byte[1024]
- 讀取數據,將數據讀取到緩存區中並放回讀取的字節個數 ----
int len = input.read(data)
- 字節轉換為字符流----
new String(data,0,len)
- 關閉資源
讀取文件內容實例:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
File file = new File("xbhog.txt"); // 輸出文件路徑
if (file.exists()) { // 文件存在
InputStream input = new FileInputStream(file);// 文件輸入流
byte data[] = new byte[1024]; // 數據讀取緩沖區
// 讀取數據,將數據讀取到緩沖區之中,同時返回讀取的字節個數
int len = input.read(data);
System.out.println("【" + new String(data, 0, len) + "】");// 字節轉為字符串
input.close(); // 關閉輸入流
}
}
}
讀取文件中的全部內容:
byte[] bytes = input.readAllBytes();
System.out.println(new String(bytes));
Writer字符流:
為了簡化輸出的操作,提供了Writer與Reader字符流;
該類的常用方法:
Modifier and Type | Method | Description |
---|---|---|
Writer |
append(char c) |
將指定的字符寫入。 |
Writer |
append(CharSequence csq) |
將指定的字符序列附加到此編寫器。 |
Writer |
append(CharSequence csq, int start, int end) |
將指定字符序列的子序列追加到此編寫器 |
abstract void |
close() |
關閉資源 |
abstract void |
flush() |
刷新資源流 |
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) |
寫入一個字符串的一部分 |
在進行文件流的寫入時,需要引入Writer下的FileWriter子類;
類的項目結構:
- java.lang.Object
- java.io.Writer
- java.io.OutputStreamWriter
- java.io.FileWriter
FileWriter常用構造方法:
Constructor | Description |
---|---|
FileWriter(File file) |
給定File對象,構造一個FileWriter對象。 |
FileWriter(String fileName, boolean append) |
構造一個給定文件名的FileWriter對象,該文件名帶有一個布爾值,該布爾值表示是否追加寫入的數據。 |
實例:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter.txt"); // 輸出文件路徑
if(!file.exists()){
file.createNewFile();
}
Writer out = new FileWriter(file) ; // 實例化Writer類對象
out.write("歡迎來到xbhog"); // 輸出字符串
out.write("\n");
out.append("Test\n");
out.append("www.cblog.cn/xbhog") ;// 追加輸出內容
out.close();// 關閉輸出流
}
}
Reader字符輸入流:
該類常用的方法:
Modifier and Type | Method | Description |
---|---|---|
abstract void |
close() |
關閉資源 |
int |
read() |
讀取單個字符 |
int |
read(char[] cbuf) |
將字符放入數組 |
long |
skip(long n) |
跳過字符(幾個) |
boolean |
ready() |
判斷這個流是否已准備好了讀取了 |
實例測試:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter.txt");// 輸出文件路徑
if (file.exists()) {// 文件存在
Reader in = new FileReader(file); // 實例化輸入流
char data[] = new char[1024]; // 緩沖區
//“歡迎沒有了”
in.skip(2);// 跨過2個字符長度
int len = in.read(data); // 讀取數據
System.out.println(new String(data, 0, len));
in.close();// 關閉輸入流
}
}
}
轉換流:
轉換流 | OutputStreamWriter | InputStreamReader |
---|---|---|
繼承結構 | public class OutputStreamWriterextends Writer {} | public class InputStreamReaderextends Reader |
構造方法 | public OutputStreamWriter(OutputStream out) | public InputStreamReader(InputStream in) |
實現兩者的轉換操作:
將字節輸入流轉換成字符輸入流
import java.io.*;
public class ConversionOperations {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter1.txt"); // 輸出文件路徑
OutputStream output = new FileOutputStream(file) ;// 字節流
Writer out = new OutputStreamWriter(output) ; // 字節流轉字符流
out.write("測試兩者之間的轉換"); // 字符流輸出
out.close(); // 關閉輸出流
output.close(); // 關閉輸出流
}
}