所以我正在写一个代码,其中有一个txt文件,在三个单独的行中有三个名称。运行代码后,我打开MS Word,该应用程序延迟了1分钟。然后,该代码应该将文件中的所有名称打印到MS Word中。
但是我的代码在做什么,它只是在txt文件中打印了姓氏三次。现在,我已经使用System.out.println()在我的IDE中打印了名称,并且所有名称都已被打印。问题是当机器人在MS Word中键入名称时。谁能解决这个问题?
Scanner sc = new Scanner(br);
String scan = sc.nextLine();
TimeUnit.MINUTES.sleep(1);
while (scan != null) {
System.out.println("I am here");
System.out.println(scan);
scan = "@" + scan;
StringSelection sl = new StringSelection(scan);
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
cb.setContents(sl, sl);
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_SPACE);
if (sc.hasNext()) {
scan = sc.nextLine();
} else {
break;
}
}
所以我的txt文件是这样的
Ned Stark
Arya Stark
Robb Stark
并键入所有这些名称,然后输入了Followig
@Robb Stark
@Robb Stark
@Robb Stark
答案 0 :(得分:3)
在while
循环中再添加1秒的延迟将解决您的问题。
TimeUnit.SECONDS.sleep(1);
这是代码。我做了一些修改。
Scanner sc = new Scanner(new File("D:\\f.txt"));
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Robot robot = new Robot();
TimeUnit.SECONDS.sleep(2); // Increase the initial sleep time if necessary.
while (sc.hasNextLine()) { // use hasNextLine() so you can get rid of the if block at the end of the code
TimeUnit.SECONDS.sleep(1); // added another 1 second sleep
String scan = sc.nextLine();
scan = "@" + scan;
System.out.println(scan);
StringSelection sl = new StringSelection(scan);
cb.setContents(sl, sl);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_SPACE);
}
答案 1 :(得分:2)
您可能等待的时间不够长,无法完成粘贴。您很快就粘贴了三遍。如果需要一段时间才能开始粘贴,则可能在将放在剪贴板中之后开始粘贴。
如果是这种情况,一个简单的解决方案是用所有行填充剪贴板,然后粘贴(假设Scanner
输入不大,占用了您所有的内存)。
您可以使用以下代码(记住import java.awt.datatransfer.StringSelection
):
TimeUnit.MINUTES.sleep(1);
final Scanner scanner = new Scanner(br);
final StringBuilder sb = new StringBuilder();
while (scanner.hasNextLine()) {
sb.append('@');
sb.append(scanner.getLine());
sb.append('\n');
sb.append(' ');
}
final StringSelection text = new StringSelection(sb.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(text, text);
final Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
关于您的代码的一些小注释,忽略了上面的潜在解决方案:
true
,因为nextLine()
从不返回null
(而是使用异常),所以{{ 1}}是scan
吗?null
而不是hasNextLine()
(每个hasNext()
方法都有一个hasNext…()
方法,并且您应该将它们匹配)。 next…()
检查下一个令牌的存在,而不是下一行的存在。