基礎知識整理之Java I/O操作實例(附源碼+運行結果)
先貼一張最重要的結構圖:
-
從控制檯讀取輸入
* Char Stream - Reader - BufferedReader * - InputStreamReader
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Input a char"); char c = (char)reader.read(); System.out.println("Char:" + c); reader.readLine(); // 緩衝作用,否則輸入字符時按下的回車會讓下面的readLine()直接執行到程序結束 System.out.println("Input a line"); String s = reader.readLine(); System.out.println("String:" + s); reader.close(); }
運行結果:
Input a char e Char:e Input a line Hello WOrld! String:Hello WOrld!
-
文件I/O:藉助字符流下的FileReader/FileWriter
* Char Stream - Reader - InputStreamReader - FileReader * - Writer - OutputStreamWriter - FileWriter
public static void main(String[] args) throws IOException { File file = new File("path/Hello1.txt"); //file.createNewFile(); FileWriter fileWriter = new FileWriter(file); //fileWriter.write("HelloHello"); fileWriter.append("append"); fileWriter.flush(); fileWriter.close(); FileReader fileReader = new FileReader(file); char[] chars = new char[50]; fileReader.read(chars); for(char c:chars) { System.out.print(c); } System.out.println((byte)chars[6]); fileReader.close(); }
運行結果:
append0
-
文件I/O:藉助字節流下的FileInputStream/FileOutputStream
* Byte Stream - InputStream - FileInputStream * - OutputStream - FileOutputStream * Char Stream - Reader - BufferedReader * - InputStreamReader * - Writer - OutputStreamWriter
public static void main(String[] args) throws IOException { /*byte bytes[] = {'a','b','c','d'}; OutputStream outputStream = new FileOutputStream("path/stream"); outputStream.write(bytes); outputStream.close();*/ FileOutputStream fileOutputStream = new FileOutputStream("path/stream"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8"); outputStreamWriter.write("Hello"); //實際上寫入到緩衝區,調用flush()/close()後寫入到文件。 //fileOutputStream.close(); //此句可省略,否則報java.io.IOException: Stream Closed outputStreamWriter.close(); //必須要在這裏close,否則可能不寫入 InputStream inputStream = new FileInputStream("path/stream"); /*int size = inputStream.available(); for(int i=0;i<size;i++){ System.out.print((char)inputStream.read()); }*/ /*BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); String s; while( (s=bufferedReader.readLine())!=null) { System.out.print(s); } inputStream.close(); bufferedReader.close();*/ InputStreamReader inputStreamReader = new InputStreamReader(inputStream); int c; while( (c=inputStreamReader.read()) != -1){ System.out.print((char)c); } inputStream.close(); inputStreamReader.close(); }
對代碼的簡單說明:
-
寫入文件列出2種:
- FileOutputStream.write(byte[])
- OutputStreamWriter.write(String)
-
讀取文件列出3種:
- FileInputStream.read() - 返回單字符
- BufferedReader.readLine() - 讀取一行
- InputStreamReader.read() - 返回單字符,-1代表已讀取完畢
-
官網上給出的方法說明:
OutputStreamWriter.close(): Closes the stream, flushing it first.
FileOutputStream.close(): Closes this file output stream and releases any system resources associated with this stream. This file output stream may no longer be used for writing bytes.
運行結果:
(./path/下存在一個stream文件,內容爲Hello)
Hello
-
-
文件I/O:藉助字節流下的ObjectInputStream/ObjectOutputStream
* Byte Stream - InputStream - ObjectInputStream * - FileInputStream * - OutputStream - ObjectOutputStream * - FileOutputStream
public static void main(String[] args) throws Exception { String s = "Hello World"; byte[] bytes = {'e','x','a','m','p','l','e'}; FileOutputStream fileOutputStream = new FileOutputStream("path/objectstream"); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(s); objectOutputStream.writeObject(bytes); objectOutputStream.close(); fileOutputStream.close(); FileInputStream fileInputStream = new FileInputStream("path/objectstream"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); System.out.println((String)objectInputStream.readObject()); byte[] reads = (byte[])objectInputStream.readObject(); for(byte b:reads) { System.out.print((char)b); } objectInputStream.close(); fileInputStream.close(); }
運行結果:
Hello World example
-
目錄操作
public static void main(String[] args) { String dirName = "path/testDir"; File dir = new File(dirName); //創建目錄 //System.out.println(dir.mkdir()?"成功":"失敗"); //讀取目錄 // if(dir.isDirectory()) { // System.out.println("Dir:" + dir.getName()); // String entrys[] = dir.list(); // for(String entry:entrys){ // File file = new File(dir.getName() + "/" + entry); // if(file.isDirectory()) { // System.out.println("Dir -"+file.getName()); // } else { // System.out.println("File -"+file.getName()); // } // } // } //刪除目錄 File[] files = dir.listFiles(); if(files != null) { for(File file:files) { String fileName = file.getName(); if(file.isDirectory()) { //對於目錄,只能刪除空目錄。 System.out.println((file.delete()?"成功刪除目錄":"刪除目錄失敗")+fileName); } else { System.out.println((file.delete()?"成功刪除文件":"刪除文件失敗")+fileName); } } } }
運行結果:
(三塊代碼分別運行,運行時註釋掉其他兩塊)
-
創建目錄(略)
-
讀取目錄
(path/testDir下的目錄結構:
-rw-rw-r-- 1 adam adam 0 Mar 6 12:05 test1 -rw-rw-r-- 1 adam adam 0 Mar 6 12:05 test2 drwxrwxr-x 2 adam adam 4096 Mar 6 11:00 test4/
)
Dir:testDir File -test1 File -test2 File -test4
-
刪除目錄
成功刪除文件test1 成功刪除文件test2 刪除目錄失敗test4
-