javap是JDK自帶的反匯編器,可以查看java編譯器為我們生成的字節(jié)碼。通過(guò)它,我們可以對(duì)照源代碼和字節(jié)碼,從而了解很多編譯器內(nèi)部的工作。
語(yǔ)法:
javap [ 命令選項(xiàng) ] class. . .
javap 命令用于解析類文件。其輸出取決于所用的選項(xiàng)。若沒(méi)有使用選項(xiàng),javap 將輸出傳遞給它的類的 public 域及方法。javap 將其輸出到標(biāo)準(zhǔn)輸出設(shè)備上。
命令選項(xiàng)
-help 輸出 javap 的幫助信息。
-l 輸出行及局部變量表。
-b 確保與 JDK 1.1 javap 的向后兼容性。
-public 只顯示 public 類及成員。
-protected 只顯示 protected 和 public 類及成員。
-package 只顯示包、protected 和 public 類及成員。這是缺省設(shè)置。
-private 顯示所有類和成員。
-J[flag] 直接將 flag 傳給運(yùn)行時(shí)系統(tǒng)。
-s 輸出內(nèi)部類型簽名。
-c 輸出類中各方法的未解析的代碼,即構(gòu)成 Java 字節(jié)碼的指令。
-verbose 輸出堆棧大小、各方法的 locals 及 args 數(shù),以及class文件的編譯版本
-classpath[路徑] 指定 javap 用來(lái)查找類的路徑。如果設(shè)置了該選項(xiàng),則它將覆蓋缺省值或 CLASSPATH 環(huán)境變量。目錄用冒號(hào)分隔。
- bootclasspath[路徑] 指定加載自舉類所用的路徑。缺省情況下,自舉類是實(shí)現(xiàn)核心 Java 平臺(tái)的類,位于 jrelib
t.jar 和 jrelibi18n.jar 中。
-extdirs[dirs] 覆蓋搜索安裝方式擴(kuò)展的位置。擴(kuò)展的缺省位置是 jrelibext。
例:
public class Test {
public static void main(String[] args) {
System.out.println("hello world!");
}
}
然后再執(zhí)行以下命令:
javac Test.java
javap -c Test
得到如下結(jié)果:
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 閱讀(337) |
評(píng)論 (2) |
編輯 收藏
在java5中新增加了java.util.Queue接口,用以支持隊(duì)列的常見(jiàn)操作。該接口擴(kuò)展了java.util.Collection接口。
Queue使用時(shí)要盡量避免Collection的add()和remove()方法,而是要使用offer()來(lái)加入元素,使用poll()來(lái)獲取并移出元素。它們的優(yōu)點(diǎn)是通過(guò)返回值可以判斷成功與否,add()和remove()方法在失敗的時(shí)候會(huì)拋出異常。 如果要使用前端而不移出該元素,使用element()或者peek()方法。
值得注意的是LinkedList類實(shí)現(xiàn)了Queue接口,因此我們可以把LinkedList當(dāng)成Queue來(lái)用。
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 閱讀(225) |
評(píng)論 (0) |
編輯 收藏
在之前我寫過(guò)一個(gè)英漢翻譯的java小程序
EnglishChineseTranslater,今天在原來(lái)的基礎(chǔ)上加了一些改進(jìn)。
TranalateMaster類用于翻譯一個(gè)文件內(nèi)的所有單詞。
通過(guò)之前講到的
文件操作進(jìn)行文件內(nèi)容的讀取,再通過(guò)StringTokenizer來(lái)分詞,最后一個(gè)一個(gè)的翻譯。
這里有一個(gè)優(yōu)化,就是通過(guò)HashMap來(lái)去重,這樣可以優(yōu)化文件中一些單詞重復(fù)出現(xiàn)所消耗的時(shí)間。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");
}
}
輸入文件中的內(nèi)容為:
an apple a day,keep healthy a way.
輸出結(jié)果顯示為:
an: 一(在元音字母前代替不定代詞a);一任一某一;一個(gè)
apple: 蘋果;蘋果樹(shù);蘋果公司
a: 一(個(gè));每一(個(gè));任一(個(gè))
day: 一天;白天;時(shí)期;節(jié)日
keep: 保持;保留;遵守;阻止
healthy: 健康的;健全的;大量的;有益于健康的
a: 一(個(gè));每一(個(gè));任一(個(gè))
way: 道路;方法;方向;某方面
posted @
2015-03-04 14:21 marchalex 閱讀(262) |
評(píng)論 (0) |
編輯 收藏
Java IO系統(tǒng)里讀寫文件使用Reader和Writer兩個(gè)抽象類,Reader中read()和close()方法都是抽象方法。Writer中 write(),flush()和close()方法為抽象方法。子類應(yīng)該分別實(shí)現(xiàn)他們。
Java IO已經(jīng)為我們提供了三個(gè)方便的Reader的實(shí)現(xiàn)類,F(xiàn)ileReader,InputStreamReader和BufferedReader。其中最重要的類是InputStreamReader, 它是字節(jié)轉(zhuǎn)換為字符的橋梁。你可以在構(gòu)造器重指定編碼的方式,如果不指定的話將采用底層操作系統(tǒng)的默認(rèn)編碼方式,例如GBK等。
FileReader讀txt文件例子
FileReader fr = new FileReader("D:\\test.txt");
int ch = 0;
while((ch = fr.read())!=-1 ){
System.out.print( (char)ch );
}
其中read()方法返回的是讀取得下個(gè)字符。
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并沒(méi)有什么區(qū)別,事實(shí)上在FileReader中的方法都是從InputStreamReader中繼承過(guò)來(lái)的。 read()方法是比較好費(fèi)時(shí)間的,如果為了提高效率,我們可以使用BufferedReader對(duì)Reader進(jìn)行包裝,這樣可以提高讀取得速度,我們可以一行一行的讀取文本,使用 readLine()方法。
BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
當(dāng)你明白了如何用Reader來(lái)讀取文本文件的時(shí)候那么用Writer寫文件同樣非常簡(jiǎn)單。有一點(diǎn)需要注意,當(dāng)你寫文件的時(shí)候,為了提高效率,寫入的數(shù)據(jù)會(huì)先放入緩沖區(qū),然后寫入文件。因此有時(shí)候你需要主動(dòng)調(diào)用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();
如果想在文件末尾追加內(nèi)容,聲明加個(gè)true就加一個(gè)"true"就可以了:
FileWriter fw = new FileWriter("log.txt",true);
下面是一個(gè)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();
}
最后寫的程序用于簡(jiǎn)單的文件讀寫操作。FileHelper類中的readFile方法用于讀取文件內(nèi)容,writeFile方法用于向文件中寫入內(nèi)容。
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 閱讀(282) |
評(píng)論 (0) |
編輯 收藏
通過(guò)對(duì)
金山在線詞典的分析,我發(fā)現(xiàn)在他的詞庫(kù)里有的單詞的url都是以"http://www.iciba.com/" + 單詞 的形式出現(xiàn)的。
在之前我寫過(guò)一個(gè)
獲得網(wǎng)頁(yè)源代碼的代碼,我在此基礎(chǔ)上寫了一個(gè)獲得英文單詞在iciba上面的獲得單詞翻譯的程序,那么接下來(lái)先要查單詞就可以不用打開(kāi)瀏覽器那么麻煩了。
getWordName函數(shù)用于獲得單詞對(duì)應(yīng)的實(shí)際單詞,因?yàn)楹苡锌赡芪乙榈膯卧~實(shí)際上是沒(méi)有的,那么他就會(huì)跳轉(zhuǎn)到另一個(gè)和這個(gè)單詞表交響的單詞的url上。
getTranslation函數(shù)用于獲得單詞的中文翻譯。
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));這句話最后添加的"utf-8"解決了獲取網(wǎng)頁(yè)源代碼里面的中文亂碼問(wèn)題。
代碼:
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"解決中文亂碼問(wèn)題
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"解決中文亂碼問(wèn)題
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 閱讀(240) |
評(píng)論 (0) |
編輯 收藏
之前我在ScreenDemo類中用generateSnapshot()方法實(shí)現(xiàn)了對(duì)
當(dāng)前屏幕的截圖,這里在原來(lái)的基礎(chǔ)上增加了printPointRGB方法用于獲取屏幕上的某一點(diǎn)的
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 坐標(biāo)。
* @param y 圖像上指定像素位置的 y 坐標(biāo)。
* @return 返回包含 rgb 顏色分量值的數(shù)組。元素 index 由小到大分別對(duì)應(yīng) 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轉(zhuǎn)換為16進(jìn)制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 閱讀(1971) |
評(píng)論 (0) |
編輯 收藏
Java JDK1.4 的Robot對(duì)象可以完成對(duì)"屏幕"像素的拷貝,完成屏幕圖像截取操作。Java應(yīng)用程序中可以直接調(diào)用此對(duì)象,完成對(duì)特定應(yīng)用程序的屏幕截取。
在Java JDK1.4 中提供的"機(jī)器人"Robot類用于產(chǎn)生與本地操作系統(tǒng)有關(guān)的底層輸入、測(cè)試應(yīng)用程序運(yùn)行或自動(dòng)控制應(yīng)用程序運(yùn)行。Robot類提供了一個(gè)方法:createScreenCapture(..),可以直接將全屏幕或某個(gè)屏幕區(qū)域的像素拷貝到一個(gè)BufferedImage對(duì)象中,我們只需要將該對(duì)象寫入到一個(gè)圖像文件之中,就完成了屏幕到圖像的拷貝過(guò)程。
ScreenDemo類的generateSnapshot()方法用于實(shí)現(xiàn)對(duì)當(dāng)前屏幕的截取。
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 閱讀(267) |
評(píng)論 (0) |
編輯 收藏
Java SDK 1.3以后實(shí)現(xiàn)了Robot類。此類用于為測(cè)試自動(dòng)化、自運(yùn)行演示程序和其他需要控制鼠標(biāo)和鍵盤的應(yīng)用程序生成本機(jī)系統(tǒng)輸入事件。Robot 的主要目的是便于 Java 平臺(tái)實(shí)現(xiàn)自動(dòng)測(cè)試。
使用該類生成輸入事件與將事件發(fā)送到 AWT 事件隊(duì)列或 AWT 組件的區(qū)別在于:事件是在平臺(tái)的本機(jī)輸入隊(duì)列中生成的。例如,Robot.mouseMove 將實(shí)際移動(dòng)鼠標(biāo)光標(biāo),而不是只生成鼠標(biāo)移動(dòng)事件。
Robot中主要的鼠標(biāo)和鍵盤控制方法有:
void keyPress(int keycode) 按下給定的鍵。
void keyRelease(int keycode) 釋放給定的鍵。
void mouseMove(int x, int y) 將鼠標(biāo)指針移動(dòng)到給定屏幕坐標(biāo)。
void mousePress(int buttons) 按下一個(gè)或多個(gè)鼠標(biāo)按鈕。
void mouseRelease(int buttons) 釋放一個(gè)或多個(gè)鼠標(biāo)按鈕。
void mouseWheel(int wheelAmt) 在配有滾輪的鼠標(biāo)上旋轉(zhuǎn)滾輪。
下面是一個(gè)簡(jiǎn)單的示例
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 閱讀(402) |
評(píng)論 (0) |
編輯 收藏
FileCreate類的createFile方法用于創(chuàng)建一個(gè)新文件。
file.mkdirs()方法可用于地柜的創(chuàng)建目錄。
main方法用于測(cè)試。
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 閱讀(113) |
評(píng)論 (0) |
編輯 收藏
目前做到能分析POJ和HDU的代碼。ZOJ的話因?yàn)樗鎯?chǔ)用戶的方式是一個(gè)數(shù)字序列,而不是用戶的id,所以暫時(shí)沒(méi)有想到解決方案。
這里用到了之前提到的獲取網(wǎng)頁(yè)源代碼的
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 閱讀(234) |
評(píng)論 (0) |
編輯 收藏