在上一篇文章中,回顧了Java的多線程。而在本篇文章中主要介紹Java IO的相關知識。bash
什麼是IO?多線程
IO的名稱又來是Input與Output的縮寫,也就是輸入流和輸出流。輸入流用於從源讀取數據,輸出流用於向目標寫數據。app
能夠從下列示例圖來了解IO流: 學習
IO流對文件的操做主要分爲字符流和字節流。ui
字符流有兩個抽象類:Writer和Reader類。 其對應子類FileWriter和FileReader可實現文件的讀寫操做。 BufferedWriter和BufferedReader可以提供緩衝區功能,用以提升效率。編碼
我記得在開始學習Java不久的時候, 在教程中會使用 字符流來進行字符的讀取和寫入。比較常見的就是,運行一個main方法,而後再控制檯輸入字符,獲取輸入的字符作一些邏輯控制之類。 例如: 在控制檯輸入字符,輸入quit退出,輸入其它的字符打印。spa
代碼示例:.net
public static void main(String[] args) {
try {
test();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void test() throws IOException {
String str;
// 使用 System.in 建立 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("輸入字符, 輸入 'quit' 退出。");
// 讀取字符
do {
str=br.readLine();
System.out.println("您輸入的字符是:"+str);
} while(!str.equals("quit"));
br.close();
}
複製代碼
而後咱們輸入 hello 和quit。 結果以下:線程
輸入字符, 輸入 'quit' 退出。
hello
您輸入的字符是:hello
您輸入的字符是:
quit
您輸入的字符是:quit
複製代碼
經過上述示例咱們能夠簡單的瞭解下了字符流。 通常來講,咱們主要用字符流的狀況是讀寫文件,大部分也是文本文件,好比.txt後綴的。這裏咱們也順便介紹下如何使用。code
代碼示例:
/**
*
* 寫入和讀取文件
* @throws IOException
*/
private static void test2() throws IOException {
//建立要操做的文件路徑和名稱
String path ="E:/test/hello.txt";
String str="hello world";
FileWriter fw = new FileWriter(path);
fw.write(str);
fw.close();
FileReader fr = new FileReader(path);
StringBuffer sb=new StringBuffer();
while(fr.ready()){
sb.append((char)fr.read());
}
System.out.println("輸出:"+sb.toString());
fr.close();
}
複製代碼
注:若是在不一樣的系統上運行,能夠使用 File.separator方法,該方法表示系統的分隔符。
輸出結果:
輸出:hello word
複製代碼
上述代碼示例中,咱們使用FileWriter 和FileReader 這兩個類對文件進行讀寫,雖然能夠實現字符的寫入和讀取,可是效率並不高,由於是對磁盤的直接讀寫。通常對於文件的讀寫,咱們會使用緩衝。使用緩衝的好處就像 倒垃圾同樣,將垃圾進行整理堆積,而後到了必定的規模在丟棄,而不是有一點垃圾就倒一次。
那麼在上述的代碼中加上BufferedWriter和BufferedReader類來進行緩衝。
代碼示例:
/**
* 寫入和讀取文件
* @throws IOException
*/
private static void test3() throws IOException {
//建立要操做的文件路徑和名稱
String path ="E:/test/hello.txt";
String str="你好!";
FileWriter fw = new FileWriter(path);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(str);
bw.close();
fw.close();
FileReader fr = new FileReader(path);
BufferedReader br=new BufferedReader(fr);
StringBuffer sb=new StringBuffer();
while(br.ready()){
sb.append((char)br.read());
}
System.out.println("輸出:"+sb.toString());
br.close();
fr.close();
}
複製代碼
注:須要注意的是關閉的順序,先關閉緩衝,再關閉文件。
字節流也有兩個抽象類:InputStream和OutputStream類。 其對應子類有FileInputStream和FileOutputStream實現文件讀寫操做。 BufferedInputStream和BufferedOutputStream提供緩衝區功能
字節流也能對文本進行讀取,可是它的主要使用的場景是讀取沒法直接獲取文本信息的二進制文件,好比音樂文件、視頻文件、圖片文件等等。 這裏咱們依舊對文件進行讀取和寫入,不過咱們把以前寫入到hello.txt文件的內容加上 '你好' 寫入到新的文件中。因爲這裏使用的了中文,因此須要設置相應的編碼。
代碼示例:
/**
* 建立一個文件並讀取記錄
* @throws IOException
*/
private static void test4() throws IOException {
String path="E:/test/hello.txt";
String path2="E:/test/你好.txt";
String str="你好!";
//從文件讀取數據
InputStream input = new FileInputStream(path);
InputStreamReader reader = new InputStreamReader(input, "UTF-8");
StringBuffer sb=new StringBuffer();
while(reader.ready()){
sb.append((char)reader.read());
}
input.close();
reader.close();
//建立一個文件並向文件中寫數據
OutputStream output = new FileOutputStream(path2);
OutputStreamWriter writer = new OutputStreamWriter(output, "UTF-8");
writer.write(sb+str);
writer.close();
output.close();
//從文件讀取數據
InputStream input2 = new FileInputStream(path2);
InputStreamReader reader2 = new InputStreamReader(input2, "UTF-8");
StringBuffer sb2=new StringBuffer();
while(reader2.ready()){
sb2.append((char)reader2.read());
}
System.out.println("輸出:"+sb2);
input2.close();
reader2.close();
}
複製代碼
結果:
輸出:hello world你好!
複製代碼
能夠看到結果符合咱們的預期。
學習IO流中,咱們也會接觸File類。 File類中主要是對文件夾的一些操做。好比,文件夾的建立、刪除、查看等等。 這裏咱們就簡單的介紹下File類的相關使用,仍是使用代碼配合註釋來進行說明。
代碼示例:
private static void test5() throws IOException {
String path="E:/test/test2";
String path2="E:/test/test3/test3";
String path3="E:/test/test2/test2.txt";
File f = new File(path);
File f2 = new File(path2);
File f3 = new File(path3);
//建立文件夾
System.out.println("="+f.mkdir());
//建立文件夾和全部父文件夾
System.out.println("=="+f2.mkdirs());
//建立一個文本
System.out.println("==="+f3.createNewFile());
//獲取名稱
System.out.println("==="+f3.getName());
//獲取父級名稱
System.out.println("==="+f3.getParent());
//獲取當前路徑
System.out.println("==="+f3.getPath());
//判斷是不是目錄
System.out.println("=="+f2.isDirectory());
System.out.println("==="+f3.isDirectory());
//刪除該文件
System.out.println("==="+f3.delete());
}
複製代碼
輸出結果:
=true
==true
===true
===test2.txt
===E:\test\test2
===E:\test\test2\test2.txt
==true
===false
===true
複製代碼
關於File類的相關只是簡單的介紹了下,具體的使用還須要配置實際的場景。須要注意的是,在進行文件建立和刪除的時候,須要先判斷是否存在,不然將拋出異常。
到此,本文就結束了,謝謝閱讀!歡迎留言和點贊,你的支持是我寫做最大的動力!
版權聲明: 做者:虛無境 博客園出處:http://www.cnblogs.com/xuwujing CSDN出處:http://blog.csdn.net/qazwsxpcm 我的博客出處:http://www.panchengming.com