2

更新:

有一些很好的解决方案,但我意识到我的前提存在一个问题:一旦进程执行,rt.exec 似乎将无法返回到 java 代码。谢谢你的帮助!


我想以编程方式每秒拍摄一次屏幕截图,每个屏幕截图的标题应该是时间戳。我正在使用 vlc 来实现这一点。

    starttime = System.nanoTime();
    screencapProcess = rt.exec("C:\\VLC\\vlc screen:// --dshow-vdev=screen-capture-recorder --dshow-fps=1 -I dummy --dummy-quiet --rate=1 --video-filter=scene --vout=dummy --scene-format=jpg --scene-ratio=1 --scene-prefix=snap --scene-path=" + path +" --scene-prefix="+ "ScreenCapAt" +   ( String.valueOf(((long)System.nanoTime() - starttime)).substring(9, 14))+" vlc://quit ");

相关部分是:

    String.valueOf(((long)System.nanoTime() - starttime)).substring(9, 14))

这会导致 nanoTimes 小于 1 的索引越界异常。

我不能将“System.nanoTime() - starttime”声明为这一行之外的变量来获取它的长度,因为这会改变我的时间。

有没有办法在一行上获取这个长度未知的未声明变量的最后 5 位数字?

这个答案需要适合我的 rt.exec 行。

一些想法:

  • 按位移位和屏蔽。
  • 连接到我的 .exec
  • 后期处理
  • 创建一个新类
  • 再次调用 System.nanoTime() - starttime 会增加操作时间并取消我的计算。
  • 有没有更好的方法来原子地获取捕获时间?
4

4 回答 4

1

我认为您将不得不在不止一条线路上执行此操作。如果不评估字符串长度,我看不到这样做的方法。这是我能想到的最好的:

String diff = ""+((long)System.nanoTime() - starttime);
String lastfive = diff.substring(Math.max(0, diff.length() - 5));

更新:找到了一种在一行上完成所有操作的方法:

String lastFive = (""+((long)System.nanoTime() - starttime)).replaceAll("(.*)(\\d{5}$)","$2");
于 2013-11-11T07:49:08.067 回答
1

在 1 行中(除了 calc 的声明):

float calc;
String diff = String.valueOf((calc = (long)System.nanoTime() - starttime)).substring(Math.max(0, String.valueOf(calc).length() - 5));
于 2013-11-11T07:57:25.980 回答
0

尝试这个:

 String diff=""+ ((long)System.nanoTime() - starttime);

 if(diff.length() >4){// Check if diff length is less than 5
   String lastFive=diff.substring(diff.length()-5, diff.length());
 }
于 2013-11-11T07:32:46.207 回答
0

尝试:

String diff=""+ ((long)System.nanoTime() - starttime));
String lastFive=  diff.length() > 4 ? 
                 diff.substring(diff.length()-5, diff.length()) : diff;

screencapProcess = rt.exec("C:\\VLC\\vlc screen:// --dshow-vdev=screen-capture-recorder --dshow-fps=1 -I dummy --dummy-quiet --rate=1 --video-filter=scene --vout=dummy --scene-format=jpg --scene-ratio=1 --scene-prefix=snap --scene-path=" + path +" --scene-prefix="+ "ScreenCapAt" +  lastfive +" vlc://quit ");

更新

如果您想重新计算该值,那么我建议您将其放入单独的函数中

    public static void main(String[] args) throws InterruptedException{ 

    long starttime = (long)System.nanoTime(); 
    Thread.sleep(1000); 
    System.out.println("test1 " + getLastFive (starttime)); 
    Thread.sleep(500); 
    System.out.println("test2 " + getLastFive (starttime)); 
    Thread.sleep(1000);
} 

static private String getLastFive (long starttime) {

    String diff=""+ ((long)System.nanoTime() - starttime); 
    String lastFive= diff.length() > 4 ? diff.substring(diff.length()-5, diff.length()) : diff; 
    return lastFive;

}
于 2013-11-11T07:36:50.110 回答