一、IO流
1.1 IO流的概述
IO流是對裝置之間傳輸資料的抽象,java通過IO流對資料進行各種各樣的操作,而對資料進行操作的"對象"都在IO包裡。
1.2 IO流的分類
a.按照資料流向
輸入流 | 讀入資料 |
---|---|
輸出流 | 寫出資料 |
b.按照資料類型
位元組流 | Java中的位元組流處理的最基本機關為單個位元組 |
---|---|
字元流 | Java中的字元流處理的最基本的單元是字元 |
1.3 IO流基類概述和FileOutputStream的構造方法
- 位元組流的抽象基類:
- InputStream
- OutputStream
- 字元流的抽象基類:
- Reader
- Writer
注:由這四個類派生出來的子類的名稱是使用該四個類類名作為字尾。
1.4 OutputStream基類的常用字類
- FileOutputStream
- OutputStream
- ByteArrayOutputStream
二.FileOutputStream類
2.1 FileOutputStream類的構造方法
-
FileOutputStream(File file)
建立一個指向----File類對象表示的檔案----的寫入資料的輸出流
-
FileOutputStream(String name)
建立一個----字元串表示的檔案----的寫入資料的輸出流
注意事項:
i: 建立位元組輸出流對象了做了幾件事情?(如a.txt)
- 調用系統資源建立a.txt對象
- 建立fos對象
- 将fos對象指向這個檔案
ii:調用close()方法的作用
- 通知系統釋放關于a.txt的資源
- 讓IO流對象變成垃圾,等待垃圾回收器對其回收。
2.2 FileOutputStream的三個write()方法
-
public void write(int b)
将指定位元組寫入此檔案輸出流
- public void write(byte[] b)
将位元組數組寫入此檔案輸出流
- public void write(byte[] b,int off,int len)
将位元組數組的一部分寫入此檔案輸出流
注意:檔案的編碼格式一定要一緻,否則會出現亂碼的情況。
2.3 FileOutputStream寫出資料實作換行和追加寫入
- 換行
windows | \r\n |
---|---|
Linux | \n |
Mac | \r |
-
資料的追加寫入
FileOutputStream(File file, boolen append)
傳入的第二個參數為true即可
2.4 FileOutputStream寫出資料加入異常處理
注意:檔案輸入流是否打開,如果未打開,就不用進行關閉,否則會出錯。
public class File_class {
public static void main(String[] args) {
FileOutputStream f = null;
try {
f = new FileOutputStream("a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
f.write(new byte[]{'q', 'w', 'e', 'r'});
} catch (IOException e) {
e.printStackTrace();
} finally {
{
if(f!=null) {
try {
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
三.FileInputStream類
3.1 FileStream類讀取資料
- 一次讀取一個位元組
//讀取内容需要将int類型的位元組強制轉換成char類型進行輸出。
public class read1 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("a");
int len = 0;
while((len = in.read()) != -1) {
System.out.print((char)len);
}
in.close();
}
}
- 一次讀取一個位元組數組
注意:String導包出錯也會出錯。
public class read1 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("a");
int len = 0;
byte[] bytes = new byte[1024];
while((len = in.read(bytes)) != -1) {
System.out.println(new String(bytes));
}
in.close();
}
}
四.BufferedOutputStream高效輸出流
4.1 緩沖區
-
概念
指記憶體中預留的指定大小(size)的存儲空間(對I/O流的資料作臨時存儲)。
-
作用
1.減少實際實體讀寫次數
2.緩沖區在建立時就被配置設定記憶體,這塊記憶體區域一直被重用,可以減少動态配置設定和回收記憶體的次數。
4.2 BufferedOutputStream構造方法
-
BufferedOutputStream(OutputStream out)
建立一個新的緩沖輸出流,以将資料寫入新的底層輸出流。
-
BufferedOutputStream(OutputStream out, int size)
建立一個新的緩沖輸出流,以将具有定緩沖區大小的資料寫入到底層輸出流。
5.案例
5.1将指定目錄下的以".txt"結尾的檔案的名字輸出到螢幕上
注:用接口FilenameFilter完成
基本思想:
1.獲得檔案清單
2.便利檔案清單,是檔案,判斷是不是符合要求的檔案。
3.是檔案夾,進入第一步,進行遞歸
public class FIlefind {
public static void main(String[] args) {
File file = new File("C:\\Drcom");
find(file);
}
private static void find(File file) {
File[] f = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File newFile = new File(dir, name);
if (newFile.isFile() && name.endsWith(".txt")) {
return true;
} else if (newFile.isDirectory()) {
find(newFile); //遞歸開始
return false;
} else
return false;
}
});
for(File file2 : f) {
System.out.println(file2.getName());
}
}
}
-
解析
FileNameFilter接口的access()方法在本程式中的作用是判斷FIle類對象是不是檔案,并且是不是以".txt"為字尾的檔案,如果是,将符合要求的檔案放入到File[] f這個FIle對象數組裡,調用本身方法那裡是遞歸開始,如果File對象是檔案夾,将該對象作為參數,傳入到find()方法裡,再獲得該檔案夾裡面的資源清單再進行判斷是不是檔案或者檔案夾…遞歸到最裡層,符合的檔案名輸出,退一層,輸出,直到回到遞歸入口。
-
注意事項:
在遞歸入口下面要reuturn false,因為方法是boolean類型傳回值,不然會出錯,記住隻有符合條件的檔案對象那個return true就會好了解多。
5.2 計算指定路徑的檔案及檔案夾數
public static void findTex(File file) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile() && f.getName().endsWith(".txt")) {
System.out.println(f.getName());
}
if (f.isDirectory()) {
findTex(f);
}
}
}
}
5.3 複制檔案夾,包括複制檔案
//單個複制檔案
public class file_copy {
public static int count = 1;
public static int amount = 0;
public static void file_Copy(String src, String des) throws IOException {
FileInputStream inputStream = new FileInputStream(src);
FileOutputStream outputStream = new FileOutputStream(des);
byte[] array = new byte[1024];
int len = 0;
while ((len = inputStream.read(array)) != -1) {
outputStream.write(array);
}
inputStream.close();
outputStream.close();
}
//對目錄的複制,對剛開始是檔案不适用
public static void directory_Copy(String src, String des) throws IOException {
File file_src = new File(src);
File file_des = new File(des);
//是檔案,複制
if(file_src.isFile()){
file_Copy(src, des);
System.out.println("操作了第" + count++ + "個檔案");
}
if(file_src.isDirectory()){
if(!file_des.exists()) {
file_des.mkdir();
System.out.println("操作了第" + count++ + "個檔案");
}
File[] files = file_src.listFiles();
for(File f : files){
//更新新位址,更新目标位址
String src_new = f.getAbsolutePath();
String des_new = des + src_new.substring(src.length());
directory_Copy(src_new,des_new);
}
}
}
參考:http://www.cnblogs.com/absfree/p/5415092.html
https://blog.csdn.net/u012635648/article/details/73467226