使用java programmig读取Ubuntu 14.04鼠标事件文件(/ dev / input / event3)时出错

时间:2015-06-19 07:22:23

标签: java events ubuntu terminal mouse

我想通过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));
        }
    }
}

1 个答案:

答案 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。