哎,不管怎么樣,下一步還是訂個計劃好了,好好學學java的基礎知識,好好的學習英語。哎...
今天面試題,第一道難住我的就是在不改變主函數和構造函數的情況下如何先輸出系統的虛擬內存。這方面我確實,哎,沒用過啊。其實考的就是兩個關鍵點,一個是用final定義,final就是編譯時已經把結果運算出來,一個是runtime中的函數:java.lang.Runtime.freeMemory();
為難我的第二道題,就是轉換編碼的題,雖然總用,基本都是打好的包,我也看過一眼,之后就沒寫過,到哪都是拷來拷去的,結果面試后忽然想起來了,汗... public static String toGb(String uniStr) {
String gbStr = "";
if (uniStr == null) {
uniStr = "";
}
try {
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = new String(tempByte, "GBK");
}
catch (Exception ex) {
}
return gbStr;
}
public static String toUni(String gbStr) {
String uniStr = "";
if (gbStr == null) {
gbStr = "";
}
try {
byte[] tempByte = gbStr.getBytes("GBK");
uniStr = new String(tempByte, "ISO8859_1");
}
catch (Exception ex) {
}
return uniStr;
}
還有一個就是輸出文件,更暈,我明明自己寫過的,不過,只不過我身邊都有jdk文檔,哎,總是隨時查,郁悶死了。
public String Read(String filePath) throws Exception {
String ret="";
File fl = new File(filePath);
FileReader fileReader = new FileReader(fl);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
while( (line = bufferedReader.readLine()) != null ){
ret =ret + line;
}
return ret;
}
dom和SAX使兩種主流的選擇,還有JDOM,DOM4J做的不錯。
DOM解析器把XML文檔轉化為一個包含其內容的樹,并可以對樹進行遍歷。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然后利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由于使用DOM解析器的時候需要處理整個XML文檔,所以對性能和內存的要求比較高,尤其是遇到很大的XML文件的時候。由于它的遍歷能力,DOM解析器常用于XML文檔需要頻繁的改變的服務中。
例: import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("車牌號碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
SAX解析器采用了基于事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。SAX對內存的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。
例: import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("運行時間:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("車牌號碼:" + new String(ch, start, length));}if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));}}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}}
注意:當xml數據的形式作為傳遞時,要獲取一條條的紀錄是比較適宜于采用dom,雖然它對系統(內存,性能等)有較高的要求,但是一般的服務器都可滿足上G的xml文檔的處理。
當需要對xml的某些內容或某些節點的特定訪問時,或需要一及時地事件相應時,可以用sax來處理。它是基于時間處理機制的,在編程時,通過重載一些事件方法,來獲得對xml文檔的處理。
有關xml的編碼,InputStreamReader和xmlReader的關系:
通常的DOM和SAX對于用ascii編碼的文檔,通過用InputStreamReader讀入xml文檔,后變成了unicode碼,然后不能用
XMlREader來處理,出現錯誤的原因是:遇到無效的unicode的字符。(當你用system.out.println()輸出是沒有任何問題,因為它能自動轉成本地機的編碼)。
解決的方法:
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f),"ISO8859-1"));
這樣就可以限定它的編碼,這樣就沒有問題。
String 的長度問題:String 類型安標準來說沒有長度限制,但是一般jdk中String的最大長度是4G。
String與BufferedString關系:在不涉及到字符串有效的大量處理,通常使用String. BufferedString在處理字符串的大量處理上有優勢