3.文件和流

3.文件和流

標籤(空格分隔): 6.2Java高級


一 文件

  1. 簡介

image_1d59cbs20i0l1pr31m6bbqfs059.png-272.5kB

  1. 創建 + 屬性和方法

(1)實例化對象創建

//實例化的時候必須指定文件或文件夾(指定的文件夾是否存在不重要)
	File file=new File("D:/book");

image_1d59ce6lg1qou1hs61plg1f7h16rj13.png-129.2kB

(2)屬性和方法
image_1d59cft4c38re0c19pgj3o7vs1g.png-100.9kB

  • 創建指定的文件夾
    image_1d59cidl52fhm7n1hmtfut5dc1t.png-27.6kB
  • 其他方法操作代碼
    image_1d59cjbs517h33ivkikn0c1qud2a.png-28.8kB

二 遞歸

  1. 特徵: 自己調用自己

  2. 寫一個方法 來實現階乘

    • 5!=1x2x3x4x5=120
      image_1d59cqhqa132t1g18c1f6e1epq2n.png-42.7kB
  3. 相關練習:

  • 顯示D:\文件\Java\0219-1 中的所有文件(文件內可能還會有文件)
  • 篩選出這些文件中的".Java"文件

步驟:
1.判斷是文件還是文件夾,顯示出所有文件目錄(包括內部每個文件夾的的文件,使用遞歸)
2.判斷後綴是否是.Java
image_1d59cur7rnc0bqa19s4ph7q634.png-75.7kB

image_1d59de6s91ukqjol1vfn1ih8ld3h.png-17.4kB


三 內置類和匿名類 (只做瞭解,不爲重點)

image_1d59dhbf0ik8flhqke1t5g19qu3u.png-76.2kB


四 IO流

1. 流的簡介

image_1d59dkai8vol12d9vskrrn14hq4b.png-147.1kB

image_1d59dnbin199i1h38i4f1gv81u0k4o.png-243.2kB

2.輸入流的方法和框架

  • 輸入流
    image_1d59dq0191l3t14etlba7gqq8p55.png-62.8kB
    image_1d59dtrg04b129e12kc1kldg705i.png-219.5kB
  • 寫流的框架
    try/catch/finally

