javap是JDK自帶的反匯編器,可以查看java編譯器為我們生成的字節(jié)碼。通過它,我們可以對照源代碼和字節(jié)碼,從而了解很多編譯器內部的工作。
語法:
javap [ 命令選項 ] class. . .
javap 命令用于解析類文件。其輸出取決于所用的選項。若沒有使用選項,javap 將輸出傳遞給它的類的 public 域及方法。javap 將其輸出到標準輸出設備上。
命令選項
-help 輸出 javap 的幫助信息。
-l 輸出行及局部變量表。
-b 確保與 JDK 1.1 javap 的向后兼容性。
-public 只顯示 public 類及成員。
-protected 只顯示 protected 和 public 類及成員。
-package 只顯示包、protected 和 public 類及成員。這是缺省設置。
-private 顯示所有類和成員。
-J[flag] 直接將 flag 傳給運行時系統(tǒng)。
-s 輸出內部類型簽名。
-c 輸出類中各方法的未解析的代碼,即構成 Java 字節(jié)碼的指令。
-verbose 輸出堆棧大小、各方法的 locals 及 args 數(shù),以及class文件的編譯版本
-classpath[路徑] 指定 javap 用來查找類的路徑。如果設置了該選項,則它將覆蓋缺省值或 CLASSPATH 環(huán)境變量。目錄用冒號分隔。
- bootclasspath[路徑] 指定加載自舉類所用的路徑。缺省情況下,自舉類是實現(xiàn)核心 Java 平臺的類,位于 jrelib
t.jar 和 jrelibi18n.jar 中。
-extdirs[dirs] 覆蓋搜索安裝方式擴展的位置。擴展的缺省位置是 jrelibext。
例:
public class Test {
public static void main(String[] args) {
System.out.println("hello world!");
}
}
然后再執(zhí)行以下命令:
javac Test.java
javap -c Test
得到如下結果:
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/
io/PrintStream;
3: ldc #3 // String hello world!
5: invokevirtual #4 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
8: return
}
posted @
2015-03-05 14:25 marchalex 閱讀(335) |
評論 (2) |
編輯 收藏
在java5中新增加了java.util.Queue接口,用以支持隊列的常見操作。該接口擴展了java.util.Collection接口。
Queue使用時要盡量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來獲取并移出元素。它們的優(yōu)點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會拋出異常。 如果要使用前端而不移出該元素,使用element()或者peek()方法。
值得注意的是LinkedList類實現(xiàn)了Queue接口,因此我們可以把LinkedList當成Queue來用。
import java.util.LinkedList;
import java.util.Queue;
public class QueueSample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<String>();
queue.offer("Hello ");
queue.offer("World!");
System.out.println(queue.size());
String str;
while((str=queue.poll())!=null){
System.out.print(str);
}
System.out.println();
System.out.println(queue.size());
}
}
posted @
2015-03-05 10:32 marchalex 閱讀(223) |
評論 (0) |
編輯 收藏
在之前我寫過一個英漢翻譯的java小程序
EnglishChineseTranslater,今天在原來的基礎上加了一些改進。
TranalateMaster類用于翻譯一個文件內的所有單詞。
通過之前講到的
文件操作進行文件內容的讀取,再通過StringTokenizer來分詞,最后一個一個的翻譯。
這里有一個優(yōu)化,就是通過HashMap來去重,這樣可以優(yōu)化文件中一些單詞重復出現(xiàn)所消耗的時間。translateAll函數(shù)翻譯并直接輸出,translateAllLocal函數(shù)翻譯并保存到本地。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.StringTokenizer;
public class TranslateMaster {
private static HashMap<String, String> map = null;
public static void getWords(String filename) throws Exception {
map = new HashMap<String, String>();
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line = null;
while((line = reader.readLine()) != null){
StringTokenizer st = new StringTokenizer(line, ",.-!? \t");
while(st.hasMoreElements()) {
String key = st.nextToken();
if(map.containsKey(key) == false) {
try {
String value = EnglishChineseTranslater.getWordName(key) + ": " + EnglishChineseTranslater.getTranslation(key);
map.put(key, value);
} catch (Exception e) {
continue;
}
}
}
}
reader.close();
}
public static void translateAll(String filename) throws Exception {
getWords(filename);
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line = null;
while((line = reader.readLine()) != null){
StringTokenizer st = new StringTokenizer(line, ",.-!? \t");
while(st.hasMoreElements()) {
String key = st.nextToken();
System.out.println(map.get(key));
}
}
reader.close();
}
public static void translateAllLocal(String inputfilename, String outputfilename) throws Exception {
getWords(inputfilename);
BufferedReader reader = new BufferedReader(new FileReader(inputfilename));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputfilename));
String line = null;
while((line = reader.readLine()) != null){
StringTokenizer st = new StringTokenizer(line, ",.-!? \t");
while(st.hasMoreElements()) {
String key = st.nextToken();
writer.write(map.get(key) + "\r\n");
//System.out.println(map.get(key));
}
}
writer.close();
reader.close();
}
public static void main(String[] args) throws Exception {
translateAll("D:\\test.txt");
translateAllLocal("D:\\test.txt", "D:\\output.txt");
}
}
輸入文件中的內容為:
an apple a day,keep healthy a way.
輸出結果顯示為:
an: 一(在元音字母前代替不定代詞a);一任一某一;一個
apple: 蘋果;蘋果樹;蘋果公司
a: 一(個);每一(個);任一(個)
day: 一天;白天;時期;節(jié)日
keep: 保持;保留;遵守;阻止
healthy: 健康的;健全的;大量的;有益于健康的
a: 一(個);每一(個);任一(個)
way: 道路;方法;方向;某方面
posted @
2015-03-04 14:21 marchalex 閱讀(260) |
評論 (0) |
編輯 收藏
Java IO系統(tǒng)里讀寫文件使用Reader和Writer兩個抽象類,Reader中read()和close()方法都是抽象方法。Writer中 write(),flush()和close()方法為抽象方法。子類應該分別實現(xiàn)他們。
Java IO已經為我們提供了三個方便的Reader的實現(xiàn)類,F(xiàn)ileReader,InputStreamReader和BufferedReader。其中最重要的類是InputStreamReader, 它是字節(jié)轉換為字符的橋梁。你可以在構造器重指定編碼的方式,如果不指定的話將采用底層操作系統(tǒng)的默認編碼方式,例如GBK等。
FileReader讀txt文件例子
FileReader fr = new FileReader("D:\\test.txt");
int ch = 0;
while((ch = fr.read())!=-1 ){
System.out.print( (char)ch );
}
其中read()方法返回的是讀取得下個字符。
InputStreamReader讀txt文件例子
InputStream is = new FileInputStream(new File("D:\\test.txt"));
InputStreamReader reader = new InputStreamReader(is);
int ch = 0;
while((ch = reader.read())!=-1 ){
System.out.print((char)ch);
}
這和FileReader并沒有什么區(qū)別,事實上在FileReader中的方法都是從InputStreamReader中繼承過來的。 read()方法是比較好費時間的,如果為了提高效率,我們可以使用BufferedReader對Reader進行包裝,這樣可以提高讀取得速度,我們可以一行一行的讀取文本,使用 readLine()方法。
BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
當你明白了如何用Reader來讀取文本文件的時候那么用Writer寫文件同樣非常簡單。有一點需要注意,當你寫文件的時候,為了提高效率,寫入的數(shù)據(jù)會先放入緩沖區(qū),然后寫入文件。因此有時候你需要主動調用flush()方法。
有讀就有寫,寫文本文件可以使用PrintWriter,F(xiàn)ileWriter,BufferedWriter。
FileWriter fw = new FileWriter("D:\\test01.txt");
String s = "hello world!\n";
fw.write(s,0,s.length());
fw.flush();
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\test02.txt"));
osw.write(s,0,s.length());
osw.flush();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("D:\\test03.txt")),true);
pw.println(s);
fw.close();
osw.close();
pw.close();
如果想在文件末尾追加內容,聲明加個true就加一個"true"就可以了:
FileWriter fw = new FileWriter("log.txt",true);
下面是一個BufferedWriter的例子:
File file = new File("D:\\test.txt");
File dest = new File("D:\\test01.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
BufferedWriter writer = new BufferedWriter(new FileWriter(dest));
String line = reader.readLine();
while(line!=null){
writer.write(line);
line = reader.readLine();
}
writer.flush();
reader.close();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
最后寫的程序用于簡單的文件讀寫操作。FileHelper類中的readFile方法用于讀取文件內容,writeFile方法用于向文件中寫入內容。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class FileHelper {
public static String readFile(String filename) throws Exception {
BufferedReader reader = new BufferedReader(new FileReader(filename));
String ans = "", line = null;
while((line = reader.readLine()) != null){
ans += line + "\r\n";
}
reader.close();
return ans;
}
public static void writeFile(String content, String filename) throws Exception {
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
writer.write(content);
writer.flush();
writer.close();
}
public static void main(String[] args) throws Exception {
String ans = readFile("D:\\input.txt");
writeFile(ans, "D:\\output.txt");
}
}
posted @
2015-03-04 13:26 marchalex 閱讀(280) |
評論 (0) |
編輯 收藏
通過對
金山在線詞典的分析,我發(fā)現(xiàn)在他的詞庫里有的單詞的url都是以"http://www.iciba.com/" + 單詞 的形式出現(xiàn)的。
在之前我寫過一個
獲得網頁源代碼的代碼,我在此基礎上寫了一個獲得英文單詞在iciba上面的獲得單詞翻譯的程序,那么接下來先要查單詞就可以不用打開瀏覽器那么麻煩了。
getWordName函數(shù)用于獲得單詞對應的實際單詞,因為很有可能我要查的單詞實際上是沒有的,那么他就會跳轉到另一個和這個單詞表交響的單詞的url上。
getTranslation函數(shù)用于獲得單詞的中文翻譯。
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));這句話最后添加的"utf-8"解決了獲取網頁源代碼里面的中文亂碼問題。
代碼:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class EnglishChineseTranslater {
public static String getWordName(String word) throws Exception {
String urlString = "http://www.iciba.com/" + word;
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));//"utf-8"解決中文亂碼問題
String line;
String ans = "";
for(int i=0;i<8;i++) reader.readLine();
line = reader.readLine();
int len = line.length();
for(int i=len-4;i > 0 && line.charAt(i) != '/';i--)
ans = line.charAt(i) + ans;
return ans;
}
public static String getTranslation(String word) throws Exception {
String urlString = "http://www.iciba.com/" + word;
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));//"utf-8"解決中文亂碼問題
String line;
String ans = "";
while ((line = reader.readLine()) != null){
line = line.trim();
if(line.equals("<span class=\"label_list\">")) {
while((line = reader.readLine()) != null) {
line = line.trim();
if(false == line.substring(0, 7).equals("<label>"))
break;
line = line.substring(7, line.length()-8);
//System.out.println(line);
ans += line;
}
break;
}
}
return ans;
}
public static void main(String[] args) throws Exception {
String word = "apple";
String trueWord = getWordName(word);
String translation = getTranslation(word);
System.out.println(trueWord + ": " + translation);
}
}
posted @
2015-03-03 17:11 marchalex 閱讀(239) |
評論 (0) |
編輯 收藏
之前我在ScreenDemo類中用generateSnapshot()方法實現(xiàn)了對
當前屏幕的截圖,這里在原來的基礎上增加了printPointRGB方法用于獲取屏幕上的某一點的
RGB。
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ScreenDemo {
public static File generateSnapshot() {
//File snapshotFile = new File("D:/" + System.currentTimeMillis() + ".jpg");
File snapshotFile = new File("D:/snapshot.jpg");
int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
try {
Robot robot;
robot = new Robot();
BufferedImage image = robot.createScreenCapture(new Rectangle(width, height));
ImageIO.write(image, "jpg", snapshotFile);
} catch (Exception e) {
e.printStackTrace();
}
return snapshotFile;
}
/**
* 取得圖像上指定位置像素的 rgb 顏色分量。
*
* @param image 源圖像。
* @param x 圖像上指定像素位置的 x 坐標。
* @param y 圖像上指定像素位置的 y 坐標。
* @return 返回包含 rgb 顏色分量值的數(shù)組。元素 index 由小到大分別對應 r,g,b。
*/
public static int[] getRGB(BufferedImage image, int x, int y) {
int[] rgb = null;
if (image != null && x < image.getWidth() && y < image.getHeight()) {
rgb = new int[3];
int pixel = image.getRGB(x, y);
rgb[0] = (pixel & 0xff0000) >> 16;
rgb[1] = (pixel & 0xff00) >> 8;
rgb[2] = (pixel & 0xff);
}
return rgb;
}
/**
* 將RGB轉換為16進制Hex
*
* @param r red顏色分量
* @param g green顏色分量
* @param b blue顏色分量
* @return
*/
public static String toHex(int r, int g, int b) {
return "#" + toHexValue(r) + toHexValue(g) + toHexValue(b);
}
private static String toHexValue(int number) {
StringBuilder builder = new StringBuilder(Integer.toHexString(number & 0xff));
while (builder.length() < 2) {
builder.append("0");
}
return builder.toString().toUpperCase();
}
public static void printPointRGB(int x, int y) {
try {
BufferedImage bi = ImageIO.read(new File("D:/snapshot.jpg"));
int[] rgb = getRGB(bi, x, y);
Color color = new Color(rgb[0], rgb[1], rgb[2]);
System.out.println("red = " + color.getRed());
System.out.println("green = " + color.getGreen());
System.out.println("blue = " + color.getBlue());
System.out.println("hex = " + toHex(color.getRed(), color.getGreen(), color.getBlue()));
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
generateSnapshot();
printPointRGB(100, 100);
}
}
posted @
2015-02-22 22:12 marchalex 閱讀(1968) |
評論 (0) |
編輯 收藏
Java JDK1.4 的Robot對象可以完成對"屏幕"像素的拷貝,完成屏幕圖像截取操作。Java應用程序中可以直接調用此對象,完成對特定應用程序的屏幕截取。
在Java JDK1.4 中提供的"機器人"Robot類用于產生與本地操作系統(tǒng)有關的底層輸入、測試應用程序運行或自動控制應用程序運行。Robot類提供了一個方法:createScreenCapture(..),可以直接將全屏幕或某個屏幕區(qū)域的像素拷貝到一個BufferedImage對象中,我們只需要將該對象寫入到一個圖像文件之中,就完成了屏幕到圖像的拷貝過程。
ScreenDemo類的generateSnapshot()方法用于實現(xiàn)對當前屏幕的截取。
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class ScreenDemo {
public static File generateSnapshot() {
File snapshotFile = new File("D:/" + System.currentTimeMillis() + ".jpg");
int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
try {
Robot robot;
robot = new Robot();
BufferedImage image = robot.createScreenCapture(new Rectangle(width, height));
ImageIO.write(image, "jpg", snapshotFile);
} catch (Exception e) {
e.printStackTrace();
}
return snapshotFile;
}
public static void main(String[] args) {
generateSnapshot();
}
}
posted @
2015-02-22 21:52 marchalex 閱讀(266) |
評論 (0) |
編輯 收藏
Java SDK 1.3以后實現(xiàn)了Robot類。此類用于為測試自動化、自運行演示程序和其他需要控制鼠標和鍵盤的應用程序生成本機系統(tǒng)輸入事件。Robot 的主要目的是便于 Java 平臺實現(xiàn)自動測試。
使用該類生成輸入事件與將事件發(fā)送到 AWT 事件隊列或 AWT 組件的區(qū)別在于:事件是在平臺的本機輸入隊列中生成的。例如,Robot.mouseMove 將實際移動鼠標光標,而不是只生成鼠標移動事件。
Robot中主要的鼠標和鍵盤控制方法有:
void keyPress(int keycode) 按下給定的鍵。
void keyRelease(int keycode) 釋放給定的鍵。
void mouseMove(int x, int y) 將鼠標指針移動到給定屏幕坐標。
void mousePress(int buttons) 按下一個或多個鼠標按鈕。
void mouseRelease(int buttons) 釋放一個或多個鼠標按鈕。
void mouseWheel(int wheelAmt) 在配有滾輪的鼠標上旋轉滾輪。
下面是一個簡單的示例
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class KeyController implements Runnable {
private Dimension dim;
private Robot robot;
private volatile boolean stop = false;
public KeyController() {
dim = Toolkit.getDefaultToolkit().getScreenSize();
System.out.println("computer imformation:\n" + "width:"+dim.width+"\theight:"+dim.height);
try {
robot = new Robot();
} catch (AWTException ex) {
ex.printStackTrace();
}
}
public void run() {
while(!stop) {
robot.mousePress(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void stop() {
stop = true;
}
public static void main(String[] args) {
MouseController kc = new MouseController();
Thread kcThread = new Thread(kc);
System.out.println("Key Controller start");
kcThread.start();
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
kc.stop();
System.out.println("Mouse Controller stoped");
}
}
posted @
2015-02-21 23:09 marchalex 閱讀(400) |
評論 (0) |
編輯 收藏
FileCreate類的createFile方法用于創(chuàng)建一個新文件。
file.mkdirs()方法可用于地柜的創(chuàng)建目錄。
main方法用于測試。
import java.io.File;
import java.io.IOException;
public class FileCreate {
public static void createFile(String path, String filename) throws Exception {
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
file = new File(path, filename);
if(!file.exists()) {
file.createNewFile();
}
}
public static void main(String[] args) throws Exception {
createFile("D:\\test", "hello.txt");
}
}
posted @
2015-02-13 14:38 marchalex 閱讀(112) |
評論 (0) |
編輯 收藏
目前做到能分析POJ和HDU的代碼。ZOJ的話因為他存儲用戶的方式是一個數(shù)字序列,而不是用戶的id,所以暫時沒有想到解決方案。
這里用到了之前提到的獲取網頁源代碼的
URLAnalysis類。
getPOJSolved方法用于獲得POJ上的解題數(shù);
getHDUSolved方法用于獲得HDU上的解題數(shù);
names數(shù)組存放感興趣的用戶。
代碼如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class OnlineJudgeFinder {
private static String[] names = {"watashi", "hanfei19910905", "marchalex"};
public static String getPOJSolved(String userId) throws Exception {
String urlString = "http://poj.org/userstatus?user_id=" + userId;
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line = null;
for(int i=0;i<10;i++)
line = reader.readLine();
int len = line.length();
int i , cnt = 0;
for(i=0;i<len;i++) {
if(line.charAt(i) == '>') {
cnt ++;
if(cnt == 2)
break;
}
}
i ++;
String num = "";
while(i < len && line.charAt(i) >= '0' && line.charAt(i) <= '9') {
num += line.charAt(i);
i ++;
}
return num;
}
public static String getHDUSolved(String userId) throws Exception {
String urlString = "http://acm.hdu.edu.cn/userstatus.php?user=" + userId;
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line = null;
for(int i=0;i<105;i++)
line = reader.readLine();
int len = line.length();
int i , cnt = 0;
for(i=0;i<len;i++) {
if(line.charAt(i) == '>') {
cnt ++;
if(cnt == 4)
break;
}
}
i ++;
String num = "";
while(i < len && line.charAt(i) >= '0' && line.charAt(i) <= '9') {
num += line.charAt(i);
i ++;
}
return num;
}
public static void getResult() throws Exception {
int n = names.length;
for(int i=0;i<n;i++) {
String name = names[i];
System.out.println(name + " has solved ");
System.out.println("\t" + getPOJSolved(name) + " problem(s) in POJ");
System.out.println("\t" + getHDUSolved(name) + " problem(s) in HDU");
}
}
public static void main(String[] args) throws Exception {
getResult();
}
}
效果如下:
watashi has solved
32 problem(s) in POJ
7 problem(s) in HDU
hanfei19910905 has solved
131 problem(s) in POJ
212 problem(s) in HDU
marchalex has solved
1 problem(s) in POJ
15 problem(s) in HDU
posted @
2015-02-13 13:30 marchalex 閱讀(232) |
評論 (0) |
編輯 收藏