2016-09-23 3 views
0

Я хотел бы прочитать буфер обмена в консольном приложении и распечатать содержимое буфера обмена. Это должно происходить полностью независимо от типа MIME. Насколько я могу судить по Java, все это делается на основе MIME-типа данных, и я должен знать, чего я ожидаю. По умолчанию DataFlavor s поддерживает только текст и некоторые двоичные файлы.Общий DataFlavor для всех MIME-типов Как InputStream

В любом случае, я хочу покрыть изображения, все виды текста, сериализованные материалы и любые двоичные данные.

Легкая часть

Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 

Looping над systemClipboard.getContents(null).getTransferDataFlavors() не помогает. Я также пытался создать свою собственную DataFlavor, но это не работает (от того, что я проанализировал в источнике Явы подтип может быть «*»):

systemClipboard.getData(new DataFlavor("application/*", "bytes")) 

Кроме того, я не знаю, как определить на самом деле MIME-тип. Никакой UNIX-инструмент, на который я смотрел, не мог мне этого сказать.

Моя конечная цель - написать генератор данных, который делает обратное, что означает создание данных буфера обмена и предоставление этого приложения. Но на данный момент я должен выяснить структуру, которую мне нужно создать, поэтому мне нужен этот синтаксический анализатор в первую очередь.

+0

«Содержимое» буфера обмена может быть зависимым от DataFlavor. Например, подумайте о том, когда вы скопируете текст из файла Word или WebPage в блокнот (т.е. простой текст). Да, вы получаете те же буквы, но вы теряете все стилирование = два разных набора данных возвращены – ControlAltDel

+0

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что этот вопрос неверен: содержимое (данные), возвращенные буфером обмена, зависит в запросе DataFlavor. – ControlAltDel

+0

@ControlAltDel Правильно. И я хочу посмотреть, какой тип MIME находится там и его двоичное представление, в вашем случае, что это похоже на Word или HTML. Другими словами, я хочу понять, в чем он заключается. И я хочу создать для него «DataFlavor». – sjngm

ответ

0

После глубокого погружения в вовлеченные объекты с отражением я придумал это. Я знаю, что это обычно плохо, и на самом деле он использует недокументированные методы в недокументированных классах, а это значит, что это может не работать со следующей версией Java. Из-за этого я все еще ищу хорошее решение! Не стесняйтесь публиковать ответ, если он у вас есть!

В любом случае:

public static void main(String[] args) throws Exception { 
    Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    System.out.println("systemClipboard: " + systemClipboard.getClass().getName()); 

    Method method = systemClipboard.getClass().getDeclaredMethod("getClipboardFormats"); 
    method.setAccessible(true); 
    long[] clipboardFormats = (long[]) method.invoke(systemClipboard); 

    for (long clipboardFormat : clipboardFormats) { 
    String line = "format " + clipboardFormat + ": "; 

    try { 
     method = systemClipboard.getClass().getDeclaredMethod("getClipboardData", long.class); 
     method.setAccessible(true); 
     byte[] bytes = (byte[]) method.invoke(systemClipboard, clipboardFormat); 

     line += "length: " + bytes.length + "\n"; 
     line += DatatypeConverter.printHexBinary(bytes) + "\n"; 
     line += new String(bytes); 
    } catch (Exception e) { 
     StringWriter stringWriter = new StringWriter(); 
     e.printStackTrace(new PrintWriter(stringWriter)); 
     line += stringWriter.getBuffer(); 
    } 

    System.out.println(line); 
    } 

}

Для буфера обмена я посмотрел на я заметил, что он на самом деле содержит простой читаемый XML. Тем не менее, невозможно загрузить, что обычный способ использования DataFlavor s доступен. Я предполагаю, что это связано с возможно отсутствующей информацией типа MIME в буфере обмена.

Обратите внимание, что для моей системы вторая строка выводит systemClipboard: sun.awt.X11.XClipboard, а два метода, которые я использую, - protected. Я пытаюсь сказать, что это может выглядеть по-другому на чужой машине.

В качестве дополнительной информации, который требуется использовать приведенный выше код:

Форматы буфера обмена я бегу в 589 (только один, который работает), 460, 462, 463, 464. Согласно this 589 (= 0x024D) - это частный формат буфера обмена.

Что было бы интересно увидеть, где Java отображает это clipboardFormat в MIME-тип. Может быть, это объяснит несколько вещей.

+0

Я бы просто опросил известные DataFlavors: все неустановленные публичные статические поля DataFlavor, а также DataFlavor.getTextPlainUnicodeFlavor(). Это, конечно, нехорошее решение, но, по крайней мере, оно не использует недокументированные API и будет работать надежно. – VGR

Смежные вопросы