Резюме
На прошлой неделе я использовал Java для разработки многопоточного инструмента для загрузки больших файлов. Я также использую этот инструмент для моих обычных загрузок файлов. Скорость загрузки действительно значительно улучшилась, но каждый раз, когда я загружаю, мне приходится открывать проект. запускать код, что очень неудобно.Учитывая, что мы используем инструменты разработки IDEA каждый день, мы решили сделать этот инструмент загрузки плагином IDEA.Адрес загрузки плагина прикреплен в конце статьи.
❝Java реализует многопоточную загрузку больших файлов
- Адрес Гите:git ee.com/silently952…
Плагин IDEA для многопоточной загрузки файлов
- Адрес на гитхабе:GitHub.com/silently952…
- Адрес Гите:git ee.com/silently952…
Не забудьте поставить звездочку
❞
Знакомство с плагином IDEA
IntelliJ IDEA в настоящее время является лучшей IDE для разработки JAVA.Ее функции уже очень мощные, но мы можем столкнуться с некоторыми требованиями к настройке, такими как: генератор пользовательского кода; в настоящее время нам нужно написать его самостоятельно Плагин, если вы просто хотите разрабатывать простые функции, вам нужно только освоить Java Swing, тогда очень легко разрабатывать плагины IDEA, если вы хотите узнать больше принципов и концепций дизайна, вы можете увидетьIntelliJ Platform SDKофициальная документация.
Этапы разработки плагина IDEA
1. Создайте проект плагина Gradle
После создания проекта мы можем взглянуть наresource/META-INF/plugin.xml
<idea-plugin>
<id>cn.silently9527.fast-download-idea-plugin</id> <!-- 插件的ID -->
<name>FastDownloadPlugin</name> <!-- 插件的名字,会在插件中心展示 -->
<vendor email="380303318@qq.com" url="https://silently9527">Silently9527</vendor>
<!--插件说明-->
<description><![CDATA[
多线程文件下载器
]]></description>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>
<actions>
<!-- Add your actions here -->
</actions>
</idea-plugin>
2. Создайте действие
При разработке подключаемого модуля IDEA в основном используется Action.Action фактически является обработчиком событий, как и метод onClick в JS. Создать действие в IDEA очень просто, и это можно сделать через графический интерфейс.
После завершения создания вы можете увидеть класс Action
public class FastDownloadAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
}
}
существуетplugin.xml
Вы можете увидеть сгенерированную информацию о действии в
<action id="fast.download" class="cn.silently9527.FastDownloadAction" text="FastDownload" description="文件多线程下载">
<add-to-group group-id="ToolsMenu" anchor="last"/>
<keyboard-shortcut keymap="$default" first-keystroke="shift D"/>
</action>
3. Создайте всплывающее окно для ввода информации о загрузке
SDK подключаемого модуля IDEA уже инкапсулировал всплывающее окно, нужно только наследоватьDialogWrapper
То есть работа по рисованию интерфейса вся вcreateCenterPanel
способ, компоновка компонентов похожа на JavaSwing
@Nullable
@Override
protected JComponent createCenterPanel() {
Box verticalBox = Box.createVerticalBox();
verticalBox.add(createUrlBox());
verticalBox.add(Box.createVerticalStrut(10));
verticalBox.add(createFileDirJPanel());
verticalBox.add(Box.createVerticalStrut(10));
verticalBox.add(createThreadNumJPanel());
return verticalBox;
}
Нам нужно проверить параметры входного адреса загрузки и сохраненного пути, чтобы определить правильность ввода.Метод может быть реализован.doValidate
, вернуть null, если проверка прошла успешно, и вернуть, если проверка не удаласьValidationInfo
объект
@Nullable
@Override
protected ValidationInfo doValidate() {
if (StringUtils.isBlank(downloadUrlField.getText())) {
return new ValidationInfo("文件下载地址必填");
}
if (StringUtils.isBlank(fileDirField.getText())) {
return new ValidationInfo("文件保存目录必填");
}
if (StringUtils.isBlank(threadNumField.getText())) {
return new ValidationInfo("下载线程数必填");
}
return null;
}
Эффект после завершения финального интерфейса
4. Получите информацию о загрузке, введенную во всплывающем окне в FastDownloadAction.
DownloadDialog downloadDialog = new DownloadDialog();
if (downloadDialog.showAndGet()) {
// 用户点击OK之后进入到这里
}
Когда пользователь нажимает ОК, мы можем начать загрузку файла после прохождения проверки входной информации.Поскольку компонент загрузки, который мы делали ранее, является синхронным вызовом, чтобы не блокировать работу интерфейса, нам нужно использовать поток для загрузки асинхронно.
CompletableFuture.runAsync(() -> {
try {
Downloader downloader = new MultiThreadFileDownloader(threadNum, downloadProgressPrinter);
downloader.download(downloadURL, downloadDir);
} catch (IOException e) {
throw new RuntimeException(e);
}
})
Во время процесса загрузки необходимо дать пользователю обратную связь, чтобы пользователь знал, каков текущий прогресс загрузки и какова текущая скорость загрузки.
//使用SDK开启一个后台任务线程
ProgressManager.getInstance().run(new Task.Backgroundable(project, "File Downloading") {
private long tmpAlreadyDownloadLength; //当前已下载字节数
private long speed; //每秒下载速度
public void run(@NotNull ProgressIndicator progressIndicator) {
// start your process
while (true) {
long alreadyDownloadLength = downloadProgressPrinter.getAlreadyDownloadLength();
long contentLength = downloadProgressPrinter.getContentLength();
if (alreadyDownloadLength != 0 && alreadyDownloadLength >= contentLength) {
// 下载已完成,进度条显示100%
progressIndicator.setFraction(1.0);
progressIndicator.setText("finished");
break;
}
setProgressIndicator(progressIndicator, contentLength, alreadyDownloadLength);
sleep();
}
}
private void setProgressIndicator(ProgressIndicator progressIndicator, long contentLength,
long alreadyDownloadLength) {
if (alreadyDownloadLength == 0 || contentLength == 0) {
return;
}
speed = alreadyDownloadLength - tmpAlreadyDownloadLength;
tmpAlreadyDownloadLength = alreadyDownloadLength;
double value = (double) alreadyDownloadLength / (double) contentLength;
double fraction = Double.parseDouble(String.format("%.2f", value));
progressIndicator.setFraction(fraction);
String text = "already download " + fraction * 100 + "% ,speed: " + (speed / 1000) + "KB";
progressIndicator.setText(text); //进度条显示已下载百分比,下载速度
}
});
Тестировать файлы многопоточной загрузки
Протестируйте и скачайте идею 820M, адрес: https://download.jetbrains.8686c.com/idea/ideaIU-2020.3.dmg
Установка плагина
После загрузки плагина выберите локальную установку.
Суммировать
- Знакомство с плагином IDEA
- Основные этапы разработки плагина IDEA
- Реализован плагин многопоточной загрузки файлов
❝В процессе текущего тестирования было обнаружено, что расчет скорости загрузки файлов был не очень точным, а также невозможно было подсчитать скорость загрузки отдельных потоков, мы продолжим ее оптимизировать позже.
Ссылка для скачивания плагина:disk.baidu.com/yes/1 Начальник штаба кг древесины 8…Код извлечения: 3f4t
❞
Пишите до последней точки внимания, не теряйтесь
❝В тексте может быть больше или меньше недостатков и ошибок.Если у вас есть предложения или мнения, вы можете их комментировать и обмениваться.
наконец,"Это нелегко создать, пожалуйста, не занимайтесь проституцией", я надеюсь, что мои друзья могут"Нравится Комментарий Подписаться"Санлян, потому что это все источники мотивации, которыми я могу поделиться🙏
❞
❝Публичный аккаунт WeChat: Бета-обучение JAVA
❞