java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字節流,以下主要介紹字符流。字符流和字節流的差別以及文件復制拷貝。在程序中一個字符等于兩個字節。而一個漢字占倆個字節(一般有限面試會問:一個char是否能存下一個漢字,答案當然是能了,一個char和一漢字一樣都占兩個字節)。一般用字節流假設定義為奇數個長度是,那么存儲漢字時會有亂碼問題,Java提供了Reader和Writer兩個專門操作字符流的類。
1 Writer 字符輸出流
? ?此類是抽象類。需用其子類實現。實現了Closeable,Flushable, Appendable三個接口。
? ?有例如以下的方法:
? ?Writer append(char c) 將制定字符加入到writer
? ?void close() 關閉自流
? ?void flush()刷新改流的緩沖
? ?void write(char[] ?cbuf) 寫入字符數組
? ?void ?write(char[]?cbuf, int?off, int?len)寫入字符數組的某一部分。
? ?void write(int c) 寫入單個字符
? ?void write(String str) 寫入字符串
? ?void ?write(String?str, int?off, int?len)?寫入字符串的某一部分。
?能夠看出 Writer是對Char[] 和 String字符串操作,而OutputStream是對byte[]數組操作。
Writer還能夠向流中追加內容。
?以下是Writer的實例,使用其子類FileWriter實例化:
package andy.io.test;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer;/** * @author Zhang,Tianyou * version:2014-11-19 下午4:59:24 * * */public class WriterTest {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("d:" + File.separator + "test.txt");Writer writer = null;writer = new FileWriter(file, true);//第二個參數為向文件追加內容String str = "hello andy !";//方法一writer.write(str.toCharArray());//方法二//writer.write(str);writer.close();}}?2 Reader 字符輸入流
?Reader也是抽象類,事實上現了Closeable,Readable接口。
?其主要還有例如以下的方法:
? ?void close() 關閉字符輸入流
? ? ?int read() ?讀取單個字符。
?
? ? ?int read(char[] cbuf) ? 將字符讀入數組。
?
? ? ?abstract ?int read(char[] cbuf, int off, int len) 將字符讀入數組的某一部分。?
? ? ?int read(CharBuffer target) ?試圖將字符讀入指定的字符緩沖區。
?
? 詳細實現例如以下:
??
package andy.io.test;import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader;/** * @author Zhang,Tianyou * version:2014-11-19 下午5:11:02 * * */public class ReaderTest {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("d:" + File.separator + "test.txt");Reader reader = null;reader = new FileReader(file);char[] c = new char[(int) file.length()];//方法一//reader.read(c);//方法二int temp = 0;int len = 0;while ((temp = reader.read()) != -1) {c[len] = (char) temp;++len;}reader.close();System.out.println("內容為:" + new String(c));}}?3 字節流和字符流的差別
?字節流和字符流的使用很的相似,字節流在操作時本身不會用到緩沖區(內存),是文件本身的直接操作,而字符流在操作是使用了緩沖區。通過緩沖區再操作文件。
字符流必須使用clos()或者flush()將緩沖區中的流輸出。
而字節流不關閉也可以正常輸出。
? ? 其原理例如以下:
? ?字節流: ? 程序------------------字節流----------------------文件
? 字符流: ? 程序-------------------字符流----------------------緩存-----------------------------文件
? 那究竟用哪個好呢?:全部的文件在硬盤或者在傳輸的過程中都是以字節的方式進行的,包含圖片等都是按字節的方式存儲的,而字符是僅僅有在內存中才會形成,所以一般使用字節流。
3 實現文件從A復制復制到B
? 在cmd 中運行 ?java ?FileCopy ?源文件 ? ?目標文件
實現思路: 1 將源文件的內容所有讀到內存中。并一次性寫入到目標文件里。?
? ? ? ? ? ? ? ? ? ? ?2 ?不將源文件的內容讀取進來,而是採用邊讀邊寫的方式。
我們肯定採用另外一種,假設一次性將文件讀到內存中。必定導致內存溢出,影響性能。
詳細實現例如以下:
package andy.io.test;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;/*** @author Zhang,Tianyou version:2014-11-19 下午5:31:21* * */public class FileCopy {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubif (args.length != 2) {// 推斷文件參數是否為2System.out.println("文件參數不對。");System.out.println("比如:java FileCopy 源文件路徑 目標文件路徑");System.exit(1);}File srcfile = new File(args[0]);File objfile = new File(args[1]);if (!srcfile.exists()) {System.out.println("源文件不存在!"); System.exit(1); } InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new FileInputStream(srcfile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { outputStream = new FileOutputStream(objfile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (inputStream != null && outputStream != null) { try { byte[] buff = new byte[1024]; // 每次讀取1024個 int len = 0; while ((len = inputStream.read(buff)) != -1) { outputStream.write(buff, 0, len); } inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
4 Java IO流的類關系例如以下:
?
轉載于:https://www.cnblogs.com/zfyouxi/p/5182972.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨域调用WebApi
- 下一篇: 火星人乘坐核动力飞船回故乡