1. 程式人生 > >java之IO流(二)

java之IO流(二)

IO:在裝置和裝置之間的一種資料傳輸!
  IO流的分類:
  按流的方向分:
  輸入流: 讀取檔案   (e:\\a.txt):從硬碟上檔案讀取出來後輸出這個檔案的內容
 輸出流: 寫檔案:將e:\\a.txt 內容讀出來--->寫到f盤下
 按資料的型別劃分:
  位元組流
  位元組輸入流:InputStream:讀取位元組
  位元組輸出流:OutputStream:寫位元組
  字元流
  字元輸入流:Reader:讀字元
 字元輸出流:Writer:寫字元
  需求:在當專案下輸出一個檔案,fos.txt檔案(文字檔案)
         只要文字檔案,優先採用字元流,字元流在位元組流之後出現的
        使用位元組流進行操作
  無法建立位元組輸出流物件:OutputSteam :抽象類,不能例項化
 又學習過File類,並且當前是對檔案進行操作,子類:FileOutputSteam進行例項化
 
  File+InputStream
 File+OutputStream
 FileXXX  (FileReader)
 FileXXX  (FileWriter)
 
  開發步驟:
 1)建立位元組輸出流物件
  2)寫資料

 3)關閉資源

舉例:

public class FileOutputStreamDemo1 {
public static void main(String[] args) throws Exception{
//OutputStream out =new FileOutputStream("fos.txt");//	多型
//建立位元組輸出流
	//1)構造了輸出流物件
	//2)指向了當前目錄下輸出fos.txt
	FileOutputStream f=new FileOutputStream("fos.txt");	
//寫資料
	//1)將檔案和和流物件不建立關係了
	//2)及時釋放掉流物件所佔用的空間
	f.write("hello".getBytes());
	f.close();
	//f.write("java".getBytes());
}
}

註釋:OutputStream位元組輸出流不能建立物件,可以通過多型對子類進行例項化

關於位元組輸出流寫資料的方法
  public void write(int b):一次寫一個位元組
   public void write(byte[] b) :一次寫一個位元組陣列

   public void write(byte[] b, int off,int len):一次寫一部分位元組陣列

舉例:

public class FileOutputStreamDemo2 {
public static void main(String[] args) throws IOException {
	//構造一個位元組輸出流物件
	FileOutputStream f=new FileOutputStream("f2.txt");
	//寫資料
	f.write(97);
	f.write(126);
	f.write(127);
	byte[] b= {97,98,99,100};
	f.write(b);
	f.write(b, 0, 3);
	f.close();
}
}
需求:輸出文字檔案,給文字檔案中新增一些資料
  問題:
 寫一些資料,這些資料並沒有換行,如何實現換行的效果...
針對不同的作業系統,裡面的換行符合不一樣的
  windows: \r\n
  Linx:\n
 mac:\r
  一些高階記事本針對任意的換行會有換行的效果
  問題:如何末尾追加資料呢
  public FileOutputStream(File file, boolean append):指定為true,末尾追加資料
 舉例:
public class FileOutputStreamDemo3 {
public static void main(String[] args) throws IOException {
	FileOutputStream f=new FileOutputStream("fox3.txt",true);
	//寫資料
	for(int i=0;i<10;i++) {
		f.write(("hello"+i).getBytes());
		f.write(("\r\n").getBytes());
	}
	f.close();
}
}
需求:去讀取當前專案下的fis.txt這個檔案內容,將檔案的內容輸出在控制檯上
 InputStream抽象類:位元組輸入流
 FileInputStream
 構造方法:
 public FileInputStream(String name)
  開發步驟:
  1)建立位元組檔案輸入流物件
  2)讀資料
  3)釋放資源
  
  讀資料方式:
  public abstract int read():一次讀取一個位元組

  public int read(byte[] b):一次讀取一個位元組陣列 (讀取實際的位元組數)

舉例:

public class FileInputStreamDemo1 {
	public static void main(String[] args) throws IOException {
		FileInputStream f = new FileInputStream("fos.txt");
		// 開始讀取:第一次讀取
		// int b=f.read();
		// System.out.println(b);
		// System.out.println((char)(b));
		// b=f.read();
		// System.out.println(b);
		// System.out.println((char)b);
		// 重複讀太高,需要while迴圈
		int b = f.read();
		while (b != -1) {
			System.out.println((char) b);
			b = f.read();
		}
	}
}

public int read(byte[] b):一次讀取一個位元組陣列 (讀取實際的位元組數) 

舉例:

public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
	FileInputStream f=new FileInputStream("fos.txt");
	//第一次讀取
//	byte[] b=new byte[5];
//	int n = f.read(b);
//	System.out.println(n);
//	System.out.println(new String(b));
//	n=f.read(b);
//	System.out.println(n);
//	System.out.println(new String(b));
	//程式碼重複度高
	byte[] b=new byte[1024];
    int len=0;
	while((len=f.read(b))!=-1) {
		System.out.println(new String(b,0,len));
	}
}
}
複製文字檔案。
將當前專案下的a.txt檔案的內容讀取出來,複製到b.txt檔案中
 原始檔:a.txt--->  讀取檔案的內容---->FileInputStream
 目的地檔案:b.txt---->輸出檔案--->FileOutputStream
 本身讀寫操作:

 讀取一個位元組,寫一個位元組,針對不會出現中文亂碼的問題..

舉例:

public class CopyDemo1 {
//封裝目的檔案和原始檔
public static void main(String[] args) throws IOException {
	FileInputStream f=new FileInputStream("fos.txt");
    FileOutputStream fos=new FileOutputStream("b.txt");
    //邊讀邊寫
    int by=0;
    while((by=f.read())!=-1) {
    	fos.write(by);
    }
    System.out.println("---------");
    f.close();
    fos.close();
}
}

註釋:複製圖片時會出現亂碼現象,如果出現亂碼,就用位元組流來進行操作