學習Java第三十二天--IO框架之File類和字符流

15.3.6 File類

  • 概念:代表物理盤符中的一個文件或者文件夾;
  • 方法:
    createNewFile() //創建一個新文件
    Mkdir() //創建一個新目錄
    Delete() //刪除文件或空目錄
    Exists() //判斷File對象所代表的對象是否存在
    getAbsolutePath() //獲取文件的絕對路徑
    getName() //獲取名字
    getParent() //獲取文件/目錄所在的目錄
    isDirectory() //是否是目錄
    isFile() //是否是文件
    length() //獲得文件的長度
    listFiles() //列出目錄中的所有內容
    renameTo() //修改文件名
import java.io.File;

public class TestFiles {

	public static void main(String[] args) throws Exception{
		File file = new File("Files\\target.txt");

		System.out.println(file.canExecute());//判斷是否是可執行的
		System.out.println(file.canWrite());//判斷是否是可以修改
		System.out.println(file.canRead());//判斷是否可以執行
		
		System.out.println(file.createNewFile());//新建一個文件,如果不存在的話
		
//		System.out.println(file.delete());//如果文件存在,則刪除
//		file.deleteOnExit();//JVM終止時,刪除該文件
//		System.out.println(file.exists());//
		
		System.out.println(file.getAbsolutePath());//絕對路徑
		System.out.println(file.getPath());//相對路徑
		System.out.println(file.getName());//獲取文件名
		System.out.println(file.getFreeSpace() / 1024 / 1024 /1024);//獲取硬盤的空閒空間
		System.out.println(file.getTotalSpace() / 1024 / 1024 /1024);//獲取硬盤的總空間
		System.out.println(file.getParent());//獲取父級目錄
		System.out.println(file.isDirectory());//判斷是否爲文件夾
		System.out.println(file.isFile());//判斷是否爲文件
		System.out.println(file.isHidden());//判斷文件是否爲隱藏
		System.out.println( (System.currentTimeMillis() - file.lastModified()) / 1000 / 60);//獲取文件最後一次修改的時間
		System.out.println(file.length());//獲取文件內容的字節
		
//		file.mkdirs();//創建目錄及文件
		
		
	}

}

15.3.7 FileFilter接口

  • public interface FileFilter
  • boolean accept(File pathname)
  • 當調用File類中的listFiles()方法時,支持傳入FileFilter接口接口實現類,對獲取文件進行過濾,只有滿足條件的文件纔可出現在listFiles()的返回值中。
import java.io.File;
import java.io.FileFilter;

public class TestlistFiles {

	public static void main(String[] args) {
		File file = new File("D:\\JAVAEE");
		
//		String[] fileNames = file.list();//獲取文件夾中的所有文件(文件夾)的名字 String
//		for (String s : fileNames) {
//			System.out.println(s);
//		}

		File[] files = file.listFiles(new MyFilter());//獲取文件夾中所有文件(文件夾)的對象 File
		
		System.out.println(files.length);
//		for (File file2 : files) {
//			System.out.println(file2.getName()+":"+file2.isFile());
			
//			if(file2.isFile()) {//判斷是是不是文件
//				if(file2.getName().endsWith(".txt")) {//判斷是否是.txt
//					System.out.println();
//				}
//			}
//		}
	}

}

class MyFilter implements FileFilter{

	@Override
	public boolean accept(File pathname) {//true保持,false過濾
		if(pathname.isFile()) {
			if(pathname.getName().endsWith(".txt")) {
				return true;//保存
			}
		}
		return false;//過濾
	}
	
}

輸出結果:

1

此處輸出的是對應文件夾下.txt文件的數目

import java.io.File;
import java.io.FileFilter;

public class TestShowAllFils {

	static int count = 0;
	public static void main(String[] args) {
		//1.遍歷D盤下,所有是class爲結尾的文件
		File file = new File("D:\\");
		showall(file);
		System.out.println(count);
	}
	
	public static void showall(File dir) {
		
		File[] files = dir.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File pathname) {
				if(pathname.isDirectory()) {//文件夾保存
					return true;
				}
				if(pathname.isFile()) {//符合要求的文件保存
					if(pathname.getName().endsWith(".class")) {
						return true;
					}
				}
				return false;
			}
		});
		if(files != null) {
			for(File f : files) {//循環遍歷
				if(f.isFile()) {//文件就打印
					//System.out.println(f.getName());
					count++;
				}else {//如果是文件夾就遞歸
					showall(f);
				}
			}
		}	
	}
}

輸出結果:

1528

此處輸出的是D盤下.class文件的數目。

15.4 字符編碼

  • ISO-8859-1 : 收錄除ASCII外,還包括西歐、希臘語、泰語、阿拉伯語、希伯來語對應的文字符號;
  • UTF-8 : 針對Unicode的可變長度字符編碼
  • GB2312 : 簡體中文
  • GBK : 簡體中文、擴充
  • BIG5 : 臺灣、繁體中文
  • 當編碼方式和解碼方式不一致時,會出現亂碼
import java.io.UnsupportedEncodingException;

public class TestEncoding {

	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "你好世界abc123";//文本內容
		//編碼   文本--》二進制
		byte[] bs = str.getBytes("GBK");//獲得字符串的二進制表現形式
		
		for(int i = 0 ; i < bs.length ; i++) {
			System.out.println(bs[i]);
		}
		
		//解碼   二進制--》文本
		String str2 = new String(bs , "GBK");
		
