2015-05-13 4 views
3

Я написал этот методПочему DataFlavors меняются после перезапуска программы?

public static void printFlavors() { 
    Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    Transferable transferData = systemClipboard.getContents(null); 
    for (DataFlavor dataFlavor : transferData.getTransferDataFlavors()) { 
     System.out.println(dataFlavor); 
    } 
} 

Использование Java Я пишу строку в мой буфер обмена, то я называю printFlavors() и получить

java.awt.datatransfer.DataFlavor[mimetype=application/x-java-serialized-object;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=unicode] 

Когда я первый остановить программу, а затем запустить новую программу, призывающую printFlavors() I получить совершенно другой результат:

java.awt.datatransfer.DataFlavor[mimetype=application/x-java-text-encoding;representationclass=[B] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.Reader] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.Reader] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.Reader] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.CharBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.CharBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.CharBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[C] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[C] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[C] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.io.InputStream;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/html;representationclass=[B;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=application/x-java-serialized-object;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.Reader] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.lang.String] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.CharBuffer] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[C] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=unicode] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-8] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16BE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=UTF-16LE] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=ISO-8859-1] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=windows-1252] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.io.InputStream;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=java.nio.ByteBuffer;charset=US-ASCII] 
java.awt.datatransfer.DataFlavor[mimetype=text/plain;representationclass=[B;charset=US-ASCII] 

Почему изменяется результат?

+0

Это, возможно, также связано с нечетным поведением я просто наблюдал и [вывешены] (http://stackoverflow.com/questions/38059538/java-clipboard-error-bug/41462225#41462225) о: Получение текста буфера обмена всегда отражает текст, скопированный пользователем, но если сама программа устанавливает текст, это все содержимое, которое я получаю после **, кроме **, если я откладываю дальнейший текст буфера обмена, получая через SwingUtilities.invokeLater(). Ответ Драгана Бозановича может быть связан с этим, потому что основной эффект паузы может быть таким же. –

ответ

0

Я предполагаю, что вы добавили содержимое в буфер обмена, используя что-то вроде:

systemClipboard.setContents(new StringSelection("abc"), null); 

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

Если вы приостановите выполнение программы (по точке спящего или отладочной точки) после того, как вы программно установите содержимое буфера обмена, а затем измените содержимое буфера обмена вне программы (например, скопировав некоторый текст), вы должен получить тот же результат, как если бы вы перезапустили приложение (гораздо больше данных, чтобы помочь преобразовать контент в Java-представление), потому что контент поступает из внешнего мира (Operating System).

Я работал немного с java Clipboard в прошлом, и это мои предположения; как всегда, лучше проверить исходный код, если вам действительно нужно знать, что происходит в точности.

EDIT

Я посмотрел на исходном коде, и мое предположение верно - когда приложение хранит StringSelection в буфер обмена, он держит ссылку на него, пока изменения содержимого буфера обмена и возвращает только ароматизаторы данных, поддерживаемые по StringSelection:

private static final DataFlavor[] flavors = { 
    DataFlavor.stringFlavor, 
    DataFlavor.plainTextFlavor // deprecated 
}; 
Смежные вопросы