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