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 使用步驟
- 創建節點流;
- [創建過濾流 設置字符編碼集];
- 封裝過濾流;
- 讀寫數據;
- 關閉流;
15.6 總結
流的概念:
- 內存與存儲設備之間傳輸數據的通道;
流的分類:
- 輸入流、輸出流; 字節流、字符流、 節點流、過濾流;
序列化、反序列化:
- 將對象通過流寫入到文件,或將對象通過流讀取到內存,必須實現Serializable接口;
File對象:
- 代表物理盤符中的一個文件或者文件夾;