march alex's blog
          hello,I am march alex
          posts - 52,comments - 7,trackbacks - 0
          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)編輯 收藏
          僅列出標(biāo)題
          共6頁(yè): 上一頁(yè) 1 2 3 4 5 6 下一頁(yè) 
          主站蜘蛛池模板: 洞口县| 平安县| 嘉祥县| 鱼台县| 阿图什市| 兴化市| 武川县| 达尔| 西宁市| 卫辉市| 洞口县| 高邮市| 仙游县| 涞源县| 枣阳市| 吉林省| 赣州市| 金昌市| 大石桥市| 宣汉县| 和顺县| 珠海市| 晋宁县| 闻喜县| 农安县| 唐河县| 泾源县| 河东区| 台中县| 洪泽县| 天气| 玉田县| 万山特区| 盐山县| 从江县| 岳阳县| 三门县| 泰宁县| 高台县| 云霄县| 吴旗县|