Java必须了解的“递归”与“IO流”!!!
>>>First:
遞歸!
1. 定義: 在函數自身內部,調用函數本身的方式,稱為遞歸。
2. 注意: 遞歸包括遞進去、歸出來兩步。
首先,依次執行【函數調自身語句】上半部分的代碼,直到最里層;{?遞進去?}
?然后,再從最里層開始,依次執行【函數調自身語句】下半部分的代碼。{?歸出來?}
3. 下面用示意圖來分析一下:
!!!遞歸必須通過合適的語句,及時的跳出,否則容易造成死循環。
4. 用一個例子幫助你理解遞歸的用法:
用遞歸實現一個數的階乘
首先,定義一個jiecheng類:
方法一:
方法二:?
其次,在main方法中輸出:
運行驗證:以5的階乘為例輸出結果
以上便是關于遞歸的基礎知識,So easy,看到這想必就已經學會了!再來看一下今天下一個主角:
?
>>>Second:
IO流
1、I/O流分類:
根據流的方向:輸入流和輸出流
根據讀取文字的大小:字節流和字符流
(字節流按字節讀取,讀取中文時容易亂碼;字符流按照字符讀取,通常用于讀取中文)
根據讀取的方式:節點流和緩存流
2、讀取文件內容:(3種方法 ↓↓↓)
FileInputStream fis = new FileInputStream("F:/test.txt");
StringBuffer sb = new StringBuffer();
① 按照字節,一個一個字節讀取文件
?
② 將byte數組直接聲明為輸入流的長度,一次性讀出所有文字
?
③ 一次性讀取1024個字節
?
?
3、寫入新文件:
// FileOutputStream fos = new FileOutputStream("F:/out.txt",true);
如果第二個參數省略,或傳入false,則表示每次寫入時將原文件清空,從文件頭部開始寫入;
如果第二個參數傳入true,則表示不清空原文件,在文件末尾處添加新內容。
FileOutputStream fos = new FileOutputStream("F:/out.txt");
首先,讀取文件內容(見上),然后寫入:↓↓↓
?
?
4、捕獲異常
(有關異常的內容還有很多,在這就先不詳解了)
讀寫文件時,易出現異常,故,需要在讀寫過程中進行異常處理,例如捕獲異常
try{
FileInputStream fis = new FileInputStream("F:/test.txt");
FileOutputStream fos = new FileOutputStream("F:/out.txt");
StringBuffer sb = new StringBuffer();
// 讀取文件
int n = -1;
while((n=fis.read()) != -1){
sb.append((char)n);
}
System.out.println(sb);
sb.reverse();
fos.write(sb.toString().getBytes());
System.out.println(sb);
} catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
5、BufferedInputStream / BufferedOutputStream
① 作用:在基本流的基礎上進行包裝,讀取或者寫入文件時,將通過緩存進行。
即,先將內容寫入到緩存區,緩存區滿以后,再進行讀取或者寫入操作。
可以大大減少文件的操作次數,提高寫入效率。
② 緩存流的使用
在基本流的基礎之上,進行包裝:
new BufferedInputStream(new FileInputStream("F:/test.txt"));
這種寫法。我們稱之為IO鏈,IO關閉時,只需要關閉最外層流,內層流將自動關閉。
③ BufferedOutputStream在關閉前,通常調用bos.flush();
表示關閉前將緩存進行刷新,將緩存區剩余未滿的內容寫入文件。
但是,一般.close()方法,自帶刷新功能。
④ 代碼示例:
?
6、DateInputStream / DateOutputStream
采用二進制對文件進行讀寫操作。
與基本流相比,可以直接讀寫java中的基本數據類型。
另外,如果操作的文件是一個二進制文件,需要使用DataOutputStream替代FileOutputStream。
同樣,Date系列的流,也有read和write方法,操作與基本相同。
注意:只用DataOutputStream寫入文件為二進制文件,只能使用DataInputStream進行讀取。
String name = "zhangsan";
int age = 12;
double height = 178.5;
String ads = "山東煙臺";
DataOutputStream dos = null;
DataInputStream dis = null;
try {
dos = new DataOutputStream(new FileOutputStream("F:\\zhangsan.txt"));
dos.writeUTF(name); dos.writeInt(age);
dos.writeDouble(height);
dos.writeUTF(ads);
dis = new DataInputStream(new FileInputStream("F:\\zhangsan.txt"));
String uname = dis.readUTF();
int uage = dis.readInt();
double uheight = dis.readDouble();
String uads = dis.readUTF();
System.out.println(uname+"---"+uage+"---"+uheight+"---"+uads);
} catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
} finally{
try {
dis.close();
dos.flush();
dos.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
?
7、ObjectOutputStream / ObjectInputStream
直接繼承自:java.io.OutputStream 抽象類
① 與基本流相同,可以使用read、write方法進行讀寫。
② 與DateInputStream相同,可以對Java基本數據類型進行直接讀寫:readInt() writeDouble()
③ 可以只用readObject()和writeObject() 直接對對象進行操作。
?
【對象的序列化和反序列】
① 對象的序列化:將程序中的對象,持久化的保存在文件中的過程;ObjectOutputStream
② 對象的反序列化:將文件中保存的對象,重新讀取到程序中的過程。ObjectInputStream
?
如果,要將對象進行序列化操作,那么實體類必須實現可序化接口。
class Person implements Serializable{}
③ 注意:當一個實體類,實現可序化接口后,可以添加一個序列化版本號ID。
(實現序列化接口以后,根據警告提示,選擇:Add default serial version ID。)
添加以后,可以用ID表示序列化和反序列化時操作的對象,是同一個對象。
會自動生成一個靜態屬性:
private static final long serialVersionUID = 1L;
如果不添加版本ID,給序列化一個對象后,如果實體類對象有增刪,再進行反序列化時,會造成錯誤。
因為系統認為這已經不是一個類。
+get、set方法,并重寫toString方法。
?
?
?
轉載于:https://www.cnblogs.com/zyp777/p/8906143.html
總結
以上是生活随笔為你收集整理的Java必须了解的“递归”与“IO流”!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redmine添加自定义问题状态
- 下一篇: C语言学习 - 字节对齐