I/O流中的字符流的讀取與寫入
(主要用于讀取與寫入文檔文件,可以輕松讀取寫入中文)
為何需要字符流:傳統(tǒng)的字節(jié)流是一個(gè)一個(gè)字節(jié)讀取與寫入的,而一個(gè)漢字是由3個(gè)字節(jié)組成的,當(dāng)用長(zhǎng)度為3以上的數(shù)組時(shí)可以讀取與寫入中文字符,而字符流就可以解決字節(jié)流的這個(gè)弊端。1.在Reader類中有個(gè)InputStreamReader的子類,這個(gè)類有個(gè)read(char[])的方法,可以把文件以字符的形式讀取數(shù)據(jù),一個(gè)中文就代表一個(gè)字符。讀取字符流代碼示例:
public static void test1(){ char ch[]=new char[1024]; try{ InputStream is=new FileInputStream("src/b.txt"); Reader reader=new InputStreamReader(is); int len=0; //表示讀取數(shù)據(jù)的長(zhǎng)度 while((len=reader.read(ch))!=-1){ System.out.PRintln(ch); //打印文件內(nèi)容 } reader.close(); is.close(); }catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}

2.在Writer類中也有個(gè)OutputStreamWritert的子類,這個(gè)類中有個(gè)write()方法,這個(gè)方法帶的參數(shù)可以是String型,可以是int型,也可以是一個(gè)char[]數(shù)組,功能相對(duì)之前強(qiáng)大。寫入字符流代碼示例:
public static void test2(){ try{ OutputStream os=new FileOutputStream("src/c.txt",true); Writer writer=new OutPutStreamWriter(os); writer.write("海賊王"); writer.flush(); writer.close(); }catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}

3.在Reader類中還有個(gè)BufferedReader的子類,調(diào)用這個(gè)類比InputStreamReader的效率高一些,這個(gè)類有個(gè)readLine()方法,這個(gè)方法一次讀取一個(gè)文本行,當(dāng)讀取的文件較大時(shí)效率相對(duì)比較高。代碼示例:
public static void test3(){ try{ InputStream is=new FileInputStream("src/b.txt"); BufferedReader br=new BufferedReader(new InputStreamReader(is)); while(br.ready()){ System.out.println(br.readLine()); //打印行數(shù)據(jù) } br.close(); }catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}
4.同樣,Writer類中還有個(gè)PrintWriter的子類,調(diào)用這個(gè)類比OutputStreamWriter更容易使用,這個(gè)類有print()方法,這個(gè)方法可以帶多種數(shù)據(jù)類型,char、boolean、double、float、String等,而且容易調(diào)用。代碼示例:public static void test4(){ try{ PrintWriter pw=new PrintWriter(new FileOutputStream("src/b.txt",true)); pw.write("海賊王"); pw.close(); }catch (FileNotFoundException e) { e.printStackTrace(); }}
5.再來(lái)一個(gè)Scanner類,Scanner()可以傳入一個(gè)輸入流,還可以設(shè)置編碼格式,而這也是比輸入流的讀取要好的一點(diǎn),調(diào)用也比輸入流的讀取簡(jiǎn)單。代碼示例:public static void test5(){ Scanner sc; try { sc = new Scanner(new FileInputStream("src/b.txt")); while(sc.hasNextLine()){ System.out.println(sc.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); }}
回顧下來(lái),我們的代碼越來(lái)越簡(jiǎn)潔,效率也有所提高。在學(xué)習(xí)的過(guò)程中,我們需要不斷優(yōu)化我們的方法,使我們的代碼更具高效性,安全性,復(fù)用性和健壯性,這也是我們不斷學(xué)習(xí)新方法的原因,如果一開始就從最優(yōu)化,最簡(jiǎn)便的方法學(xué)起,無(wú)從對(duì)比,也就失去學(xué)習(xí)過(guò)程的趣味性與積極性。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注