IO流
IO流按流向分爲輸入流和輸出流
按數據的類型分爲字節流和字符流
字節流:
字節輸入流:InputStream:讀取字節
字節輸出流:OutputStream :寫字節
字符流:
字符輸入流:Reader:讀字符
字符輸出流:Writer:寫字符
開發步驟:
1)創建字節輸出流對象
2)寫數據
3)關閉資源
例如:
package com.westos.IO;
import java.io.FileOutputStream;
import java.io.IOException;
public class IoDome {
public static void main(String[] args) throws IOException {
//創建輸出流對象
FileOutputStream out=new FileOutputStream("f:\\adc.txt");
//寫數據
out.write("Uzi".getBytes());
//關閉資源
out.close();
}
}
關於字節輸出流寫數據的方法
public void write(int b):一次寫一個字節
public void write(byte[] b) :一次寫一個字節數組
public void write(byte[] b, int off,int len):一次寫一部分字節數組
package com.westos.IO;
import java.io.FileOutputStream;
import java.io.IOException;
public class IoDome2 {
public static void main(String[] args) throws IOException {
//創建輸出流對象
FileOutputStream file=new FileOutputStream("f:\\LoL.txt");
//創建字符數組
byte[] bys= {97,98,99,100,101};
//一次寫一個數組
// file.write(bys);
//一次寫一部分字節數組
file.write(bys,0,3);
//關閉資源
file.close();
}
}
問題:
寫一些數據,這些數據並沒有換行,如何實現換行的效果...
針對不同的操作系統,裏面的換行符合不一樣的
windows: \r\n
Linx:\n
mac:\r
問題:如何末尾追加數據呢
public FileOutputStream(File file, boolean append):指定爲true,末尾追加數據
例如:
package com.westos.IO;
import java.io.FileOutputStream;
import java.io.IOException;
public class IoDome3 {
public static void main(String[] args) throws IOException {
//創建字節輸出流對象
FileOutputStream file=new FileOutputStream("f:\\lol.txt",true);
for(int x=0;x<5;x++) {
//寫資源
file.write(("baby"+x).getBytes());
//寫入換行符號
file.write(("\r\n").getBytes());
}
//關閉資源
file.close();
}
}
當IO流中加入異常處理的三種方式:
例如:
package com.westos.IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author 傑哥
*當Io流中加入異常處理怎麼做?
*
*/
public class IoDome4 {
public static void main(String[] args) {
//創建字節文件輸出流對象
FileOutputStream file=null;
//方式1:分別進行異常處理
try {
file=new FileOutputStream("adc.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//寫數據
try {
file.write("Uzi".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//關閉資源
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
//方式2:一起處理(沒有釋放資源,不好)
try {
FileOutputStream file2=new FileOutputStream("ad.txt");
file2.write("Mlxg".getBytes());
file2.close();
} catch (IOException e) {
e.printStackTrace();
}
//方式3:try--catch--finally:將輸出流對象寫在異常外面這種方法經常使用
FileOutputStream file3=null;
try {
file3 =new FileOutputStream("a.txt");
file3.write("Mlxg".getBytes());
file3.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
//釋放資源前進行非空判斷
if(file3!=null) {
try {
file3.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
上面我們學習了寫文件,現在讓我們看看讀文件
需求:去讀取當前項目下的txt文本這個文件內容,將文件的內容輸出在控制檯上
InputStream抽象類:字節輸入流
FileInputStream
構造方法:
public FileInputStream(String name)
開發步驟:
1)創建字節文件輸入流對象
2)讀數據
3)釋放資源
讀數據方式:
public abstract int read():一次讀取一個字節
public int read(byte[] b):一次讀取一個字節數組 (讀取實際的字節數)
例如:
package com.westos.IO;
import java.io.FileInputStream;
import java.io.IOException;
/*讀數據方式:
public abstract int read():一次讀取一個字節
public int read(byte[] b):一次讀取一個字節數組 (讀取實際的字節數)
*/
public class IoDome5 {
public static void main(String[] args) throws IOException {
//創建輸入流對象
FileInputStream file=new FileInputStream("f:\\LoL.txt");
int num = 0;
//讀取數據
//當文本中的文件爲空時就會在控制檯輸出-1,所以我們需要判斷
while((num=file.read())!=-1) {
System.out.println((char)num);
}
//關閉資源
file.close();
//一次讀取一個字節數組
//創建輸入流對象
FileInputStream file2=new FileInputStream("f:\\LoL.txt");
byte[] bys=new byte[1024];
int num=0;
while((num=file2.read(bys))!=-1) {
System.out.println(new String(bys,0,num));
}
//關閉資源
file.close();
}
}
文件的copy:
思路:
就是將文件a的內容複製到文件b中
先創建有一個源文件(就是文件a)
在創建一個目的地文件(就是文件b)
在判斷文件不是null的情況下,每讀一個文件就去寫一個文件
最後關閉資源
例如:
package com.westos.Copy;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyDome {
public static void main(String[] args) throws IOException {
//創建源文件對象
FileInputStream fis=new FileInputStream("f:\\a.txt");
//創建要複製的文件對象
FileOutputStream fos=new FileOutputStream("f:\\b.txt");
int by=0;
while((by=fis.read())!=-1) {
//上面讀取一個文件寫一個文件
fos.write(by);
}
//關閉資源
fis.close();
fos.close();
}
}
使用字節數組去copy圖片
package com.westos.Copy;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyDome2 {
/**
* @param args
* 使用字節數組的方式去copy
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//創建源文件和目的地文件
FileInputStream fis=new FileInputStream("f:\\a.jpg");
FileOutputStream fos=new FileOutputStream("f:\\b.jpg");
//創建字節數組
byte[] bys=new byte[1024];
int len=0;
while((len=fis.read())!=-1) {
fos.write(bys,0,len);
}
fis.close();
fos.close();
}
}
遞歸方法
遞歸與嵌套得分開不能混淆:
例如:
嵌套:
Math類中:max方法:
Math.max(3,Math.max(20,30));
遞歸:
Public void show(int n){
if(n<o){
System.out.println(0);
}
System.out.println(n);
Show(n--);
}
構造方法是不存在遞歸的:
方法遞歸的三個必要條件:
1)方法遞歸必須有出條件
2)必須滿足一些規律
3)一定要寫方法
例如:
package com.westos.Copy;
import java.util.Scanner;
public class diguiDome {
/**
* @param args
* 用遞歸方法來算階乘算法
*/
public static void main(String[] args) {
//鍵盤錄入一個數據
Scanner sc=new Scanner(System.in);
System.out.println("請輸入一個數...");
int num=sc.nextInt();
System.out.println(num+"的階乘是"+jiecheng(num));
}
private static int jiecheng(int num) {
if(num==1) {
return 1;
}else {
return num*jiecheng(num-1);
}
}
}
運行結果:
請輸入一個數...
5
5的階乘是120