遞迴和I/O流
阿新 • • 發佈:2019-02-05
遞迴
遞迴:是一種方法內部呼叫方法本身的程式設計技巧。
計算5! = 5*4*3*2*1。
5! = 4! * 5
4! = 3! * 4
3! = 2! * 3
2! = 1! * 2
1! = 1;
public static void main(String[] args){
m(5);// 120
}
public static int m(int n){
if(n == 1){// 遞迴:要給一個結束點(出口)
return 1;
}
return n*m(n-1);// 遞迴呼叫
列出某指定資料夾下的所有檔案
public static void main(String[] args) {
File file = new File("F:/abc/");
m(file);
}
// 用於列出某指定資料夾下的所有檔案
public static void m(File dir){
File[] fileArr = dir.listFiles();
for(File f : fileArr){
if(f.isDirectory()){
m(f);// 如果是資料夾,遞迴呼叫方法本身
}else {
System.out.println(f);
}
}
}
I/O流
1、為什麼要使用IO流?
持久化:將記憶體中的資料儲存在硬碟上的過程。IO流、JDBC、Hibernate2、以程式作為參照物,則分為:
InputStream輸入流:由檔案到程式(抽象類)
OutputStream輸出流:由程式到檔案(抽象類)
檔案輸入輸出流:FileInputStream FileOutputStream3、流的特點:
流只能順序的操作
流都是成對出現的(方向不同)注:
1、FileInputStream如果沒有檔案則報異常,而FileOutputStream會自動新建檔案
2、FileInputStream讀取到檔案末尾,得到-1的值,可以作為讀取結束的標誌。I/O流的分類:
- 以方向來說:輸入流和輸出流
- 以包裝設計模式來說:基本流和包裝流
- 能處理位元組還是字元:位元組流和字元流
- 所有的以InputStream和OutputStream結尾的都是位元組流
- 所有的以Reader和Writer結尾的都是字元流。
- InputStreamReader:連線位元組流和字元流的橋樑,稱之為轉換流
- OutputStreamWriter:連線位元組流和字元流的橋樑,稱之為轉換流
-
- 什麼時候使用位元組流,什麼時候使用字元流?
- 1、關於檔案本身的操作(拷貝、下載、上傳等),使用位元組流。
- 2、關於文字檔案內容的操作,使用字元流
- BufferedReader/BufferedWriter(功能欠缺)
- PrintWriter和BufferedReader配對使用
// 讀取指定檔案的內容(F:/abc/a.txt)
File file = new File("F:/abc/a.txt");
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
int n1 = fis.read();// 一次讀取一個位元組
System.out.println((char)n1);
int n2 = fis.read();
System.out.println((char)n2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} finally{// 肯定會執行的程式碼 一般用於關閉資源或處理臨時檔案
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
覆蓋式寫入資料
File file = new File("E:/abc/");
FileOutputStream fos = null;
try {
// append:是否以追加的形式寫內容到檔案,預設是false,為覆蓋模式
fos = new FileOutputStream(file, true);// 追加模式
fos.write(97);
fos.write(100);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
拷貝檔案
public static void main(String[] args) {
File fileSrc = new File("F:/abc/a.txt");
File fileDest = new File("F:/abc/b.txt");
copyFile(fileSrc,fileDest);// 複製檔案
}
/**
* 完成fileSrc到fileDest的拷貝工作
* @param fileSrc 原始檔的路徑
* @param fileDest 目標檔案的路徑
*/
public static void copyFile(String fileSrc,String fileDest){
copyFile(new File(fileSrc),new File(fileDest));
}
/**
* 完成fileSrc到fileDest的拷貝工作
* @param fileSrc 原始檔
* @param fileDest 目標檔案
*/
public static void copyFile(File fileSrc,File fileDest){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(fileSrc);
fos = new FileOutputStream(fileDest);
byte[] byArr = new byte[1024*8];// 空間換時間
int b=0;
// b:實際讀到的位元組數
while ((b=fis.read(byArr)) != (-1)) {
fos.write(byArr,0,b);// 一次寫入byArr長度
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
if(fos != null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
I/O流包裝類BufferedReader的使用
public static void main(String[] args) {
File file = new File("F:/abc/a.txt");
System.out.println(getText(file));
}
public static String getText(File file){
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
StringBuilder builder = null;
try {
fis = new FileInputStream(file);
// 設定編碼格式
isr = new InputStreamReader(fis,"utf-8");
// I/O包裝類,功能增強,一次讀一行
br = new BufferedReader(isr);
String str = null;
builder = new StringBuilder();
// 一次讀一行
while((str=br.readLine()) != null){
builder.append(str);
builder.append("\r\n");// 換行
}
} catch (IOException e){
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return builder.toString();
}
I/O流包裝類PrintWriter的使用
File file = new File("F:/abc/a.txt");
PrintWriter pw = null;
try {
// true:追加模式
FileOutputStream fos = new FileOutputStream(file,true);
// utf-8:設定編碼格式
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8:設定編碼格式");
pw = new PrintWriter(osw);// 例項化PrintWriter
pw.println("abc");// 寫入字串資料,自帶換行
pw.print("def");
pw.print("mon");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}finally{
pw.close();
}