概述Java SystemClipboard包含额外的字节
我不得不遵循如下设置:Ubuntu 12.04,Mathematica 9和IntelliJIDEA 12.每当我从Mathematica复制一些文本并粘贴到IDEA中时,粘贴文本的末尾会有很多额外的字节。 在IDEA中最先出现的错误现在似乎是Java本身的错误。 我附加了一个显示行为的最小java示例。
因此,当我在Mathematica中键入Plot时,select并复制它,然后运行示例我将得到以下输出,其中第一行是打印的表单,第二行是字节:
正如你所看到的, Plot后面跟着一个0字节,另外一些(不一定是零)字节。 在我所有的testing中,我发现一个有效的解决scheme是使用string,直到find第一个0 ,但这并不能解决潜在的问题。 我真的希望看到这个问题,因为我经常在Mathematica和IntelliJIDEA之间复制代码,但是首先我需要知道该责备谁。
文件复制期间显示的预期时间是最佳时间还是最差时间?
复制和合并不包括某些扩展名的目录
从autoHotKey脚本中复制/粘贴windows上的空文本
保持文本颜色,而复制粘贴窗口从Eclipse到Gmail?
在windows上运行任意subprocess,仍然干净地终止?
题:
我怎么能找出Mathematica或Java是否在这里做错了什么? 我可以将Mathematica内容复制到不同的编辑器,浏览器等,我从来没有见过这样的东西。 另一方面,我从来没有发现IntelliJ(Java)复制垃圾。 什么是一个很好的方式来找出Mathematica是否使用剪贴板错误或Java有一个错误?
最小的例子
在Mathematica中select一些文本,按Ctrl + C并运行以下命令
import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; public class copyPasteTest { public static voID main(String[] args) { final String text; try { final Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); text = (String) systemClipboard.getData(DataFlavor.stringFlavor); System.out.println(text); for (byte a : text.getBytes()) { System.out.print(a + \” \”); } } catch (Exception e) { e.printstacktrace(); } } }
请在评论中提供更多信息
在从Mathematica复制 *** 作之后,可以看看剪贴板中的内容吗?
当然。 不幸的是,它什么都不返回 当我从浏览器标记和复制下面的东西,例如“this here”,我得到
patrick@lenerd:~$ xclip -out | hexdump -C 00000000 74 68 69 73 20 68 65 72 65 |this here| 00000009
编辑
我尝试了以下的东西,我总是使用Mathematica复制的“Plot”string。 首先,我按照他的评论中的build议,尝试了大卫的大型testingclass 。 有了这两个,Oracle JRE和Ubuntu附带的OpenJRE,我得到了以下输出:
=========== Plot[00][7f][00][00] =========== Obtained transferrable of type sun.awt.datatransfer.ClipboardTransferable Plot[00][7f][00][00] ===========
我从上面的短小的狙击手给出了相同的结果(虽然不是在hex表示)。 然后,我尝试了xclip的不同select ,并使用值clipboard带来了以下内容
patrick@lenerd:~$ xclip -o -verbose -selection clipboard | hexdump -C Connected to X server. Using selection: XA_CliPBOARD Using UTF8_STRING. 00000000 50 6c 6f 74 00 00 00 00 |Plot….| 00000008
重要的是要注意,当我不用xclip使用verbose输出时,我只能看到terminal中的“Plot”。 在上面,你会发现缓冲区中可能没有显示4个字节,因为它们以00开始。 此外,额外的字节是00 00 00 00 ,至less这是什么显示。 在java中我们有一个7f (或127 )在第二个位置。
我想这一切都表明,这个错误来自Mathematica,因为它在缓冲区中复制了额外的东西,Java只是有点草率,因为它不会在第一个00切割。
.bat文件在windows XP中复制粘贴文件夹
如何“复制粘贴”像windows一样的文件
你如何将文本从windows中的firefox复制到Unix中的bash shell?
在C#中复制/粘贴事件监听器
C ++:在SIGINT之后继续执行
这些结论听起来不错。
如果找到以下有关X剪贴板行为的参考资料:
X11r6客户端间通信约定手册“ ,特别是” 通过选择方式进行对等通信“ ,以及开发者角落中更为详尽的解释(以及Python测试工具) :在linux中复制粘贴
因此,数据“Plot [00] [7f] [00] [00]”或者“Plot [00] [00] [00] [00]”是Mathematica根据请求向应用程序提供的数据即“读取”剪贴板。 我只能想象,Mathematica说“这是八字节的字符串”,阅读应用程序试图解决这个问题,阅读实际字符数组的末尾。
这也可能是X中的一个BUG(但是Ubuntu 12.04不会使用Mir,所以可能不会)。
请注意,在Java中,字符串不是Nul终止的,“Plot [00] [7f] [00] [00]”确实是一个有效的字符串。
快速浏览一下xclip的源xclip (用yumdownloader –source xclip在我的Fedora上使用yumdownloader –source xclip获得)似乎显示它只是调用XFetchBuffer或memcpy (不完全确定)来获取字节,然后调用fwrite ,所以它会愉快地写输出的Nul。
这看起来像一些问题与字符串结束字符(我有类似的问题与数据修改的c + + DLL的,并通过外部系统发送)。 我不知道如何解决这个问题,但我认为你可以做一个简单的解决方法来删除无效的字符 – 简单的文本调用trim()方法。
text = (String) systemClipboard.getData(DataFlavor.stringFlavor); text = text.trim(); System.out.println(text);
我想,它是零终止的“C风格”的字符串,并有一些Matematica和Java之间的误解。 我会问在linux论坛上的剪贴板应该如何工作。
作为解决方法,我建议
test.replaceFirst(\”u0000(?s:.*)\”,\”\”);
总结
以上是内存溢出为你收集整理的Java SystemClipboard包含额外的字节全部内容,希望文章能够帮你解决Java SystemClipboard包含额外的字节所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容