1、File類
1.1 概述
- File類是http://java.io包很重要的一個類;
- File類的對象可以表示文件,也可以是目錄。
- File對象只可以對文件或目錄的屬性進行操作,不可以操作文件的具體數(shù)據(jù),即不能對文件進行讀/寫操作。
1.2 構造方法
(1) File(File parent, String child)
從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實例。
通過將給定的路徑名字符串轉換為抽象路徑名來創(chuàng)建新的 File實例。
(3) File(String parent, String child)
從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實例。
通過將給定的 file: URI轉換為抽象路徑名來創(chuàng)建新的 File實例。
代碼案例:
//創(chuàng)建文件的方法
public class CreateFile {
public static void main(String[] args) {
// 創(chuàng)建文件對象。
File file = new File("D:/FileDemo/FileDemo.txt");
// 創(chuàng)建文件
if (!file.exists()) {
try {
if (file.createNewFile()) {
System.out.println("文件創(chuàng)建成功");
} else {
System.out.println("文件創(chuàng)建失敗");
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("文件已存在");
}
}
}
//創(chuàng)建目錄的方法
import java.io.File;
public class CreateDirectory {
public static void main(String[] args) {
File file = new File("D:\\FileDemo");
if (!file.exists()) {
if (file.mkdirs()) {
System.out.println("創(chuàng)建成功");
} else {
System.out.println("創(chuàng)建目錄失敗");
}
} else {
System.out.println("目錄已存在,創(chuàng)建失敗");
}
}
}
1.3 常用方法
遍歷方法:
//遍歷方法
import java.io.File;
public class FileList{
public static void main(String[] args) {
// 創(chuàng)建目錄對象。
File file = new File("E:\\");
// 使用list方法
String[] fileNameList = file.list();
// 遍歷目錄數(shù)組
for (String s : fileNameList) {
System.out.println(s);
}
System.out.println("------------------------------------");
// 使用listFiles方法
File[] fileList = file.listFiles();
for (File f : fileList) {
System.out.println(f.getAbsolutePath());
}
}
}
1.4 FileFilter文件過濾器
1.4.1 兩個作用:
(1)過濾不符合規(guī)格的文件名
- 文件名過濾器接口:interface FilenameFilter
- 需重寫accept方法自定義過濾規(guī)則
boolean accept(File dir, String name) -- dir:表示文件的當前目錄。 -- name:表示當前目錄的子目錄或者文件的名字。
- File類中提供了使用文件名過濾器遍歷目錄的方法
String[] list(FilenameFilter filter) -- 把滿足指定過濾條件的文件和目錄,返回到String數(shù)組中。 File[] listFiles(FilenameFilter filter) -- 把滿足指定過濾條件的文件和目錄,返回到File數(shù)組中。
(2)常用于檢測文件是否存在
- 文件過濾器接口:interface FileFilter
- 需重寫accept方法自定義過濾規(guī)則,如下:
boolean accept(File pathName) -- pathName:表示當前目錄的子目錄或者文件的名字。
- File類中提供了使用文件過濾器遍歷目錄的方法:
File[] listFiles(FilenameFilter filter) -- 把滿足指定過濾條件的文件和目錄,返回到File數(shù)組中。
代碼演示:
public class FileFilterDemo {
public static void main(String[] args) {
//創(chuàng)建目錄對象
File dir = new File("D:\\FileDemo");
//使用"匿名內部類"的方式創(chuàng)建過濾器
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().toLowerCase().endsWith(".txt");
}
};
File[] files = dir.listFiles(filter);
for (File file : files) {
System.out.println(file);
}
}
}
2、輸入流與輸出流
類:InputStream、OutputStream、Reader、Writer
2.1 流按著數(shù)據(jù)的傳輸方向分為:
- 輸入流:往內存中讀叫輸入流。
- 輸出流:從內存中往外寫叫輸出流。
(1)所有輸入流都是InputStream類或者Reader類的子類。
- 類名以InputStream結尾的類都是InputStream的子類。
- 類名以Reader結尾的類都是Reader類的子類。
(3)所有輸出流都是OutputStream類或者Writer類的子類。
- 類名以OutputStream結尾的類都是OutputStream的子類。
- 類名以Writer結尾的類都是Writer類的子類。
2.2 從數(shù)據(jù)流編碼格式上劃分為:
- 字節(jié)流:處理單元為1個字節(jié)
- 字符流:處理單元為2個字節(jié)
(1)InputStream和OutputStream的子類都是字節(jié)流
- 可以讀寫二進制文件,主要處理音頻、圖片、歌曲、字節(jié)流,處理單元為1個字節(jié)。
(2)Reader和Writer的子類都是字符流
- 主要處理字符或字符串,字符流處理單元為2個字節(jié)。
- 字節(jié)流將讀取到的字節(jié)數(shù)據(jù),去指定的編碼表中獲取對應文字。
由于上述兩種分類都是針對InputStream、OutputStream、Reader、Writer四個類,所以代碼案例寫在一起
代碼案例:
//字節(jié)輸入流(FileInputStream)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) {
//建立文件對象
File file=new File("C:\\Users\\25849\\Desktop\\1.txt");
try
{
//建立鏈接
FileInputStream fileInputStream=new FileInputStream(file);
int n=0;
StringBuffer sBuffer=new StringBuffer();
while (n!=-1) //當n不等于-1,則代表未到末尾
{
n=fileInputStream.read();//讀取文件的一個字節(jié)(8個二進制位),并將其由二進制轉成十進制的整數(shù)返回
char by=(char) n; //轉成字符
sBuffer.append(by);
}
System.out.println(sBuffer.toString());
}
catch (FileNotFoundException e)
{
System.out.println("文件不存在或者文件不可讀或者文件是目錄");
}
catch (IOException e)
{
System.out.println("讀取過程存在異常");
}
}
}
結果:由于文件存的是字符類型,以字節(jié)形式讀取,會把原本的字符分解為兩個字節(jié),所以亂碼了
????¤§???????¤§asfsa???
sdg sgdf???dfhfh
?¤§?????????????????¨é??
?????¨é???????¨é??sf?
//字節(jié)輸出流(FileOutputStream)
import java.io.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) {
// 建立文件對象
File file = new File("C:\\Users\\25849\\Desktop\\1.txt");
try {
String content = "我生來堅強\n只要不死\n我就笑得猖狂";
FileOutputStream out = new FileOutputStream(file, true);
out.write(content.getBytes());
System.out.println("寫入成功");
}
catch (FileNotFoundException e) {
System.out.println("文件不存在或者文件不可讀或者文件是目錄");
} catch (IOException e) {
System.out.println("讀取過程存在異常");
}
}
}
結果:
寫入成功
在沒有實力之前,你要學會比狼能忍
在有了實力之后,你要學會比狼更狠我生來堅強我生來堅強
只要不死
我就笑得猖狂
//字符輸入流(FileReader)
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args) {
// 建立文件對象
File file = new File("C:\\Users\\25849\\Desktop\\1.txt");
try {
// 建立鏈接
FileReader fileReader = new FileReader(file);
int n = 0;
char[] chars = new char[10];
String s ;
while ((n = fileReader.read(chars)) != -1) // 當n不等于-1,則代表未到末尾
{
String string = new String(chars,0,n);
System.out.println(string);
}
} catch (FileNotFoundException e) {
System.out.println("文件不存在或者文件不可讀或者文件是目錄");
} catch (IOException e) {
System.out.println("讀取過程存在異常");
}
}
}
//字符輸出流(FileWriter)
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo2 {
public static void main(String[] args) {
FileWriter filewriter = null;
try {
filewriter = new FileWriter("C:\\Users\\25849\\Desktop\\1.txt",true);
String content = "abcdefghigklmn";
filewriter.write( content );
} catch (IOException e1) {
e1.printStackTrace();
}finally{
try {
//清空緩存區(qū)
filewriter.flush();
//關閉“文件字符輸出流”
filewriter.close();
System.out.println("寫入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.3 從封裝類型不同分為:
- 節(jié)點流:如果流封裝的是某種特定的數(shù)據(jù)源,如文件、字符串、字符串數(shù)組等,則稱為節(jié)點流。
- 處理流:如果流封裝的是其它流對象,稱為處理流。處理流提供了緩沖功能,提高讀寫效率。
(1)節(jié)點流中常用類
- 字節(jié)輸入流 FileInputStream
- 字節(jié)輸出流 FileOutputStream
- 字符輸入流 FileReader
- 字符輸出流 FileWriter
(2)處理流中常用類
- 緩沖字節(jié)輸出流 BufferedOutputStream
- 緩沖字節(jié)輸入流 BufferedInputStream
- 緩沖字符輸入流 BufferedReader
- 緩沖字符輸出流 BufferedWriter
上面的節(jié)點流就是之前描述的,在這里著重描述處理流
2.3.1 處理流:
1.緩沖區(qū)原理:
-緩沖區(qū)的概念。
-緩沖區(qū)的作用:要對操作的數(shù)據(jù)進行臨時的緩存,提高了讀寫效率。
-緩沖區(qū)如何提高讀寫效率。
2.處理流的特點:
- 字符緩沖輸入流提供了讀取一行的方法readLine() 。
- 字符緩沖輸出流提供了寫入一個空行的方法newLine()。
- 字符緩沖輸出流,把寫入的數(shù)據(jù)先寫入到內存,再使用flush()方法將內存數(shù)據(jù)刷到硬盤上。
注意:在使用字符緩沖輸出流時,一定先flush(),然后再close(),避免數(shù)據(jù)的丟失。
代碼案例:
//緩沖字節(jié)輸入處理流(BufferedInputStream)
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamDemo2 {
public static void main(String[] args) {
FileInputStream fileInputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
fileInputStream = new FileInputStream("C:\\Users\\25849\\Desktop\\1.txt");
bufferedInputStream = new BufferedInputStream(fileInputStream);
byte[] bytes = new byte[16];
int length = 0;
while ((length = bufferedInputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, length));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedInputStream.close();
System.out.println("讀取完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//緩沖字節(jié)輸出處理流(BufferedOutputStream)
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamDemo2 {
public static void main(String[] args) {
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
fileOutputStream = new FileOutputStream("C:\\Users\\25849\\Desktop\\1.txt");
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
String content = "abcdefghigklmn";
byte[] bytes = content.getBytes();
bufferedOutputStream.write(bytes);
System.out.println("寫入成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 刷新 “緩沖字節(jié)輸出處理流”
bufferedOutputStream.flush();
// 關閉 “緩沖字節(jié)輸出處理流”
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//緩沖字符輸入處理流(BufferedReader)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderDemo2 {
public static void main(String[] args) {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader("C:\\Users\\25849\\Desktop\\1.txt");
bufferedReader = new BufferedReader(fileReader);
String content = null;
int length = 0;
while ((content = bufferedReader.readLine()) != null) {
System.out.println(content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//關閉 “字符輸入處理流”
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//緩沖緩沖字符輸出處理流(BufferedWriter )
2.4 節(jié)點流和處理流速度的對比
//用字節(jié)節(jié)點流復制一個視頻
package com.company.project.homework.h11;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.crypto.Data;
//復制兩個視頻文件
//字節(jié)流
//用節(jié)點流
public class Demo2 {
public static void main(String[] args) throws IOException {
long now = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("D:\\ChromeCoreDownloads\\VN1v5.mp4");
FileOutputStream fos ;
File newfile = new File("D:\\ChromeCoreDownloads\\VN1v5ss.mp4");
if(!newfile.exists()) {
newfile.createNewFile();
}
fos = new FileOutputStream(newfile);
byte[] by = new byte[128];
int num = 0 ;
while ((num = fis.read(by)) != -1) {
fos.write(by,0,num);
}
System.out.println("復制完成");
System.out.println("使用時間:" + (System.currentTimeMillis() - now));
fos.close();
fis.close();
}
}
結果:
復制完成
使用時間:203
//用字節(jié)處理流復制同一個視頻
package com.company.project.homework.h11;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.crypto.Data;
//復制兩個視頻文件
//字節(jié)流
//用處理流
public class Demo {
public static void main(String[] args) throws IOException {
long now = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("D:\\ChromeCoreDownloads\\VN1v5.mp4");
FileOutputStream fos ;
File newfile = new File("D:\\ChromeCoreDownloads\\VN1v5ss.mp4");
if(!newfile.exists()) {
newfile.createNewFile();
}
fos = new FileOutputStream(newfile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] by = new byte[128];
int num = 0 ;
while ((num = bis.read(by)) != -1) {
bos.write(by,0,num);
}
System.out.println("復制完成");
System.out.println("使用時間:" + (System.currentTimeMillis() - now));
bos.close();
bis.close();
fos.close();
fis.close();
}
}
結果:
復制完成
使用時間:15
明顯速度提升了很多?。。?!