android基礎學習-java篇day10-step3-第六節:java輸入輸出流

發條魚發表於2018-09-13

主要內容

  • File類的使用
  • 位元組流
  • 字元流
  • 物件的序列化和反序列化

輸出流:

將資料寫入到輸出裝置當中

輸入流 :

從輸入裝置當中讀取資料,將資料讀取到程式當中

 File類

什麼是檔案?

檔案可認為是相關記錄或放在一起的資料的集合

在java中,使用java,io.File類對檔案進行操作。

File相關方法:

建立目錄、建立檔案的簡單使用

package com.demo.day10.file;

import java.io.File;
import java.io.IOException;

public class FileDemo {

	public static void main(String[] args) {
		// 建立File物件
		//File file=new File("/Users/mac/Documents/java/demo/aa.txt");
		//File file=new File("/Users/mac/Documents/java","demo/aa.txt");
		File file=new File("/Users/mac/Documents/java");
		File file1=new File(file,"demo/aa.txt");
		//判斷是檔案還是目錄
		System.out.println("是否是目錄"+file1.isDirectory());
		System.out.println("是否是檔案"+file1.isFile());
		//建立目錄
		//File file2=new File("/Users/mac/Documents/java","demo2");
		File file2=new File("/Users/mac/Documents/java","demo3/demo3_3");
		if(!file2.exists()) {//判斷demo2是否存在
			//file2.mkdir();//建立demo2目錄
			file2.mkdirs();//建立多級目錄, demo3/demo3_3
		}
		//建立檔案
		File file3=new File("/Users/mac/Documents/java","demo2/bb.txt");
		if(!file3.exists()) {
			try {
				file3.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}

位元組流

  • 位元組輸入流InputStream

  • 位元組輸出流OutpunStream

 FileInputStream

  • 從系統中的某個檔案中獲得輸入字元

  • 用於讀取諸如影象資料之類的原始位元組流

常用方法:

方法名 描述
public int read() 從輸入流中讀取一個資料位元組
public int read(byte[] b) 從輸入流中將最大b.length個位元組的資料讀入一個byte陣列中
public int read(byte[] b,int off,int len) 從輸入流中將最大len個位元組的資料讀入byte陣列中
public void close() 關閉此檔案輸入流並釋放與此流有關的額所以系統資源

如果返回值為-1.則表示已經到達檔案的末尾。

常用方法使用案例:

package com.demo.day10.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/*
 * aa.txt
 * 裡面的內容是 Hello,World!
 */

public class FileInputStreamDemo {

	public static void main(String[] args) {
		// 建立一個FileInputStream的物件
		try {
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");//絕對路徑
//			int n=fis.read();//讀取aa.txt檔案的一個位元組的資料
//			System.out.println((char)n);//輸出H
			int n;
			//迴圈讀取檔案的資料
			while((n=fis.read())!=-1) {//當讀取返回值是-1說明是到末尾了
				System.out.print((char)n);//輸出H
			}
			fis.close();//關閉輸入流
			System.out.println("\n=====下面是read(b,off,len)的使用====");
			FileInputStream fis2=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");//絕對路徑
			byte[] b=new byte[100];
			//fis2.read(b);
			fis2.read(b, 0, 5);//偏移量,從第0個開始讀,長度為5
			System.out.println(new String (b));//將位元組陣列轉字串物件輸出
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

輸出結果:

Hello,World!
=====下面是read(b,off,len)的使用====
Hello

 FileOutputStream

檔案輸出流

常用方法:

方法名 描述
public int write() 從輸入流中讀取一個資料位元組
public int write(byte[] b) 從輸入流中將最大b.length個位元組的資料讀入一個byte陣列中
public int write(byte[] b,int off,int len) 從輸入流中將最大len個位元組的資料讀入byte陣列中
public void close() 關閉此檔案輸入流並釋放與此流有關的額所以系統資源

字元的新增、圖片拷貝簡單實現:

package com.demo.day10.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo {

	public static void main(String[] args) {
		//建立一個FileOutputStream物件
		try {
			//檔案輸出流
			FileOutputStream fos=new FileOutputStream("/Users/mac/Documents/java/demo/aa.txt");
			//檔案輸入流
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");
			//照片拷貝
			//檔案輸出流
			FileOutputStream fos1=new FileOutputStream("/Users/mac/Documents/java/demo/pigcopy.jpg");
			//檔案輸入流
			FileInputStream fis1=new FileInputStream("/Users/mac/Documents/java/demo/pig.jpg");
			
			
			try {
				//文字讀寫
				fos.write(50);
				fos.write('a');
				int n;
				while((n=fis.read())!=-1) {
					System.out.print((char)n);
				}
//				System.out.println(fis.read());
//				System.out.println((char)fis.read());
				fos.close();
				fis.close();
				//圖片拷貝 是個讀寫過程
				byte[] b=new byte[1024];
				int n1;
				while((n1=fis1.read(b))!=-1)//從11.jpg中讀取資料放到陣列b中
				{
					fos1.write(b,0,n1);
				}
				fos1.close();
				fis1.close();
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

}

位元組緩衝流

  • 緩衝輸入流BufferedInputStream
  • 緩衝輸出流BufferedOuputStream

為什麼要用緩衝流

  • 檔案讀寫,從硬碟中讀取資料,讀寫速度較慢
  • 緩衝流是從記憶體中讀取資料 ,可以提供讀寫速度。
  • 與檔案輸入輸出流進行結合使用
  • 其過程就是:在檔案讀寫的基礎上再嫁接一個緩衝流,執行緩衝讀寫後,資料會放到一個指定大小的緩衝區內。如果緩衝區滿了,則自動寫到文件裡面顯示;如果沒滿,要呼叫flush()方法:重新整理釋放緩衝區的資源。

 

package com.demo.day10.file;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedDemo {

	public static void main(String[] args) {
		try {
			// 建立FilesInputStream的物件 輸入流
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");
			// 建立FilesOutputStream的物件 輸出流
			FileOutputStream fos=new FileOutputStream("/Users/mac/Documents/java/demo/aa.txt");
			// 建立BufferedInputStream的物件 輸入流
			BufferedInputStream bis=new BufferedInputStream(fis);
			// 建立BufferedInputStream的物件 輸出流
			BufferedOutputStream bos=new BufferedOutputStream(fos);
			
			
		
			try {
				//輸出流寫操作 //寫入資料到目標
				bos.write('a');
				bos.write(50);
				bos.flush();//重新整理釋放緩衝區資源,如果緩衝器沒滿則釋放
				bos.close();
				long startTime=System.currentTimeMillis();//獲取系統時間
				//輸入流讀操作:從輸入裝置中讀取資料
				System.out.println((char)bis.read());
				System.out.println(bis.read());
				bis.close();
				long endTime=System.currentTimeMillis();
				System.out.println(endTime-startTime);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			

			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

輸出:

a
50
1

字元位元組轉換流

用於處理位元組流和字元流直接的轉換

  • InputStreamReader
  • OutputStreamReader

字元流緩衝區

  • BufferReader
  • BufferWriter
package com.demo.day10.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class InputStreamReaderDemp {

	public static void main(String[] args) {
		// 建立一個FileInputStream的物件
		try {
		    //位元組輸入流
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/abc.txt");
			InputStreamReader isr=new InputStreamReader(fis);
			BufferedReader br=new BufferedReader(isr);//字元讀緩衝輸入流
			
			FileOutputStream fos=new FileOutputStream("/Users/mac/Documents/java/demo/abc_copy.txt");
			OutputStreamWriter osr=new OutputStreamWriter(fos);
			BufferedWriter bw=new BufferedWriter(osr);//字元讀緩衝輸出流
			char[] b=new char[10];
			int n=0;
//			while((n=isr.read(b))!=-1) {
//				System.out.print((char)n);
//			}
			//方法二
//			while((n=isr.read(b))!=-1) {
//				String s=new String(b,0,n);
//				System.out.print(s);
//			}
			//寫入到新的檔案當中
			while((n=isr.read(b))!=-1) {
				osr.write(b,0,n);
				osr.flush();
			}
			fis.close();
			fos.close();
			isr.close();
			osr.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 物件序列化與反序列化

  • 序列化:把java物件轉換為位元組序列的過程
  • 反序列化:吧位元組序列恢復為java物件的過程
  • 物件輸入流ObjectInputStream

    物件輸出流ObjectOut'putStream

 步驟:

  1. -建立一個類,繼承Serializable介面
  2. -建立物件
  3. -將物件寫入檔案
  4. -從檔案讀取物件資訊 

Goods.java 

package com.demo.day10.file;

import java.io.Serializable;

/*
 * 分析商品資訊類
 * 屬性:
 * -商品編號:id
 * -商品名稱:name
 * -商品價格:price
 * 方法:
 * -構造方法
 * -獲取和設定屬性值的方法
 * -其他方法
 */
public class Goods implements Serializable{
	private String goodsId;
	private String goodsName;
	private double goodsPrice;
	public Goods(String goodsId,String goodsName,double goodsPrice) {
		this.setGoodsId(goodsId);
		this.setGoodsName(goodsName);
		this.setGoodsPrice(goodsPrice);
		
	}

	

	public String getGoodsId() {
		return goodsId;
	}



	public void setGoodsId(String goodsId) {
		this.goodsId = goodsId;
	}



	public String getGoodsName() {
		return goodsName;
	}



	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}



	public double getGoodsPrice() {
		return goodsPrice;
	}



	public void setGoodsPrice(double goodsPrice) {
		this.goodsPrice = goodsPrice;
	}

   //toString方法
	public String toString() {
	   String str="商品編號:"+goodsId+" "+"商品名稱:"+goodsName+" "+"商品價格:"+goodsPrice;
		
	   return str;
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

GoodTest.java 

package com.demo.day10.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class GoodsTest {

	public static void main(String[] args) {
		Goods goods1=new Goods("s001","電腦",3000);
		try {
			//建立一個goods.txt檔案
			File file= new File("/Users/mac/Documents/java/demo/goods.txt");
			if(!file.exists()) {//如果goods.txt不存在
				try {
					file.createNewFile();//建立這個檔案
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		// 建立一個字元輸出流物件寫入資料
		FileOutputStream fos=new FileOutputStream(file);
		// 建立一個字元輸入流物件讀取資料
		FileInputStream fis=new FileInputStream(file);
		try {
			ObjectOutputStream oos=new  ObjectOutputStream(fos);
			ObjectInputStream ois=new  ObjectInputStream(fis);
			oos.writeObject(goods1);
			Goods goods2=(Goods)ois.readObject();
			System.out.println(goods2);
			oos.flush();
			oos.close();
			ois.close();
			fis.close();
			fos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

 

相關文章