java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字節(jié)流,以下主要介紹字符流。字符流和字節(jié)流的差別以及文件復(fù)制拷貝。在程序中一個(gè)字符等于兩個(gè)字節(jié)。而一個(gè)漢字占倆個(gè)字節(jié)(一般有限面試會(huì)問:一個(gè)char是否能存下一個(gè)漢字,答案當(dāng)然是能了,一個(gè)char和一漢字一樣都占兩個(gè)字節(jié))。一般用字節(jié)流假設(shè)定義為奇數(shù)個(gè)長(zhǎng)度是,那么存儲(chǔ)漢字時(shí)會(huì)有亂碼問題,Java提供了Reader和Writer兩個(gè)專門操作字符流的類。
1 Writer 字符輸出流
? ?此類是抽象類。需用其子類實(shí)現(xiàn)。實(shí)現(xiàn)了Closeable,Flushable, Appendable三個(gè)接口。
? ?有例如以下的方法:
? ?Writer append(char c) 將制定字符加入到writer
? ?void close() 關(guān)閉自流
? ?void flush()刷新改流的緩沖
? ?void write(char[] ?cbuf) 寫入字符數(shù)組
? ?void ?write(char[]?cbuf, int?off, int?len)寫入字符數(shù)組的某一部分。
? ?void write(int c) 寫入單個(gè)字符
? ?void write(String str) 寫入字符串
? ?void ?write(String?str, int?off, int?len)?寫入字符串的某一部分。
?能夠看出 Writer是對(duì)Char[] 和 String字符串操作,而OutputStream是對(duì)byte[]數(shù)組操作。
Writer還能夠向流中追加內(nèi)容。
?以下是Writer的實(shí)例,使用其子類FileWriter實(shí)例化:
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);//第二個(gè)參數(shù)為向文件追加內(nèi)容String str = "hello andy !";//方法一writer.write(str.toCharArray());//方法二//writer.write(str);writer.close();}}?2 Reader 字符輸入流
?Reader也是抽象類,事實(shí)上現(xiàn)了Closeable,Readable接口。
?其主要還有例如以下的方法:
? ?void close() 關(guān)閉字符輸入流
? ? ?int read() ?讀取單個(gè)字符。
?
? ? ?int read(char[] cbuf) ? 將字符讀入數(shù)組。
?
? ? ?abstract ?int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的某一部分。?
? ? ?int read(CharBuffer target) ?試圖將字符讀入指定的字符緩沖區(qū)。
?
? 詳細(xì)實(shí)現(xiàn)例如以下:
??
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("內(nèi)容為:" + new String(c));}}?3 字節(jié)流和字符流的差別
?字節(jié)流和字符流的使用很的相似,字節(jié)流在操作時(shí)本身不會(huì)用到緩沖區(qū)(內(nèi)存),是文件本身的直接操作,而字符流在操作是使用了緩沖區(qū)。通過緩沖區(qū)再操作文件。
字符流必須使用clos()或者flush()將緩沖區(qū)中的流輸出。
而字節(jié)流不關(guān)閉也可以正常輸出。
? ? 其原理例如以下:
? ?字節(jié)流: ? 程序------------------字節(jié)流----------------------文件
? 字符流: ? 程序-------------------字符流----------------------緩存-----------------------------文件
? 那究竟用哪個(gè)好呢?:全部的文件在硬盤或者在傳輸?shù)倪^程中都是以字節(jié)的方式進(jìn)行的,包含圖片等都是按字節(jié)的方式存儲(chǔ)的,而字符是僅僅有在內(nèi)存中才會(huì)形成,所以一般使用字節(jié)流。
3 實(shí)現(xiàn)文件從A復(fù)制復(fù)制到B
? 在cmd 中運(yùn)行 ?java ?FileCopy ?源文件 ? ?目標(biāo)文件
實(shí)現(xiàn)思路: 1 將源文件的內(nèi)容所有讀到內(nèi)存中。并一次性寫入到目標(biāo)文件里。?
? ? ? ? ? ? ? ? ? ? ?2 ?不將源文件的內(nèi)容讀取進(jìn)來,而是採(cǎi)用邊讀邊寫的方式。
我們肯定採(cǎi)用另外一種,假設(shè)一次性將文件讀到內(nèi)存中。必定導(dǎo)致內(nèi)存溢出,影響性能。
詳細(xì)實(shí)現(xiàn)例如以下:
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) {// 推斷文件參數(shù)是否為2System.out.println("文件參數(shù)不對(duì)。");System.out.println("比如:java FileCopy 源文件路徑 目標(biāo)文件路徑");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個(gè) 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流的類關(guān)系例如以下:
?
轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/5182972.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨域调用WebApi
- 下一篇: 火星人乘坐核动力飞船回故乡