Одним из решений является использование коррелированного подзапроса. Принцип заключается в том, что внешний запрос не агрегируется, но имеет условие в предложении WHERE
, которое выбирает самую последнюю запись в журнале для текущего идентификатора компьютера, используя агрегированный подзапрос.
Я полагаю, что вам понадобится этот запрос (без просмотра данных примера и ожидаемого результата, хотя, возможно, он не будет точным на 100%):
SELECT
computers.computer_name,
users.username,
data_logs.window_title,
data_logs.filename,
data_logs.capture_timestamp
FROM computers
INNER JOIN users
ON users.computer_id = computers.computer_id
INNER JOIN data_logs
ON data_logs.user_id = users.user_id AND data_logs.marked != 1
WHERE
computers.account_id = :cw_account_id
AND computers.status = 1
AND data_logs.capture_timestamp = (
SELECT MAX(d.capture_timestamp)
FROM computers c
INNER JOIN users u ON u.computer_id = c.computer_id
INNER JOIN data_logs d ON d.user_id = u.user_id AND d.marked != 1
WHERE c.computer_id = computers.computer_id AND c.account_id = computers.account_id
)
ORDER BY data_logs.capture_timestamp desc
Можете Вы выбирать соответствующий символьный набор в Конструкторе:
new InputStreamReader(new FileInputStream(in), "ISO8859_1");
Если Вы не знаете кодирование своих данных, не настолько легко определить, но Вы могли попытаться пользоваться библиотекой для предположения этого. Кроме того, существует подобный вопрос.
Можно, конечно, проверить файл для конкретного набора символов путем декодирования его с a CharsetDecoder
и не упущение "уродливого входа" или "неотображаемо-символьных" ошибок. Конечно, это только говорит Вам, если набор символов является неправильным; это не говорит Вам, если это корректно. Для этого Вам нужно основание сравнения для оценки декодируемых результатов, например, Вы знаете заранее, ограничиваются ли символы некоторым подмножеством, или придерживается ли текст некоторого строгого формата? Нижняя строка - то, что обнаружение набора символов является догадками без любых гарантий.
Вы не можете определить кодирование произвольного потока байтов. Это - природа кодировки. Кодирование означает отображение между значением байта и его представлением. Таким образом, каждое кодирование "могло" быть правом.
getEncoding () метод возвратит кодирование, которое было настроено (считайте JavaDoc) для потока. Это не предположит кодирование для Вас.
Некоторые потоки говорят Вам, какое кодирование использовалось для создания их: XML, HTML. Но не произвольный поток байтов.
Так или иначе Вы могли попытаться предположить кодирование самостоятельно, если Вы имеете к. Каждый язык имеет общую частоту для каждого символа. На английском языке символ e появляется очень часто, но ê будет появляться очень очень редко. В потоке ISO-8859-1 обычно существуют символы № 0x00. Но поток UTF-16 имеет многие из них.
Или: Вы могли спросить пользователя. Я уже видел приложения, которые представляют Вас отрывок файла в различной кодировке и просят, чтобы Вы выбрали "корректную".
Для файлов ISO8859_1 не существует простого способа отличить их от ASCII. Однако для файлов Unicode это обычно можно обнаружить по первым нескольким байтам файла.
Файлы UTF-8 и UTF-16 включают Знак порядка байтов (BOM) в самом начале файл. Спецификация представляет собой неразрывное пространство нулевой ширины.
К сожалению, по историческим причинам Java не обнаруживает это автоматически. Такие программы, как Блокнот, проверят спецификацию и используют соответствующую кодировку. Используя unix или Cygwin, вы можете проверить спецификацию с помощью команды file. Например:
$ file sample2.sql
sample2.sql: Unicode text, UTF-16, big-endian
Для Java я предлагаю вам проверить этот код, который определит распространенные форматы файлов и выберет правильную кодировку: Как прочитать файл и автоматически указать правильную кодировку
Я нашел хорошую библиотеку сторонних разработчиков, которая может обнаружить реальную кодировку: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding
Я не проводил тщательного тестирования, но похоже, что она работает.
edtFTP net - это свободная, быстрая FTP-библиотека с открытым исходным кодом для .NET, написанная на C #.
-121--787309-Необходимо внимательно отнестись к прерыванию подобной операции, особенно в компоненте третьей вечеринки, который (возможно) не имеет доступа к изменяемому коду.
Если прервать операцию, вы не узнаете, в каком состоянии вы оставили базовый класс. Например, он, возможно, приобрел блокировку, и ваши сведения привели к тому, что эта блокировка не была снята. Даже если объект будет уничтожен после прерывания операции, возможно, он изменил какое-либо глобальное состояние и, следовательно, вы не сможете надежно создать новый экземпляр без перезапуска.
-121--1188270-Приведенные выше буквы являются простыми детекторами спецификации, которые, конечно, работают только при наличии спецификации в начале файла. Посмотрите на http://jchardet.sourceforge.net/ , который сканирует текст