io流

java.io.File用於表示文件(目錄),也就是說程序員能夠經過File類在程序中操做硬盤上的文件和目錄。java

File類只用於表示文件(目錄)的信息(名稱、大小等),丌能對文件的內容進行訪問。
File f=new File(".");
System.out.println(f.getCanonicalPath());
f.getCanonicalPath()---獲取當前路徑程序員

創件一個新的文件
File d=new File(f,"demo");
if(!d.exists()){
d.mkdir();
}sql

創件新的文件對象
File text=new File(d,"text");
if(!text.exists()){
text.createNewFile();
}ide

獲取文件
File f=new File("c:");
System.out.println(f.getCanonicalPath());
f.getCanonicalPath();
File[] files=f.listFiles();
System.out.println(Arrays.toString(files));性能


FileFilter類是對操做文件的過濾
File f=new File("src/test");
File[] files=f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java")&&pathname.isFile();
}
});
for(File file:files){
System.out.println(file.getName());
}編碼

listFiles()方法會將dir中每一個文件交給accept()方法檢測,若是返回true,就做爲方法的返回結果元素code

 

Java中的IO流是實現輸入/輸出的基礎。對象

按照流的方向不一樣:分爲輸入流和輸出流。
按照處理數據單位的不一樣:分爲字節流(8位)和字符流(16位)。
按照功能不一樣:分爲節點流和處理流繼承

 

全部面向字節的流類都繼承於InputStream類(輸入流)
或OutputStream類(輸出流),這兩個類是抽象類,咱們能夠利用它的子類來完成不一樣的功能。內存

InputStream、OutputStream都是抽象類
InputStream抽象了應用程序讀取數據的方式
OutputStream抽象類應用程序寫出數據的方式


文件輸入流 FileInputStream 繼承了InputStream,FileInputStream 具體實現了在文件上讀取數據。
int b = in.read() 讀取一個 byte 無符號填充到 int 低八位,-1 是 EOF
in.read(byte[] buf) 讀取數據填充到 buf 中
in.read(byte[] buf, int start, int size) 讀取數據填充到 buf 中

FileOutputStream
輸出流的基本方法:
out.write(int b) 寫出一個 byte 到流 b 的低八位寫出
out.write(byte[] buf) 將緩衝區 buf 都寫入到流
out.write(byte[] buf, int start, int size) 將 buf 的一部分寫到流中
out.flush() 清理緩衝
out.close();

注意他們兩個都是字節流--用於讀取諸如圖像數據之類的原始字節流

案例1:使用FileInputStream讀取文件
File file=new File("c:","sql.properties");
FileInputStream fis=new FileInputStream(file);
int n=0;
byte[] b=new byte[1024];
while((n=fis.read(b))!=-1){
System.out.println(newString(b,0,n));//System.out.println(new String(b,"gbk"));--控制格式
}
fis.close();

實驗2:使用輸入輸出流複製文件
File file=new File("c:","sql.properties");
File f2=new File("c:/text2.txt");
FileInputStream fis=new FileInputStream(file);
FileOutputStream fo=new FileOutputStream(f2);
int n=0;
while((n=fis.read())!=-1){
fo.write(n);
}
fis.close();
fo.flush();
fo.close();

案例3:圖像的複製


BufferedInputStream && BufferedOutputStream 爲 IO 操做提供了緩衝區,通常打開文件進行
寫入戒讀取操做時,都加上緩衝流,這種流模式是爲了提升 IO(輸入輸出)的性能。

在FileInputStream裏有一個說明是說此方法將阻塞,意思就是說在你讀一個文件輸入流的時候,當讀到某個位置的時候,若是作一些其餘處理(好比說接受一部分字節作一些處理等等)這個時候輸入流在什麼位置就是什麼位置,不會繼續往下讀,而BufferedInputStream雖然也有一個read方法,可是從名字就能夠看出,它帶有一個緩衝區,它是一個非阻塞的方法,在你讀到某個位置的時候,作一些處理的時候,輸入流可能還會繼續讀入字節,這樣就達到了緩衝的效果。
假設一個文件的長度是100個字節,要將之讀取到內存中,再假設您每次只讀取10個字節,那麼讀完整個文件是否是讀取10次的呀?


假設老闆讓你完成100件事情,老闆說,你天天只完成10件就能夠了,難道你非得等到第十天才完成第100件事情嗎?有一天您在中午下班前就完成了10件事情,下午您不妨多幹一點,那麼也許在第9天的時候就完成了100件事情。

同理,BufferedInputStream有可能會讀取比您規定的更多的東西到內存,以減小訪問IO的次數,
總之您要記住一句話,訪問IO的次數越少,性能就越高,緣由就在於CPU和內存的速度》》》》遠大於硬盤或其餘外部設備的速度。
File f=new File("c:/wode.txt");
byte[] b=new byte[(int) f.length()];
BufferedInputStream bu=new BufferedInputStream(new FileInputStream(f));
int i=0;
while((i=bu.read(b))!=-1){
System.out.println(new String(b,"gbk"));
}


字符流:
字符流(Reader Writer)
字符的處理,一次處理一個字符(unicode 編碼)
2) 字符的底層仍然是基本的字節流
3) 字符流的基本實現
? InputStreamReader 完成 byte 流解析爲 char 流, 按照編碼解析
? OutputStreamWriter 提供 char 流到 byte 流, 按照編碼處理

主要使用它們兩個FileReader FileWriter
Reader類中兩個經常使用類:
FileReader:以字符流的形式讀取文件,與FileInputStream用法基本一致。
BufferedReader:將流讀入緩衝區,而後從緩衝區讀取,而且提供了readLine()方法,能夠從文本文件中整行的讀取數據。

Writer類中兩個經常使用類:
FileWriter:以字符流的形式寫入文件,與FileOutputStream用法基本一致。
BufferedWriter:將緩衝區輸出到流。


它和我咱們字節流的區別:
InputStream和OutputStream主要用來處理能夠被直接讀做bytes的數字。
Reader和Writer用來處理文本。

實驗1:寫出文件:
File file=new File("c:\\test.txt");
FileWriter fw=new
FileWriter(file);//在這裏加入參數true會實現對文件的續寫
String s="舉頭望明月,低頭寫代碼";//\r\n爲window下邊的換行
fw.write(s);
fw.close();

案例2:讀取文件
File file=new File("c:\\test.txt");
BufferedReader br=new BufferedReader(new FileReader(file));
String strline =br.readLine();
System.out.println(strline);
--可是咱們發現,這樣只讀取了一行數據

File file=new File("c:\\test.txt"); FileReader fr=new FileReader(file); int ch=0; while((ch=fr.read())!=-1){ System.out.print((char)ch); }

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息