因为工作的需要,有时候会自己手动写一些简单的代码,辅助完成一些比较机械的事情!下面是我写一个利用Robot类完成复制粘贴合成文本的小程序,编译通过,也能运行,就是运行的结果是不可预期的,比如说,可能第一次完成了20次循环,但第二次再次运行的时候就只能完成10次循环就抛出Exception了!比较抓狂,与剪贴板的交互第一次用,实在不知道哪儿出错了!
我是在记事本里敲的代码,可能会比较乱,高手见谅,恳请大大们来指点下迷津!
import java.io.*;
import java.awt.datatransfer.*;
import java.awt.*;
import java.awt.event.*;public class DictRobot{
  public static void main(String[] args){
    try{
    FileOutputStream dict = new FileOutputStream("output.txt",true);
    OutputStreamWriter wDict = new OutputStreamWriter(dict,"Unicode");
    BufferedWriter bufWDict = new BufferedWriter(wDict);    Thread.sleep(5000);    Robot dictRobot = new Robot();
    
    for(int i=1;i<=3714;i++){    dictRobot.keyPress(KeyEvent.VK_F9);//F9快捷键完成复制
    dictRobot.keyRelease(KeyEvent.VK_F9);// -------------------------------------------------------   
//以下剪贴板代码是我从网上找的,不是很清楚其中的原理
//--------------------------------------------------------
    Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable contents = clipBoard.getContents(clipBoard);//此处的参数原来是用this关键字的
    DataFlavor flavor = DataFlavor.stringFlavor;
    if( contents.isDataFlavorSupported(flavor)){
       String str;
       str=(String)contents.getTransferData(flavor); 
       System.out.println("i got here"+i);
       bufWDict.write("##"+str+"\r\n");
     }
    
     dictRobot.keyPress(KeyEvent.VK_DOWN);//选择下一行
     }     
     bufWDict.close();
     wDict.close();
     dict.close();
    }
  catch(FileNotFoundException e){System.out.println("File Not Found Error");}
  catch(IOException e){System.out.println("IOException Error");}
  catch(Exception e){System.out.println("Exception");}
 }
}

解决方案 »

  1.   

    补充一下,将这一行“dictRobot.keyPress(KeyEvent.VK_DOWN);//选择下一行”注释掉之后,即每次的复制都是复制的同一段文本内容,运行结果也是不可预期的,每一次抛出异常的循环数都是不可预期的,有时候是100,有时候是60,有时候20不到就抛出异常,怎么回事呢?
      

  2.   

    补充下,我把捕捉异常的catch语句修改了一下,修改成:
      catch(FileNotFoundException e){System.out.println("File Not Found Error");}
      catch(IOException e){System.out.println("IOException Error");}
      catch(HeadlessException e){System.out.println("鼠标键盘不支持 Error");}
      catch(IllegalStateException e){System.out.println("剪贴板不可用 Error");}
      catch(AWTException e){System.out.println("创建机器人 Error");}
      catch(InterruptedException e){System.out.println("中断 Error");}
      catch(UnsupportedFlavorException e){System.out.println("不支持请求的数据 flavor Error");}运行之后的异常提示,是“剪贴板不可用”,有高手指点下是怎么回事吗?是复制不到数据?还是WINDOWS系统的原因呀~~
      

  3.   

    public Transferable getContents(Object requestor)    Returns a transferable object representing the current contents of the clipboard. If the clipboard currently has no contents, it returns null. The parameter Object requestor is not currently used. The method throws IllegalStateException if the clipboard is currently unavailable. For example, on some platforms, the system clipboard is unavailable while it is accessed by another application. 该方法返回可能Null或抛IllegalStateException异常
    抛IllegalStateException异常---可能“剪贴板”正在拷贝你复制的内容的操作还没有完成、你的程序就要求开始使用“剪贴板”获得拷贝的内容、解决办法是使用“线程同步”、拷贝完成激活另一线程取得“剪贴板”的内容