Простая работа для Windows заключается в использовании «\» вместо «/» в пути. Это означало бы, что последовательность символов «! /» Будет найдена после полного пути. Например:
new URL("jar:file:\\d:\\test1231@#!!!\\test.jar!/images/Logo.png");
Мой код:
File jar = new File(jarPath + "/" + jarName);
URL url = new URL("jar:" + jar.toURI() + "!" + dataFilePath);
InputStream stream = null;
try {
stream = url.openStream();
} catch (FileNotFoundException e) {
// Windows fix
URL urlFix = new URL("jar:" + jar.toURI().toString().replace('/', '\\')
+ "!" + dataFilePath);
stream = urlFix.openStream();
}
Я использую toURI (), потому что он обрабатывает такие вещи, как пробелы.
Исправления:
Само исправление предназначалось бы для Java, чтобы проверить, существует ли файл, и если не продолжать следующий разделитель (часть!!) URL-адреса до тех пор, пока разделители не будут исчерпаны, а затем выбросите исключение. Поэтому он увидит, что «d: \ test1231 @ # !!» бросает java.io.FileNotFoundException и затем пытается «d: \ test1231 @ # !!! \ test.jar», который существует. Таким образом, не имеет значения, есть ли «!» в пути к файлу или в файлах jar.
В качестве альтернативы «! /» можно переключить на другое, что является незаконным именем файла или чем-то конкретным (например, «jarpath:»).
В качестве альтернативы сделать путь к файлу jar другим параметром.
Примечание:
Возможно, что-то можно переопределить, поменять обработчик или изменить код, чтобы открыть файл сначала загляните в файл jar позже, но я не посмотрел.
Я не думаю, что вы можете сделать здесь много.
Запрос должен прочитать все 25M строк из индекса, чтобы подсчитать их. Тем не менее, 25M строк не так много, и я ожидаю, что на современном оборудовании это займет менее 4 минут. Это только 100 МБ данных для чтения (хорошо, на практике это больше, скажем, 200 МБ, но для считывания 200 МБ с диска не потребуется 4 минуты).
Не загружен ли сервер? Много ли вставок в эту таблицу?
Вы можете сделать небольшое улучшение, определив столбец WhoWon
как NOT NULL
в таблице. У вас действительно есть значения NULL?
А затем используйте COUNT(*)
вместо count(WhoWon)
в запросе.
Если этот запрос выполняется часто, но данные в таблице не изменяются слишком часто, вы можете создать индексированное представление, которое по существу материализует / кеширует / предварительно вычисляет эти значения, так что запрос, который запускается из такого представления будет намного быстрее.
Вы можете ускорить это, используя оконные функции:
SELECT WhoWon, count(*) AS Total,
count(*) * 100.0 / sum(count(*)) over () as PercentWinner
FROM [test].[dbo].[7And11SidedDiceGame]
GROUP BY WhoWon;
Это не обеспечивает отдельное выражение print
.
Для производительности попробуйте индекс на (WhoWon)
.