1. 程式人生 > >java --IO流 節點流練習程式碼

java --IO流 節點流練習程式碼

1.拼接路徑

package cn.jbit.lesson.sep;

import java.io.File;

/**
 * IO路徑
 * @author penny
 *
 */
public class PathDemo01 {

	public static void main(String[] args) {

		String path = "D:\\e- java\\T\\622K~~$WS5SR}9S~[E5JS5S.png";
		System.out.println(File.separator);
		
		//建議
		//1./
		path = "D:/e- java/T/622K~~$WS5SR}9S~[E5JS5S.png"
; System.out.println(path); //2.常量拼接 path = "D:"+File.separator+"e- java"+File.separator+"T"+File.separator+"622K~~$WS5SR}9S~[E5JS5S.png"; System.out.println(path); } }

2.構造File物件的方法

package cn.jbit.lesson.sep;

import java.io.File;

/**
 * 構造器
 * @author MacBook
 *
 */
public class FileDemo02
{ public static void main(String[] args) { String path = "D:/e- java/T/622K~~$WS5SR}9S~[E5JS5S.png"; //1.構造File物件, File src = new File(path); System.out.println(src.length()); //2.從父路徑名字串和子路徑名字串建立新的 File例項 src = new File("D:/e- java/T","622K~~$WS5SR}9S~[E5JS5S.png"); System.out.println
(src.length()); //3.從父抽象路徑名和子路徑名字串建立新的 File例項 src=new File(new File("D:/e- java/T"),"622K~~$WS5SR}9S~[E5JS5S.png"); System.out.println(src.length()); } }

3.檔案狀態標準程式碼

package cn.jbit.lesson.sep;

import java.io.File;

/**
 * 檔案狀態標準程式碼
 * @author MacBook
 * 
 * 檔案狀態:
 * 1.不存在:exists
 * 2.存在
 * 		檔案:isFile
 * 		資料夾:isDirectory
 * 	
 *
 */
public class FileStatus {

	public static void main(String[] args) {
		File src=new File("xxx");
		
		if(null==src || !src.exists()) {
			System.out.println("檔案不存在");
		}else {
			if(src.isFile()) {
				System.out.println("檔案操作!");
			}else {
				System.out.println("資料夾操作");
			}
		}

	}

}

4.createNewFile & delete

package cn.jbit.lesson.sep;

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

/**
 * createNewFile 建立檔案
 * 注意:1.不能建立資料夾,只能建立檔案
 * 		2.不存在才建立(返回true)
 * 		3.con是作業系統的裝置名,不能正確的被建立
 * 
 * delete 刪除已經存在的檔案
 * @author MacBook
 *
 */
public class FileDemo03 {

	public static void main(String[] args) throws IOException {
		//建立新的檔案
		File src = new File("D:/e- java/T/io.png");
		boolean flag = src.createNewFile();
		System.out.println(flag);
		
		//並不是資料夾,而是一個沒有後綴的檔案
		src = new File("D:/e- java/T");
		flag = src.createNewFile();
		System.out.println(flag);
		
		//刪除
		flag = src.delete();
		System.out.println(flag);
		
		

	}

}

5.建立目錄

package cn.jbit.lesson.sep;

import java.io.File;

/**
 * 建立目錄
 * 1.mkdir():確保上級目錄存在,不存在建立失敗
 * 2.mkdirs():上級目錄可以不存在,不存在一同建立
 * 推薦使用mkdirs
 * @author MacBook
 *
 */
public class DirDemo01 {

	public static void main(String[] args) {
		File dir = new File("D:/e- java/T/dir/test");
		//建立目錄 mkdirs()
		boolean flag = dir.mkdirs();
		System.out.println(flag);
		
		//mkdir
		dir = new File("D:/e- java/T/dir/test01");
		flag = dir.mkdir();
		System.out.println(flag);

	}

}

6.下一級資訊

package cn.jbit.lesson.sep;

import java.io.File;

/**
 * 列出下一級
 * 1、list():列出下級名稱
 * 2、listFile():列出下級File物件
 * 3、listRoots():列出所有的碟符
 * @author MacBook
 *
 */
public class ListDemo01 {

	public static void main(String[] args) {
		File dir = new File("D:/e- java/T");
		
		//下級名稱
		String[] subNames = dir.list();
		for(String s:subNames) {
			System.out.println(s);
		}
		
		//下級物件 listFile()
		File[] subFiles = dir.listFiles();
		for(File s:subFiles) {
			System.out.println(s);
		}
		
		//碟符
		File[] subRoots = dir.listRoots();
		for(File s:subRoots) {
			System.out.println(s.getAbsolutePath());
		}

	}

}

7.遞迴

(1)列印1-10的數

package cn.jbit.lesson.sep;
/**
 * 遞迴
 * @author MacBook
 *
 */
public class Dirdemo02 {

	public static void main(String[] args) {
		printTen(1);
	}	
		//列印1-10的數
		
	public static void printTen(int num) {
		//1.出口
		if(num>10) { //遞迴頭;結束遞迴
			return;
		}
		
		System.out.println(num);
		printTen(num+1);//自己呼叫自己
	}

	

}

(2)使用遞迴檢視檔案目錄

package cn.jbit.lesson.sep;

import java.io.File;

/**
 * 使用遞迴檢視檔案目錄
 * @author MacBook
 *
 */
public class DirDemo03 {

	public static void main(String[] args) {
		File src = new File("D:/e- java/T");
		printName(src,1);

	}
	
	public static void printName(File src,int deep) {
		/**
		 * 目的是檢視這個檔案所有層的下級的名字
		 * 思路:先判斷是不是存在
		 * 		 存在則判斷是不是目錄
		 * 		 如果是目錄就可以進行遞迴
		 *
		 */
		
		//為了輸出的時候顯示出層次感 ,加入了這樣的程式碼
		for(int i=0;i<deep;i++) {
			System.out.print("*");
		}
		
		
		System.out.println(src.getName());
		
		if(null ==src || !src.exists()) {
			System.out.println("不存在!");
			return;
		}else if(src.isDirectory()){  //判斷是目錄
			for(File s:src.listFiles()) {
				printName(s,deep+1);
			}
			
		}
		
		
	}

}

8.Byte

電腦:位元組
人:字元
從字元->位元組 叫做編碼(encode)
從位元組到字元叫解碼(decode)

unicode 有定長和變長,定長是utf-16,統一2個位元組,比較浪費空間,utf-16又分為utf-16BE(高位元組低地址)和utf-16LE(低位元組低地址);變長是utf-8,英文1個位元組,中文3個位元組。

ANSI: 是中文的WINDOWS系統中的GBK

package cn.jbit.lesson.sep;

import java.io.UnsupportedEncodingException;

/**
 * getBytes
 * @author MacBook
 *
 */
public class ByteDemo01 {

	public static void main(String[] args) throws UnsupportedEncodingException{
		//準備一個字串
		String msg = "性命生命使命";
		//編碼:位元組陣列
		byte[] datas = msg.getBytes();
//		System.out.println(datas.length);//18
//		
//		//編碼其他字符集
//		datas = msg.getBytes("UTF-16LE");
//		System.out.println(datas.length);//12
//		
//		//編碼其他字符集
//		datas = msg.getBytes("GBK");
//		System.out.println(datas.length);//12
//		

		//模擬服務遠端傳一個數組給我,要對其進行還原
		//解碼 :從位元組->字元
		//構造器解碼
		//String(byte[] bytes, int offset, int length, Charset charset) 
		msg = new String(datas,0,datas.length,"utf-8");
		System.out.println(msg);
		
		/*
		 * 解碼出現亂碼,原因如下:
		 * 1)位元組數不夠
		 */
		msg = new String(datas,0,datas.length-2,"utf-8");
		System.out.println(msg);
		
		/*
		 * 2) 字符集不統一
		 */
		msg = new String(datas,0,datas.length,"gbk");
		System.out.println(msg);
		
		//注意:在進行編碼的時候可以進行編制任何模式的位元組碼,但是在解碼的時候必須與原有得格式保持一致,否則回出現亂碼
	}

}

9.位元組流和字元流(輸入流)

在這裡插入圖片描述

(1)第一個程式, 不標準的寫法(便於理解)

package cn.lesson.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 理解操作步驟:
 * 1.建立源 
 * 2.選擇流
 * 3.操作(read \write)
 * 		注意:read讀取資料時,如果資料不存在,則返回-1
 * 4.釋放資源
 * 
 * @author MacBook
 *
 */
public class IoTest01 {
	public static void main(String[] args) {
		//1.建立源
		File src = new File("test.txt");
		
		
			
		
		
		//2.選擇流
		try {
			InputStream is = new FileInputStream(src);
			
			//3.操作流(讀取)
			int temp1 = is.read();
			int temp2 = is.read();
			int temp3 = is.read();
			int temp4 = is.read();
			System.out.println((char)temp1);
			System.out.println((char)temp2);
			System.out.println((char)temp3);
			System.out.println((char)temp4);
			
			//4.釋放資源
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


}

(2)標準的寫法

先修改迴圈,再將釋放流的過程放到finally中去,最後將is的作用域提升上去。

package cn.lesson.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 理解操作步驟,標準:
 * 1.建立源 
 * 2.選擇流
 * 3.操作(read \write)
 * 		注意:read讀取資料時,如果資料不存在,則返回-1
 * 4.釋放資源
 * 
 * @author MacBook
 *
 */
public class IoTest01 {
	public static void main(String[] args) {
		//1.建立源
		File src = new File("test.txt");
		
		//2.選擇流
		InputStream is =null;
		
		
		
		try {
			is = new FileInputStream(src);
			//3.操作流(讀取)
			int temp;
			while((temp=is.read())!=-1) {
				System.out.println((char)temp);
			}
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//4.釋放資源
			try {
				if(is!=null){
					is.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}


}

(3)分段讀取(以下4個程式碼重要)

package cn.lesson.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * 分段讀取
 * @author MacBook
 *
 */
public class IoTest11 {

	public static void main(String[] args) {
		//1.建立源
		File src = new File("test.txt");
		//2.選擇流
		InputStream is = null;
		try {
			is = new FileInputStream(src);
			
			//3.操作(分段讀取)
			byte[] flush = new byte[1024*10*5];//1024表示1K,*10 就是10k,再*5,就是50K,不要將它們算出來,這樣寫好維護
			int len=-1;
		while((len= is.read(flush))!=-1) {
			String str = new String(flush,0,len);//解碼
			System.out.println(str);
		}
		
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//4.釋放資源
			try {
				if(is!=null){
					is.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		

	}

}

10.輸出流

注意:(1)OutPutStream中建立源的時候檔案可以不存在,會幫助我們自動建立一個,但是InPutStream就必須要存在才能進行操作。
(2)可以再後面追加 true:直接再後面追加,false :從第一個開始追加(相當於修改)

package cn.lesson.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 操作步驟
 * 1.建立源
 * 2.選擇流
 * 3.操作(write)
 * 4.釋放資源
 * @author MacBook
 *
 */
public class IoTest16 {

	public static void main(String[] args) {
		//1.建立源
		File src = new File("out.txt");
		//2.選擇流
		OutputStream os = null;
		try {
			os = new FileOutputStream(src,false);
			/*
			 * 3.操作(寫入)
			 * 將字串->位元組,要編碼
			 */
			//我們要寫入的字串
			String str = "io is so easy";
			//將字串進行編碼寫入
			byte[] b = str.getBytes();//編碼
			os.write(b,0,b.length );//寫入
			os.flush();//養成重新整理的好習慣
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//4.釋放
			if(os!=null) {
				try {
					os.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}	

}

11.複製

注意:先開啟的流後關閉

package cn.lesson.io;

import java.io.File;
import java.io