2-1. IO流1_單個讀取值

    //構建文件輸入流
    FileInputStream fis = null;
	try {
		fis = new FileInputStream(new File("文件目錄+文件名"));
		int ch1 = fis.read();  //讀取到了第1個字母 以char類型的asc碼返回爲int類型
		System.out.println((char)ch1);
		int ch2 = fis.read();  //讀取第2個字母
		System.out.println((char)ch2);
		int ch3 = fis.read();  //讀取第3個字母
		System.out.println((char)ch3);
		int ch4 = fis.read();  //讀取第4個字母
		System.out.println((char)ch4);
		
		int ch5 = fis.read();  //讀取第5個字母  當沒有這個字母(讀取完畢了) 返回-1
		System.out.println(ch5);
		
	}catch(Exception e) {
		e.printStackTrace();
	}finally {
		//記得要關閉流
		if(fis!=null) {
			try {
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

image_1d59eg012121r65vcdfr51mui6s.png-91.7kB

2-2. IO流2_讀取多個值

   //搭建框架try/catch(報錯信息)/finally(關流)
	FileInputStream fis=null;//方便全局調用
	try{			
		//實例化輸入流對象
		fis=new FileInputStream("D:/JavaCode/123.txt");//file重新賦值
		//讀取文件內容
		//創建循環條件
		int count=0;
		while((count=fis.read())!=-1){//返回的數字數-1代表未找到
			System.out.println((char)count);
		}						
	}catch(Exception e){
		//拋報錯信息
		e.printStackTrace();
	}finally{
		//關流--try/catch
		if(fis!=null){
			try {
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

image_1d59f0ajv1ivh5r1ajl10n716178j.png-73.7kB

2-3. IO流3_批量讀取值

    FileInputStream fis=null;
	try{
		//創造入流實例化對象
		fis=new FileInputStream("D:/JavaCode/123.txt");//有參
		
		//批量讀取
		byte[] buff=new byte[1024];//創建緩存的實例化對象(相當於緩存機)
		//注意byte[]基本數據類型,Byte[]裝箱成爲一個對象
		int c=0;
		while((c=fis.read(buff))!=-1){
			System.out.println(new String(buff));
		}
		
	}catch (Exception e) {
		e.printStackTrace();
	}finally {
		//關流
		//判斷非空,fis如果爲空會跳過try塊中的代碼,報錯--空指針異常
		if(fis!=null){
			try {
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

image_1d59epq9a1d82r7d1jd21hcjjts86.png-78.3kB


3. 輸出流

  • 輸出流-OutputStream
    image_1d59ducsminq3397tu1obr1l025v.png-134.8kB
    image_1d59dv1ge12751s7ur9rkt71eee6c.png-147.6kB
    image_1d59faimfer88fr14l01igo1l8j90.png-94.9kB

3-1. 字節輸出流

image_1d59fnqjn1dha1jsh23b68k11qmb1.png-51.5kB

3-2. 實現文件的複製功能

image_1d59ff0v01r4o19eo1milf16u359q.png-22.3kB

    FileInputStream fis=null;
	FileOutputStream fos=null;
	try{
		//實例化對象
		fis=new FileInputStream("D:/文件/Java/0219-1/One.java");//實例化需要複製的原文件(包含目錄)
		fos=new FileOutputStream("C:/Users/Administrator/Desktop/One.java");             //實例化存放地址的複製文件
		
		//批量寫入
		byte[] buff=new byte[1024];//創造一個緩存機

		int c=0;
		while((c=fis.read(buff))!=-1){
			//c爲返回的阿斯克碼,批量讀取的時候返回值不用太關心,但要知道它返回的是 讀取內容的最後位置,偏移會使用到
			fos.write(buff,0,c);//寫入   將buff中的內容寫入fos中(字節空間未佔滿1024使用偏移,最後的位置就是)
		}						
		fos.flush();//強制將緩衝區的文件放到輸入流中
	}catch (Exception e) {
		e.printStackTrace();
	}finally {
		//關流
		try {
			if(fis!=null){
				fis.close();
			}
			if(fos!=null){
				fos.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

image_1d59fgnjm1hsb3ulgjb5m3b0ga7.png-103.1kB
image_1d59flhl01ihb1vip7ia11e519r9ak.png-34kB

3-3. 字符輸出流–讀/寫中文字符

image_1d59fttea1cfd145g1go1e1r1hrebe.png-33.5kB

	FileReader fr=null;
	FileWriter fw=null;
	try{
		//實例化對象
		fr=new FileReader("D:/文件/222.txt ");//實例化需要複製的原文件(包含目錄)
		fw=new FileWriter("C:/Users/Administrator/Desktop/222.txt ");//實例化存放地址的複製文件
		
		//批量寫入
		char[] buff=new char[1024];//創造一個緩存機(注意此處是char數組)			
		int c=0;
		while((c=fr.read(buff))!=-1){
			//控制檯輸出
			System.out.println(new String(buff));
			fw.write(buff,0,c);//寫入 
		}
		fw.flush();//強制將緩衝區的文件放到輸入流中
	}catch (Exception e) {
		e.printStackTrace();
	}finally {
		//關流
		try {
			if(fr!=null){
				fr.close();
			}
			if(fw!=null){
				fw.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}		

image_1d59gfi5gpntshj81vd3s1h4kdf.png-77.8kB
image_1d59gjj7h1l279s91ba5n45159uds.png-49.3kB

3-4 BufferedReader–緩衝字符流

  • 緩衝字符流是對字符流的再次的封裝
    * 作用: 提高字符流寫入文本的效率
    image_1d59g5iis1q9qml2ve5i031pf3cl.png-196.2kB
    image_1d59g71i31m072hv8nfns3b2kd2.png-294.5kB

(1) 代碼1: BufferedReader輸出流

    BufferedReader br = null;
	FileReader fr = null;
	try {
		fr = new FileReader("d:/hello.txt");   //字符流
		br = new BufferedReader(fr);   //字符緩衝流
		//String line1 = br.readLine();   //一次讀取一行
		//String line2 = br.readLine();
		//System.out.println(line1);
		//System.out.println(line2);  //null
		String line = "";
		while((line=br.readLine())!=null) {
			System.out.println(line);
		}	
	}catch(Exception e) {
		e.printStackTrace();
	}finally{
		// 關閉流的順序和創建相反
		try {
			if(br!=null) {
				br.close();
			}
			if(fr!=null) {
				fr.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

image_1d59hemf81dpe16cmd6pdbu1h8re9.png-50.1kB
image_1d59hgavcmr315bp1bsf1u7u1putem.png-25.8kB

(2) 輸入流+輸出流

    BufferedReader br=null;
	BufferedWriter bw=null;
	FileReader fr=null;
	FileWriter fw=null;
	try {
		//實例化br對象
		fr=new FileReader("D:/文件/Three");
		br=new BufferedReader(fr);//BufferedReader的參數類型是字節流
		
		fw=new FileWriter("C:/Users/Administrator/Desktop/Three");
		bw=new BufferedWriter(fw);
		
		//讀取並寫入
		String line="";//readLine() 返回的是字符串類型
		while((line=br.readLine())!=null){
			//讀取
			System.out.println(line);
			//寫入
			bw.write(line);//寫入,發現未換行
			bw.newLine();//換行				
		}
		bw.flush();
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		//關流有一定的順序,fr-br-fw-bw
		try {
			if(fr!=null){
				fr.close();
			}br.close();
			if(br!=null){
				br.close();
			}
			if(fw!=null){
				fw.close();
			}	
			if(bw!=null){
				bw.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

image_1d59hmpdj1cc51si31ogde5a4ptge.png-71.9kB
image_1d59hpi1t45ppg10ppfucle1gr.png-50.3kB


五 對象流

  • image_1d59hv82hrjg9jt1lgn16751kdph8.png-36.4kB
  • 對象流創建
    FileInputStream fis = null;//文件輸入流
    ObjectInputStream ois = null;//對象輸入流
    fis=new FileInputStream(“D:/文件/Three.bin”);
    ois=new ObjectInputStream(fis);//實例化對象輸入流

1. 對象流讀取

	FileInputStream fis = null;//文件輸入流
	ObjectInputStream ois = null;//對象輸入流
	try {
		fis=new FileInputStream("D:/文件/Three.bin");
		ois=new ObjectInputStream(fis);//實例化對象輸入流
		
		//讀取
		int readInt = ois.readInt();
		String readUTF = ois.readUTF();
		Object readObject = ois.readObject();
		System.out.println(readInt+"\t"+readUTF+"\t"+readObject);
		
	}catch (Exception e) {
		e.printStackTrace();
	}finally{
		try {
			if(fis != null){
				fis.close();
			}
			if(ois != null){
				ois.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}	

image_1d59i6h6tmv518b6losgjf1vd8i2.png-67.2kB
image_1d59i59541bcveaqs3g1vv6fhfhl.png-10.9kB

2. 對象流寫入

對象輸出流–ObjectOutputStream
就是將 內存中的對象 變爲2進制的文件進行保存 下次可以讀取出來

	ObjectOutputStream oos = null;
	FileOutputStream fos = null;
	try {
		fos = new FileOutputStream("D:/文件/Three.bin");//創建輸出流
		oos = new ObjectOutputStream(fos);
		
		oos.writeInt(12);
		oos.writeUTF("helloworld");  //寫入字符串
		oos.writeObject(new Student("jack",20));
		
		oos.flush();
	}catch(Exception e) {
		e.printStackTrace();
	}finally {
		try {
			if(oos!=null) {
				oos.close();
			}
			if(fos!=null) {
				fos.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

image_1d59ia3n31jttsflbjd1o1f10b5iv.png-68.4kB

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