Есть ли кроссплатформенный способ обработки именованных каналов в Java или мне следует написать свой собственный?

Я пишу немного кода JNI, где DLL, работающая в пространстве процессов различных процессов в системе, должна взаимодействовать с Java-процессом. Я решил использовать для этого именованные каналы (по разным причинам) после взвешивания общих mem / sockets / rpc и т. Д. Мой вопрос: есть ли хороший способ обработки именованных каналов в Java, или я должен написать его?


person Benj    schedule 03.11.2009    source источник


Ответы (2)


Предполагая, что вы работаете в Unix, не можете ли вы просто создать канал с помощью exec, а затем читать и писать с помощью File * Stream?

@Test public void pipe() throws IOException, InterruptedException {
    Runtime.getRuntime().exec("mkfifo mypipe");

    final String[] read = new String[1];
    Thread t = new Thread() {
        @Override
        public void run() {
            try {
                BufferedReader r = new BufferedReader(new FileReader("mypipe"));
                read[0] = r.readLine();
            } catch (IOException e) {
            }
        }
    };
    t.start();

    FileWriter w = new FileWriter("mypipe");
    w.write("hello\n");
    w.flush();
    t.join();

    assertEquals("hello", read[0]);
}
person Duncan McGregor    schedule 03.11.2009
comment
В настоящее время я делаю это для win32, хотя вскоре планирую распространить это на Linux, поскольку я поддерживаю оба. Возможно, именно этим я и займусь, но я надеялся найти общий API, который работал бы симметрично на всех платформах. Если его нет, я, вероятно, просто напишу тот, который делает что-то очень похожее на приведенное выше. - person Benj; 03.11.2009
comment
Для доступа к Win32 API обязательно ознакомьтесь с jna - person Duncan McGregor; 03.11.2009

Раньше я осуществлял коммуникацию процессов через поток ввода и вывода процесса: например, для

Process p = Runtime.getRuntime().exec("myproc");
OutputStream is = p.getOutputStream();
BufferedOutputStream bis = new BufferedOutputStream(is);
bis.write("your_command");

Точно так же вы можете использовать потоки ввода, чтобы прочитать, что вам сообщает другой процесс.

person Suraj Chandran    schedule 03.11.2009