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