1.按照讀寫方式來分
以下這幾個(gè)類都是抽象類.并且都有對(duì)于文件操作的具體實(shí)現(xiàn)類.File+類名就是具體的實(shí)現(xiàn)類
1.1.二進(jìn)制方式讀寫
1.1.1.InputStream
以二進(jìn)制方式讀.有兩個(gè)主要方法.
1.read();
該方法有三個(gè)版本
- 無參: read() 讀取一個(gè)字節(jié)的數(shù)據(jù),返回 -1 表示讀取結(jié)束
- 一個(gè)參數(shù): read(byte[] b) 最多讀取 b.length 字節(jié)的數(shù)據(jù)到 b 中,返回值是實(shí)際讀到的數(shù)量;返回 -1 表示讀取結(jié)束.讀取到的內(nèi)容會(huì)存儲(chǔ)在傳入的數(shù)組參數(shù)中.
- 三個(gè)參數(shù): read(byte[] b, int off, int len) 最多讀取 (len-off)個(gè)字節(jié)的數(shù)據(jù)到 b 中,放在byte數(shù)組中,從 off 開始,返回實(shí)際讀到的數(shù)量;返回 -1 表示讀取結(jié)束.讀取到的內(nèi)容會(huì)存儲(chǔ)在傳入的數(shù)組參數(shù)中.
2.close();
關(guān)閉字節(jié)流.Java的數(shù)據(jù)流在使用結(jié)束時(shí)都需要手動(dòng)關(guān)閉字節(jié)流.否則長時(shí)間未關(guān)閉會(huì)產(chǎn)生內(nèi)存泄漏的危險(xiǎn).
1.1.2.OutputStream
以二進(jìn)制方式寫.有三個(gè)主要方法.默認(rèn)此操作每次都會(huì)清空舊的內(nèi)容.向內(nèi)部寫入新的內(nèi)容.如果需要追加需要添加參數(shù),
1.write();
該方法同樣有三個(gè)版本
- 一個(gè)int型的參數(shù): write(int b) 寫入一個(gè)字節(jié)
- 一個(gè)字節(jié)數(shù)組的參數(shù): write(byte[] b) 將 b 這個(gè)字符數(shù)組中的數(shù)據(jù)全部寫入 os 中
- 三個(gè)參數(shù): write(byte[] b, int off, int len) 將 b 這個(gè)字符數(shù)組中從 off 開始寫入 len 個(gè)長度的數(shù)據(jù)
2.close();
與InputStream流相同,使用結(jié)束需要關(guān)閉流.否則會(huì)產(chǎn)生危險(xiǎn).
3.flash();
清空緩存區(qū).
因?yàn)镮/O 的速度是很慢的,所以大多的 OutputStream 為了減少設(shè)備操作的次數(shù),就先將I/O內(nèi)容先寫到一片內(nèi)存中(緩沖區(qū)).等到緩沖區(qū)滿了,或者達(dá)成一定條件時(shí)才真正將數(shù)據(jù)寫入設(shè)備中.
這樣的操作提升了一定的效率,但造成一個(gè)后果.就是我們寫的數(shù)據(jù),很可能會(huì)遺留一部分在緩沖區(qū)中.所以我們就需要這樣一個(gè)操作.在合適的時(shí)候,讓緩沖區(qū)中的內(nèi)容全部寫入設(shè)備(清空緩沖區(qū)).
1.2.字符方式讀寫
用法和以字節(jié)讀寫類似,不同的是操作對(duì)象: 一個(gè)操作字節(jié),一個(gè)操作字符.
1.2.1.Reader
以字符方式讀.與InputStream類似.有 read()和close() 方法.并且用法也類似.
1.read();
該方法有三個(gè)版本
- 無參: read()
- 一個(gè)參數(shù): read(char[] b)
- 三個(gè)參數(shù): read(char[] b, int off, int len)
2.close();
關(guān)閉字符流.
1.2.2.Writer
以字符方式寫.與OutputStream類似.有 write(),close()和flash() 方法.并且用法也類似.
1.write();
該方法同樣有三個(gè)版本
- 一個(gè)int型的參數(shù): write(int b)
- 一個(gè)字符數(shù)組的參數(shù): write(char[] b)
- 三個(gè)參數(shù): write(char[] b, int off, int len)
2.close();
關(guān)閉字符流.
3.flash();
清空緩存區(qū).
2.具體的實(shí)現(xiàn)類
- FileInputStream
- FileOutputStream
- FIleReader
- FileWriter
2.1構(gòu)造方法
這幾個(gè)實(shí)現(xiàn)類的構(gòu)造方法類似.這里以FileInputStream為例.
- FileInputStream(File file) : 利用 File 構(gòu)造文件輸入流
- FileInputStream(String name) : 利用文件路徑構(gòu)造文件輸入流
需要注意的是,這幾個(gè)寫入流都是清空原有文件數(shù)據(jù),重新寫入新的數(shù)據(jù).如果想要追加數(shù)據(jù)的話.需要在構(gòu)造方法參數(shù)后面添加true.文章來源:http://www.zghlxwxcb.cn/news/detail-600418.html
FileOutputStream(String name,boolean bo);這里的第二個(gè)參數(shù)為true時(shí)就是向文件中追加內(nèi)容.文章來源地址http://www.zghlxwxcb.cn/news/detail-600418.html
3.復(fù)制文件案例
import java.io.*;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入要拷貝的源路徑");
String src = scanner.next();
System.out.println("請輸入要拷貝的目標(biāo)路徑");
String dest = scanner.next();
File srcFile = new File(src);
if (!srcFile.isFile()) {
System.out.println("輸入源路徑有誤");
return;
}
try (InputStream inputStream = new FileInputStream(src)) {
try (OutputStream outputStream = new FileOutputStream(dest)) {
byte[] buffer = new byte[1024];
while (true) {
int len = inputStream.read(buffer);
if (len == -1) {
break;
}
outputStream.write(buffer, 0, len);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
到了這里,關(guān)于Java文件讀寫數(shù)據(jù)流的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!