我想通过java编程在Linux终端中处理鼠标事件。我通过c ++和java写了两个程序,他们做同样的过程。
当我使用c ++编程打开和读取文件(“/ dev / input / event3”-mouse事件文件)时,运行可执行文件时没有问题。 (Ubuntu 14.04终端和Ubuntu服务器14.04 --->没问题)。
但是当我使用java编程打开并读取同一个文件时,在Ubuntu 14.04“终端”中运行可执行结果文件“java -jar program.jar”时出现问题。打开文件没有错误,但是读取文件会产生如下错误:
java.io.IOException: Invalid argument at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at eventfileopen.m.main(m.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
但是当我在Ubuntu服务器14.04上运行相同的jar文件时,没有错误,程序运行正常。 我怎么能解决这个问题?(问题=在Ubuntu 14.04上运行java程序没有错误。)我猜这个问题与Ubuntu GUI和JDK有关,但不知道解决它。 我的java程序代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class m {
public static void main(String[] args) {
File f = new File("/dev/input/event3");
FileInputStream is = null;
try {
is = new FileInputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
byte[] bytes = new byte[16];
while(true){
try
{
is.read(bytes);
} catch (IOException e)
{
e.printStackTrace(); //-------> error while run on Ubuntu 14.04 and no error on Ubuntu server
}
System.out.println(Arrays.toString(bytes));
}
}
}
答案 0 :(得分:1)
检查缓冲区大小是否正确。 在最近的Linux内核中,input_event结构的大小依赖于很多东西,但主要依赖于cpu架构。这是它的声明:
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
在32位系统上,您的缓冲区大小很可能被接受(16字节)。
在64位系统上,缓冲区很可能不小于24个字节。原因是timeval结构占用的空间是32位系统的两倍(8个字节)。
我还没有找到一种从Java获取input_event结构大小的可靠方法,而且我个人使用JNI。