本文是基於Linux環境運行,讀者閱讀前需要具備一定Linux知識
InputStream包含如下三個方法:
- int read():從輸入流中讀取單個字節,返回所讀取的字節數據(字節數據可直接轉化為int類型)
- int read(byte[] b):從輸入流中最多讀取b.length個字節的數據,並將其存儲在字節數組b中,返回實際讀取的字節數
- int read(byte[] b, int off, int len):從輸入流中最多讀取len個字節的數據,並將其存儲在數組b中;放入數組b中時,並不是從數組起點開始,而是從off位置開始,返回實際讀取的字節數
FileInputStream繼承InputStream,使用FileInputStream讀取文件內容
代碼1-1
import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamTest { public static void main(String[] args) { if (args == null || args.length == 0) { throw new RuntimeException("請輸入路徑"); } FileInputStream fis = null; try { byte[] bbuf = new byte[1024]; int hasRead = 0; fis = new FileInputStream(args[0]); while ((hasRead = fis.read(bbuf)) > 0) { System.out.print(new String(bbuf, 0, hasRead)); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
代碼1-1運行結果:
root@lejian:/home/software/.io# cat text Hello Spring Hello Hibernate Hello MyBatis root@lejian:/home/software/.io# java FileInputStreamTest text Hello Spring Hello Hibernate Hello MyBatis
Reader包含如下三個方法:
- int read():從輸入流中讀取單個字符,返回從讀取的字符數據(字符數據可直接轉化為int類型)
- int read(char cbuf[]):從輸入流中最多讀取cbuf.length個字符的數據,並將其存儲在字符數組的cbuf中,返回實際讀取的字符數
- int read(char cbuf[], int off, int len):從輸入流中最多讀取len個字符的數據,並將其存儲在數組b中;放入數組cbuf中時,並不是從數組起點開始,而是從off位置開始,返回實際讀取的字節數
FileReader的父類繼承自Reader,使用FileReader讀取文件
代碼1-2
import java.io.FileReader; import java.io.IOException; public class FileReaderTest { public static void main(String[] args) { if (args == null || args.length == 0) { throw new RuntimeException("請輸入路徑"); } FileReader fr = null; try { fr = new FileReader(args[0]); char[] cbuf = new char[32]; int hasRead = 0; while ((hasRead = fr.read(cbuf)) > 0) { System.out.print(new String(cbuf, 0, hasRead)); } } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } finally { try { if (fr != null) { fr.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
代碼1-2運行結果:
root@lejian:/home/software/.io# cat text Java編程思想 算法 編譯原理 root@lejian:/home/software/.io# java FileReaderTest text Java編程思想 算法 編譯原理
代碼1-3
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamTest { public static void main(String[] args) { if (args == null || args.length < 2) { throw new RuntimeException("請輸入兩個路徑"); } FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(args[0]); fos = new FileOutputStream(args[1]); byte[] bbuf = new byte[32]; int hasRead = 0; while ((hasRead = fis.read(bbuf)) > 0) { fos.write(bbuf, 0, hasRead); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
OutputStream和Writer:
- void write(int b):將指定的字節/字符輸出到輸出流中,其中c代表字節,也可以代表字符
- void write(byte b[]/char cbuf[]):將字節數組/字符數組中的數據輸出到指定輸出流中
- void write(byte b[]/char cbuf[], int off, int len):將字節數組/字符數組中從off位置開始,長度為len的字節/字符輸出到輸出流中
Writer里還包含如下兩個方法:
- void write(String str):將str字符串里包含的字符輸出到指定輸出流中
- void write(String str, int off, int len):將str字符串里從off位置開始,長度為len的字符輸出到指定的輸出流中
使用FileInputStream來執行輸入,FileOutputStream來執行輸出
代碼1-3運行結果:
root@lejian:/home/software/.io# cat input Java編程思想 算法 編譯原理 root@lejian:/home/software/.io# java FileOutputStreamTest input output root@lejian:/home/software/.io# cat output Java編程思想 算法 編譯原理
使用FileWriter來執行輸出
代碼1-4
import java.io.FileWriter; import java.io.IOException; public class FileWriterTest { public static void main(String[] args) { if (args == null || args.length == 0) { throw new RuntimeException("請輸入路徑"); } FileWriter fw = null; try { fw = new FileWriter(args[0]); fw.write("數據結構與算法\n"); fw.write("Python基礎教程\n"); fw.write("C和指針\n"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (fw != null) { fw.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
代碼1-4運行結果:
root@lejian:/home/software/.io# java FileWriterTest book root@lejian:/home/software/.io# cat book 數據結構與算法 Python基礎教程 C和指針
Java7之后,很多IO資源類都實現了AutoCloseable接口,只要在try語句中聲明的IO流都可以自動關閉,但有一些IO流像FileWriter這樣的輸出流,如果IO流不顯示的關閉,輸出流緩沖區的數據無法flush到實際的物理節點,因為執行IO流的close()方法前,會先執行flush()方法