Java是一門面向?qū)ο?a target="_blank">編程語(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。
Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、健壯性、安全性、?**立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn)[2] 。Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等
Java的存儲(chǔ)分配模型是它防御惡意代碼的主要方法之一。Java沒(méi)有指針,所以程序員不能得到隱蔽起來(lái)的內(nèi)幕和偽造指針去指向存儲(chǔ)器。更重要的是,Java編譯程序不處理存儲(chǔ)安排決策,所以程序員不能通過(guò)查看聲明去猜測(cè)類的實(shí)際存儲(chǔ)安排。編譯的Java代碼中的存儲(chǔ)引用在運(yùn)行時(shí)由Java解釋程序決定實(shí)際存儲(chǔ)地址。
Java運(yùn)行系統(tǒng)使用字節(jié)碼驗(yàn)證過(guò)程來(lái)保證裝載到網(wǎng)絡(luò)上的代碼不違背任何Java語(yǔ)言限制。這個(gè)安全機(jī)制部分包括類如何從網(wǎng)上裝載。例如,裝載的類是放在分開(kāi)的名字空間而不是局部類,預(yù)防惡意的小應(yīng)用程序用它自己的版本來(lái)代替標(biāo)準(zhǔn)Java類。
Java 字節(jié)流 字符流 轉(zhuǎn)換流
我們知道Java中的流分為字符流和字節(jié)流,其中字符流主要針對(duì)字符文本進(jìn)行處理,而字節(jié)流處理范圍更為廣泛,畢竟圖片、電影等只要是文件都是以二進(jìn)制的形式存在的,而不是字符。
字符流:
FileReader
FileWriter。
BufferedReader
BufferedWriter
字節(jié)流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
我們看一下J2SE文檔:
BufferedReader(Reader in):創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。
可以看出BufferedReader是一個(gè)Reader的子類,構(gòu)造函數(shù)傳進(jìn)來(lái)的是父類Reader類,其實(shí)是裝飾者模式,將父類比較低效的讀取數(shù)據(jù)的方式做成了比較高效的緩沖區(qū)讀取方式。
String readLine():讀取一個(gè)文本行。
它有一個(gè)方法readLine(),直接讀取一行,相對(duì)于父類Reader的read()方法更加方便。
System.in:對(duì)應(yīng)的標(biāo)準(zhǔn)輸入設(shè)備:鍵盤。
static InputStream in :“標(biāo)準(zhǔn)”輸入流。
我們可以寫一個(gè)類來(lái)使用System中的靜態(tài)方法in來(lái)從鍵盤讀取數(shù)據(jù):
?。踛ava] view plain copy《span style=“font-size:18px;”》import java.io.*;
class ReadIn{
public static void main(String[] args) throws IOException{
InputStream inin = System.in; //新建一個(gè)InputStream對(duì)象,讀取位置為鍵盤
StringBuilder sb = new StringBuilder(); //用于存儲(chǔ)讀入的字符,相當(dāng)于自己建了一個(gè)緩存區(qū)
while(true){
int ch = inin.read(); //讀取字節(jié)
if(ch==‘\r’)
continue;
if(ch==‘\n’){
String s = sb.toString();//讀到回車符就轉(zhuǎn)成String,看看是否是“over”,是就退出度數(shù)
if(“over”.equals(s))
break;
else{
System.out.println(s.toUpperCase());//不是“over”的話就不退出,一行讀取完畢,輸出到屏幕上
sb.delete(0,sb.length()); //清空緩存StringBuilder sb
}
}
else
sb.append((char)ch); //如果沒(méi)讀到換行符,就繼續(xù)往緩存StringBuilder里添加讀取的字符
}
}
}《/span》
System的in的類型是InputStream,屬于字節(jié)流,和BufferedReader屬于不同的流類。在InputStream中沒(méi)有readLine()這樣的整行讀取方法,只有read()。
那么能不能直接使用readLine()方法來(lái)完成鍵盤錄入的一行數(shù)據(jù)的讀取呢?
即“能不能將字節(jié)流轉(zhuǎn)成字符流,然后再使用字符流緩沖區(qū)的readLine方法呢”?
可以的!
在字符流中有這樣的字符流:
將字節(jié)流轉(zhuǎn)換成字符流的橋梁——InputStreamReader;
InputStreamReader(InputStream in) :創(chuàng)建一個(gè)使用默認(rèn)字符集的 InputStreamReader。傳入的對(duì)象是InputStream類型,而自己本身是Reader的子類。
將字符流轉(zhuǎn)換成字節(jié)流的橋梁——OutputStreamWriter。
OutputStreamWriter(OutputStream out) :創(chuàng)建使用默認(rèn)字符編碼的 OutputStreamWriter。傳入的對(duì)象是OutputStream類型,而自己本身是Writer的子類。
從名字就可以看出,他們分別屬于(從屬關(guān)系看名字的后半部分)字符流Reader和Writer,他們的功能(功能看名字的前半部分)和字節(jié)流InputStream、OutputStream相關(guān)。
?。踛ava] view plain copy《span style=“font-size:18px;”》import java.io.*;
class TransStreamDemo{
public static void main(String[] args) throws IOException{
InputStream in = System.in; //獲取鍵盤錄入對(duì)象。
InputStreamReader isr = new InputStreamReader(in); //將字節(jié)流對(duì)象轉(zhuǎn)成字符流對(duì)象,使用轉(zhuǎn)換流。InputStreamReader
BufferedReader bufr = new BufferedReader(isr); //為了提高效率,將字符串進(jìn)行緩沖區(qū)技術(shù)高效操作。使用BufferedReader
// BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); //最常見(jiàn)寫法,以后都這樣寫?。?!
OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);
// BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); //同上?。。?/p>
String line = null;
while( ( line = bufr.readLine() ) != null ){
if(“over”.equals(line))
break;
bufw.write(line.toUpperCase()); //bufw將osw包裝了,osw將out包裝了,本例中out是Syetem.out的對(duì)象實(shí)現(xiàn),所以原本用System.out.println的地方直接可以用包裝后的bufw輸出字符串。
bufw.newLine(); //輸出換行符:可以根據(jù)Linux和Windows的不同自動(dòng)輸出\n或\r\n
bufw.flush(); //輸出流有緩沖區(qū),需要flush才輸出來(lái)
}
bufr.close();
}
}《/span》
即——
從文件讀取字符,用FileReader,但是為了讓其讀取更高效,使用BufferedReader將其包裝一下;
從鍵盤讀取數(shù)據(jù),(新建一個(gè)InputStream對(duì)象獲取鍵盤錄入對(duì)象,)用InputStreamReader轉(zhuǎn)換流將InputStream轉(zhuǎn)換,然后用BufferedReader將InputStreamReader包裝。
當(dāng)然InputStream也可以從文件讀取,這個(gè)時(shí)候使用的就不是InputStream in = System.in,而是InputStream in = new FileInputStream(String fileName)。
即:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
和
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(String fileName)));
評(píng)論
查看更多