IO流、文件的copy以及遞歸方法的理解

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 showint n{

ifn<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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章