		System.out.println(str2);

		
		//解碼爲BIG5
		String str3 = new String(bs , "BIG5");
		System.out.println(str3);
		
		//編碼回二進制
		byte[] bs2 = str3.getBytes("BIG5");
		//解碼爲GBK
		String str4 = new String(bs2 , "GBK");
		System.out.println(str4);//因爲都有對應的解碼,可以解回去
		
		String s1 = "喆你好世界abc123";
		//編碼  字符集 是一致的
		byte[] bs3 = s1.getBytes("UTF-8");
		//解碼  字符集 是一致的
		String s2 = new String(bs3 , "UTF-8");
		String s3 = new String(bs3 , "BIG5");
		
		System.out.println(s2+"\n"+s3);
	}

}

輸出結果:

-60
-29
-70
-61
-54
-64
-67
-25
97
98
99
49
50
51
你好世界abc123
斕疑岍賜abc123
你好世界abc123
喆你好世界abc123
???憟賭???abc123

15.5 字符流

15.5.1 字符流的父類

字符流的父類(抽象類):

  • Reader:字符輸入流
    public int read(){}
    public int read(char[] c){}
    public int read(char[] b , int off , int len){}
  • Writer:字符輸出流
    public void write(int n){}
    public void write(String str){}
    public void write(char[] c){}

15.5.2 字符節點流

FileWriter:

  • public void writer(String str) //一次寫多個字符,將b數組中所有字符,寫入輸出流;

FileReader:

  • public int read(char[] c)
    //從流中讀取多個字,將讀到內容存入c數組,返回實際讀到的字符數;如果達到文件的尾部,則返回-1;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TestWriter {

	public static void main(String[] args) throws IOException {
		FileWriter fw = new FileWriter("Files/chars.txt");

		fw.write("Hello今天天氣不錯12");
		char[] chars = new char[] {'你', '好'};
		
		fw.write(chars);
		fw.flush();
		
		FileReader fr = new FileReader("Files/chars.txt");
		
		char[] cache = new char[4];
		
		while(true) {
			int n = fr.read(cache);
			if(n == -1) {
				break;
			}
			for(int i = 0 ; i < n ; i++){
				System.out.print(cache[i]);
			}
			System.out.println();
		}
	}

}

輸出結果:

Hell
o今天天
氣不錯1
2你好

15.5.3 字符過濾流

緩衝流:BufferedWriter/BufferedReader

  • 支持輸入換行符;
  • 可一次寫一行、讀一行;

PrintWriter:

  • 封裝了print() / println()方法,支持寫入後換行;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestBuffered {

	public static void main(String[] args) throws IOException {
		FileWriter  fw = new FileWriter("Files/buf.txt");

//		BufferedWriter bw = new BufferedWriter(fw);//過濾流
//		bw.write("Hello");
//		bw.newLine();//根據平臺提供換行符
		
		//過濾流
		PrintWriter pw = new PrintWriter(fw);
		
		pw.println("Hello");
		
		pw.println("World");
		
		pw.flush();
		
		//------字符輸入過濾流
		FileReader fr = new FileReader("Files/buf.txt");
		BufferedReader br = new BufferedReader(fr);
		//BufferedReader.readLine(); 文件末尾返回的是null
		while(true) {
			String str = br.readLine();
			if(str == null) {
				break;
			}
			System.out.println(str);
		}
	}

}

輸出結果:

Hello
World

15.5.4 字符節點流(橋轉換流)

橋轉換流:InputStreamReader / OutputStreamWriter

  • 可將字節流轉換爲字符流;
  • 可設置字符的編碼方式;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;


public class TestConvertStream {

	public static void main(String[] args) throws Exception {
		//1.字節輸出流
		OutputStream os = new FileOutputStream("Files/convert.txt");//字節輸出流
		
		//編碼 2.轉換爲字符輸出流
		OutputStreamWriter osw = new OutputStreamWriter(os , "UTF-8");//指定輸出的數據  編碼格式
		
		//3.包裝字符過濾流
		PrintWriter pw = new PrintWriter(osw);

		pw.println("今天天氣非常好");
		
		pw.println("你好世界");
		
		pw.flush();
		
		pw.close();
//		PrintWriter pw2 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("Files/convert.txt") , "UTF-8"));
		
		//---------------------------------------
		
		//1.字節輸入流
		InputStream is = new FileInputStream("Files/convert.txt");
		
		//解碼 2.轉換爲字符輸入流
		InputStreamReader isr = new InputStreamReader(is , "UTF-8");
		
		//3.包裝字符過濾流
		BufferedReader br = new BufferedReader(isr);
		
		while(true) {
			String s = br.readLine();
			if(s == null) {
				break;
			}
			System.out.println(s);
		}
		
		br.close();
	}

}

輸出結果:

今天天氣非常好
你好世界

15.5.5 使用步驟

  1. 創建節點流;
  2. [創建過濾流 設置字符編碼集];
  3. 封裝過濾流;
  4. 讀寫數據;
  5. 關閉流;

15.6 總結

流的概念:

  • 內存與存儲設備之間傳輸數據的通道;

流的分類:

  • 輸入流、輸出流; 字節流、字符流、 節點流、過濾流;

序列化、反序列化:

  • 將對象通過流寫入到文件,或將對象通過流讀取到內存,必須實現Serializable接口;

File對象:

  • 代表物理盤符中的一個文件或者文件夾;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章