天天看點

File-IO流複習

File

File類型的構造方法

File(File parent, String child) 

從父抽象路徑名和子路徑名字元串建立新的 File執行個體。

File(String pathname) 

通過将給定的路徑名字元串轉換為抽象路徑名來建立新的 File執行個體。

File(String parent, String child) 

從父路徑名字元串和子路徑名字元串建立新的 File執行個體。

File類型的建立方式

boolean

createNewFile()

當且僅當具有該名稱的檔案尚不存在時,原子地建立一個由該抽象路徑名命名的新的空檔案。

boolean

mkdir()

建立由此抽象路徑名命名的目錄。

boolean

mkdirs()

建立由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄。

練習:在D盤中a/b/c建立一個檔案,名稱叫HelloWorld.java

import java.io.File;

import java.io.IOException;

//注:沒D盤,用F盤代替了

public class Test01IO {

public static void main(String[] args) throws Exception {

File dir = new File("F:/a/b/c");

dir.mkdirs();

File file = new File(dir,"HelloWorld.java");

file.createNewFile();

}

}

File類型的删除方法

boolean

delete()

删除由此抽象路徑名表示的檔案或目錄。

注意事項:

在删除檔案夾的時候,隻能删除的空的檔案夾。

delete方法不走資源回收筒。

File類型的重命名功能

boolean

renameTo(File dest)

重命名由此抽象路徑名表示的檔案。

注意事項:

如果在同一個檔案夾下,修改路徑,就是重命名操作。

如果不在同一個檔案夾下,修改路徑,就是剪切操作。

(一開始File dest不能真實存在)

File類型中的判斷功能

boolean

exists()

測試此抽象路徑名表示的檔案或目錄是否存在。

boolean

isDirectory()

測試此抽象路徑名表示的檔案是否為目錄。

boolean

isFile()

測試此抽象路徑名表示的檔案是否為普通檔案。

File類型的擷取方法

String

getAbsolutePath()

傳回此抽象路徑名的絕對路徑名字元串。

String

getPath()

将此抽象路徑名轉換為路徑名字元串。

String

getName()

傳回由此抽象路徑名表示的檔案或目錄的名稱。

long

length()

傳回由此抽象路徑名表示的檔案的長度。

String[]

list()

傳回一個字元串數組,命名由此抽象路徑名表示的目錄中的檔案和目錄。

File[]

listFiles()

傳回一個抽象路徑名數組,表示由該抽象路徑名表示的目錄中的檔案。

練習一:

鍵盤錄入一個字元串,表示一個檔案夾路徑,如果不是檔案夾提示重新錄入,列印目前檔案夾下,所有的大于10M的字尾名名為.mp4檔案的絕對路徑。

isDirectory()  listFiles()  length()  getName().endWiths(“mp4”)  getAbsoultPath()

import java.io.File;

import java.util.Scanner;

public class Test01File {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

boolean flag;

do {

flag = false;

System.out.println("請錄入一個字元串(檔案夾路徑):");

String path = sc.nextLine();

File file = new File(path);

if(file.isDirectory()) {//true當且僅當該抽象路徑名表示的檔案存在且為目錄時; false否則

printAbsolutePath(file);

}else {

System.out.println("親,您剛剛的錄入有誤,請重新錄入哦!");

flag = true;

}

}while(flag);

}

//列印目前檔案夾下,所有的大于10M的字尾名名為.mp4檔案的絕對路徑

private static void printAbsolutePath(File file) {

File[] files = file.listFiles();

for(File f : files) {//true當且僅當該抽象路徑名表示的檔案存在且為檔案時; false否則

if(f.isFile()) {

//1kb = 1024位元組      1mb = 1024kb

if(f.getName().endsWith(".mp4")&&f.length()>10*1024*1024) {

System.out.println(f.getAbsolutePath());

}

}else {

printAbsolutePath(f);

}

}

}

}

練習二:

鍵盤錄入一個檔案夾路徑,列印這個檔案夾下的所有檔案的絕對路徑(包含子檔案夾的内容)

import java.io.File;

import java.util.Scanner;

public class Test02File {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

boolean flag;

do {

flag = false;

System.out.println("請錄入一個字元串(檔案夾路徑):");

String path = sc.nextLine();

File file = new File(path);

if(file.isDirectory()) {//true當且僅當該抽象路徑名表示的檔案存在且為目錄時; false否則

printAbsolutePath(file);

}else {

System.out.println("親,您剛剛的錄入有誤,請重新錄入哦!");

flag = true;

}

}while(flag);

}

private static void printAbsolutePath(File file) {

File[] files = file.listFiles();

for(File f : files) {//true當且僅當該抽象路徑名表示的檔案存在且為檔案時; false否則

if(f.isFile()) {

System.out.println(f.getAbsolutePath());

}else {

printAbsolutePath(f);

}

}

}

}

IO流(字元流、位元組流)

輸入輸出流是站在記憶體的角度上看的!站在記憶體的角度看待方向,從其它裝置進入到記憶體的,都是輸入,從記憶體到其它裝置,都是輸出

體系結構

位元組流:

位元組輸入流:InputStream

位元組輸出流:  OutputStream

字元流:

字元輸入流:Reader

字元輸出流:Writer

InputStream

位元組輸入流的頂層父類

