使用java程序读取Ubuntu 14.04鼠标事件文件(/dev/input/event3)时出错
我想通过java编程在Linux终端中处理鼠标事件。我用C++和java编写了两个程序,它们都是相同的程序。使用java程序读取Ubuntu 14.04鼠标事件文件(/dev/input/event3)时出错,java,events,ubuntu,terminal,mouse,Java,Events,Ubuntu,Terminal,Mouse,我想通过java编程在Linux终端中处理鼠标事件。我用C++和java编写了两个程序,它们都是相同的程序。 当我用C++编程打开和读取文件(“/DEV/PID/EVET3”)鼠标事件文件时,运行可执行文件时没有问题。 (Ubuntu 14.04终端和Ubuntu服务器14.04--->没有问题) 但是,当我使用java编程打开和读取同一个文件时,在Ubuntu14.04“terminal”中运行可执行结果文件“java-jar program.jar”时出现了一个问题。打开文件时没有错误,但读
当我用C++编程打开和读取文件(“/DEV/PID/EVET3”)鼠标事件文件时,运行可执行文件时没有问题。 (Ubuntu 14.04终端和Ubuntu服务器14.04--->没有问题)
但是,当我使用java编程打开和读取同一个文件时,在Ubuntu14.04“terminal”中运行可执行结果文件“java-jar program.jar”时出现了一个问题。打开文件时没有错误,但读取文件时会出现如下错误: 但是,当我在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));
}
}
}
检查缓冲区大小是否正确。 在最近的Linux内核中,input_事件结构的大小取决于许多因素,但主要取决于cpu体系结构。声明如下:
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
在32位系统上,很可能接受缓冲区大小(16字节)
在64位系统上,缓冲区很可能不小于24字节。原因是timeval结构占用的空间是32位系统的两倍(多8字节)
我还没有找到一种可靠的方法从Java获取输入事件结构大小,我个人使用JNI来实现这一点。非常感谢。这是事实。
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};