常用的方法  輸入流:讀取

abstract int

read()

從輸入流讀取資料的下一個位元組。 結束标志為-1

int

read(byte[] b)

從輸入流讀取一些位元組數,并将它們存儲到緩沖區 b 。 結束标志為-1

int

read(byte[] b, int off, int len)

從輸入流讀取最多 len位元組的資料到一個位元組數組。

Int len = read(byte[] buf);傳回值為覆寫位元組數組的長度。

File-IO流複習

使用InputStream的子類對象FileInputStream

FileInputStream的構造方法

FileInputStream(File file) 

通過打開與實際檔案的連接配接建立一個 FileInputStream ,該檔案由檔案系統中的 File對象 file命名。

FileInputStream(String name) 

通過打開與實際檔案的連接配接來建立一個 FileInputStream ,該檔案由檔案系統中的路徑名 name命名。

OutputStream

位元組輸出流的頂層抽象父類。

常用方法

void

write(byte[] b)

将 b.length位元組從指定的位元組數組寫入此輸出流。

void

write(byte[] b, int off, int len)

從指定的位元組數組寫入 len個位元組,從偏移 off開始輸出到此輸出流。

abstract void

write(int b)

将指定的位元組寫入此輸出流。

void

close()

關閉此檔案輸出流并釋放與此流相關聯的任何系統資源。

FileOutputStream

FileOutputStream(File file)

建立檔案輸出流以寫入由指定的 File對象表示的檔案。

FileOutputStream(File file, boolean append)

建立檔案輸出流以寫入由指定的 File對象表示的檔案。

FileOutputStream(String name)

建立檔案輸出流以指定的名稱寫入檔案。

FileOutputStream(String name, boolean append)

建立檔案輸出流以指定的名稱寫入檔案。

InputStream類型的read()方法和read(byte[] buf)方法的比較

讀取位元組個數的差別

 read()方法一次隻讀取一個位元組

 read(buf)方法一次可以讀取多個位元組,取決于數組的大小

傳回值不同

 read()讀取到的是檔案位元組資訊是作為傳回值進行傳回的。

 read(buf):讀取到的位元組存儲到數組中,傳回的是覆寫數組的長度。

高效緩沖流

BufferedInputStream和BufferedOutputStream

構造方法

BufferedInputStream(InputStream in) 

建立一個 BufferedInputStream并儲存其參數,輸入流 in ,供以後使用。

BufferedOutputStream(OutputStream out) 

建立一個新的緩沖輸出流,以将資料寫入指定的底層輸出流。

BufferedInputStream高效的原理:在該類型中準備一個數組,存儲位元組資訊,當外界調用read()方法想擷取一個位元組的時候,該對象從檔案中一次性讀取一8192個位元組到數組中,隻傳回一個位元組,再次調用讀取方法read(),隻需要從自帶的數組中去擷取資料即可,不再需要重新通路檔案。

BufferedOutpStream高效的原理:在該類中準備一個數組,存儲位元組資訊,當外界調用write()方法想寫出一個位元組的時候,該對象直接将這個位元組存儲到自已的數組中,而不重新整理到新檔案中,一直到該數組所有8192個位置全都占滿,該對象才把這個數組中所有的資料一次性寫到目标檔案中。

通用流的書寫格式

 建立一個流和檔案進行關聯,提高效率加byte[],

 加上高效緩沖流,自帶緩存。

輸出流中的close和flush的差別

close方法在調用的時候預設先會調用flush

close方法把流對象關閉掉了

flush隻是把緩沖區的資料重新整理到檔案中

字元流

  字元輸入流:Reader

字元輸出流:Writer

位元組流雖然也可以操作字元,但是在操作中英文混合的時候,判斷起來較麻煩,需要判斷中英文的辨別,如果是英文的辨別,直接讀取一個位元組,如果是中文的辨別,需要再次讀取一個位元組拼接成兩個位元組,一塊讀取,這種操作判斷起來非常 麻煩,恰巧字元流幫咱們封裝這種判斷辨別的操作,是以直接可以使用字元流來操作中英文混合的字元。

Reader:

int

read() 

讀一個字元  結束标志-1

int

read(char[] cbuf) 

将字元讀入數組。 結束标志-1

Writer:

void

write(char[] cbuf) 

寫入一個字元數組。

abstract void

write(char[] cbuf, int off, int len) 

寫入字元數組的一部分。

void

write(int c) 

寫一個字元

void

write(String str) 

寫一個字元串

void

write(String str, int off, int len) 

寫一個字元串的一部分。

abstract void

close() 

關閉流,先重新整理。

abstract void

flush() 

重新整理流。

練習:

字元流的複制粘貼操作

//字元流的複制粘貼操作

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

//複制粘貼docx文檔還是會出現亂碼,但是txt文檔就沒問題

public class Test02IO {

public static void main(String[] args) throws Exception {

//BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\課程資料\\正在學習\\大資料1028班\\Homework2019\\Homework20191104.docx"));

//BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/Homework20191104.docx"));

BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\課程資料\\正在學習\\大資料1028班\\Homework2019\\a.txt"));

BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/a.txt"));

String str = "";

while((str=br.readLine())!=null) {

bw.write(str);

bw.newLine();

bw.flush();

}

br.close();

bw.close();

}

}