探索Commons Exec管理外部进程

第1章:引言

咱们在日常的Java开发中,经常会遇到需要调用外部进程或命令的场景。比如说,可能需要在Java程序中启动一个外部的脚本,或者执行一个系统命令。Java虽然提供了Runtime和ProcessBuilder类来处理这类需求,但说实话,直接用它们来管理外部进程,有时候会让人感觉像是在进行一场无休止的搏斗——特别是涉及到进程的输出处理、错误处理、操作系统的兼容性等问题时。

这时候,Apache Commons Exec就闪亮登场了。它是Apache Commons项目中的一部分,专门用来处理Java中的外部进程调用。Commons Exec提供了一个简洁的API,能够让咱们更加轻松地管理和控制外部进程。它解决了Java标准方法中的一些痛点,比如更好地处理了进程的输入输出,提供了超时设置,还有异步执行外部命令的能力。

而且,Commons Exec兼顾了不同操作系统的特点,这意味着无论咱们的Java程序是在Windows上还是在Linux、Mac OS上运行,都可以平滑、一致地处理外部进程。

第2章:Commons Exec概览

Commons Exec是为了简化Java应用中外部进程的调用和管理而设计的。它通过封装Java原生的Process和Runtime,提供了更加友好和强大的API。这个库的设计重点是易用性和灵活性,让咱们可以更加专注于业务逻辑,而不是纠结于底层的进程管理细节。

Commons Exec的核心是Executor接口,它定义了执行外部命令的方法。DefaultExecutor类是这个接口的一个实现,提供了执行外部命令的基本功能。使用CommandLine类,咱们可以方便地构建需要执行的命令和参数。而ExecuteResultHandler接口则允许咱们处理异步执行的命令的结果。

来看个简单的例子。假设小黑想在Java程序中执行一个简单的命令,比如echo "你好,世界"。在Commons Exec中,这可以轻松实现:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteResultHandler;

public class HelloWorld {
    public static void main(String[] args) {
        CommandLine cmdLine = new CommandLine("echo");
        cmdLine.addArgument("你好,世界");

        DefaultExecutor executor = new DefaultExecutor();
        executor.setExitValue(1);

        try {
            executor.execute(cmdLine, new ExecuteResultHandler() {
                @Override
                public void onProcessComplete(int exitValue) {
                    System.out.println("命令执行成功!");
                }

                @Override
                public void onProcessFailed(ExecuteException e) {
                    System.err.println("命令执行失败:" + e.getMessage());
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,小黑使用CommandLine构建了要执行的命令和参数,然后通过DefaultExecutor来执行这个命令。通过实现ExecuteResultHandler接口,咱们可以处理命令执行的结果,无论是成功还是失败。

第3章:依赖设置

Commons Exec 依赖

要使用Commons Exec,咱们需要把它加入到Java项目中。如果咱们的项目使用Maven进行依赖管理,那么只需要在pom.xml文件中添加Commons Exec的依赖。就像这样:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-exec</artifactId>
        <version>1.3</version> <!-- 使用最新的版本 -->
    </dependency>
</dependencies>

如果咱们的项目不使用Maven,也可以直接从Apache Commons官网下载Commons Exec的jar文件,并将其添加到项目的类路径中。

初步设置

安装完成后,下一步是进行一些基础的设置。小黑这里以一个简单的Java程序为例,展示如何使用Commons Exec来执行一个外部命令。

假设咱们的任务是在Java程序中执行系统的ping命令。这个任务听起来简单,但通过它,咱们可以学习到Commons Exec的基本使用方法。

首先,小黑创建一个新的Java类,比如命名为PingTest。在这个类中,咱们将设置和执行ping命令。代码大致如下:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.PumpStreamHandler;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;

public class PingTest {
    public static void main(String[] args) {
        // 设置命令行
        CommandLine cmdLine = CommandLine.parse("ping www.baidu.com");
        
        // 创建用于捕获输出的流
        OutputStream outputStream = new ByteArrayOutputStream();
        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);

        // 设置执行器
        DefaultExecutor executor = new DefaultExecutor();
        executor.setStreamHandler(streamHandler);
        
        // 设置超时时间,这里设置为60秒
        ExecuteWatchdog watchdog = new ExecuteWatchdog(60000);
        executor.setWatchdog(watchdog);

        try {
            // 执行命令
            executor.execute(cmdLine);
            // 输出命令执行结果
            System.out.println("命令输出: " + outputStream.toString());
        } catch (ExecuteException e) {
            System.err.println("命令执行失败: " + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这段代码中,小黑首先使用CommandLine.parse方法创建了一个执行ping命令的CommandLine对象。然后,使用ByteArrayOutputStreamPumpStreamHandler来捕获命令的输出。接下来,设置了DefaultExecutor并配置了超时监视器ExecuteWatchdog。最后,执行这个命令,并将执行结果输出到控制台。

第4章:执行外部命令

简单命令执行

让咱们从最基本的开始。比如说,咱们想在Windows上执行一个ipconfig命令,或者在Linux上执行ifconfig。这个任务用Commons Exec来完成就非常简单。

先看一下具体的代码实现:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;

public class SimpleCommand {
    public static void main(String[] args) {
        // 创建命令行对象
        CommandLine cmdLine = new CommandLine("ipconfig"); // Windows系统使用ipconfig,Linux系统则改为ifconfig

        // 创建执行器
        DefaultExecutor executor = new DefaultExecutor();
        try {
            // 执行命令
            executor.execute(cmdLine);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,咱们用CommandLine创建了一个命令行对象,然后用DefaultExecutor来执行这个命令。这就是Commons Exec的基本用法,简洁又直接。

带参数的命令

当然,很多时候命令不会这么简单,可能还会带有一些参数。比如说,咱们想查找某个特定文件夹下的所有Java文件。这就需要用到带参数的命令了。

再来一个例子:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;

public class CommandWithArguments {
    public static void main(String[] args) {
        // 创建命令行对象,并添加命令和参数
        CommandLine cmdLine = new CommandLine("find");
        cmdLine.addArgument("/path/to/directory"); // 这里替换成实际的文件夹路径
        cmdLine.addArgument("-name");
        cmdLine.addArgument("*.java");

        // 创建执行器
        DefaultExecutor executor = new DefaultExecutor();
        try {
            // 执行命令
            executor.execute(cmdLine);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这次咱们用addArgument方法给命令添加了参数。Commons Exec会自动处理参数的转义和引号,确保命令的正确执行。

复杂命令的执行

有时候,咱们可能还需要执行更复杂的命令,比如需要管道、重定向等。Commons Exec也能胜任这样的任务。

例如,咱们想要执行一个包含管道的Linux命令,比如ps aux | grep java。这个在Commons Exec中就需要一点技巧了。咱们需要使用Shell来处理这种复杂的命令。代码如下:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.OS;
import org.apache.commons.exec.PumpStreamHandler;

import java.io.ByteArrayOutputStream;

public class ComplexCommand {
    public static void main(String[] args) {
        // 判断操作系统类型,因为Windows和Linux的shell不同
        String shell = OS.isFamilyUnix() ? "sh" : "cmd";
        String shellArg = OS.isFamilyUnix() ? "-c" : "/c";
        String command = "ps aux | grep java";

        // 创建命令行对象,并设置shell及其参数
        CommandLine cmdLine = new CommandLine(shell);
        cmdLine.addArgument(shellArg);
        cmdLine.addArgument(command, false); // false表示不对command进行变量替换处理

        // 创建执行器
        DefaultExecutor executor = new DefaultExecutor();

        // 创建输出流捕获命令执行结果
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
        executor.setStreamHandler(streamHandler);

        try {
            // 执行命令
            executor.execute(cmdLine);
            // 打印输出结果
            System.out.println(outputStream.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,咱们先检查操作系统类型,然后根据不同的系统选择不同的Shell。使用Shell执行复杂的命令时,命令本身作为一个整体参数传递给Shell。

第5章:处理输出和错误

捕获命令输出

在执行外部命令时,能够捕获它的输出是非常有用的。比如说,咱们可能需要记录这些输出,或者根据输出内容来判断命令是否执行成功。

Commons Exec为此提供了PumpStreamHandler,它能够帮助咱们捕获命令的标准输出(stdout)和标准错误(stderr)。

来看一个简单的例子。假设咱们想执行一个命令,并捕获它的输出:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;

import java.io.ByteArrayOutputStream;

public class CaptureOutputExample {
    public static void main(String[] args) {
        // 创建命令行对象
        CommandLine cmdLine = CommandLine.parse("echo 你好,Commons Exec");

        // 创建用于捕获输出的流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ByteArrayOutputStream errorStream = new ByteArrayOutputStream();

        // 设置PumpStreamHandler来捕获输出
        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream);
        DefaultExecutor executor = new DefaultExecutor();
        executor.setStreamHandler(streamHandler);

        try {
            // 执行命令
            executor.execute(cmdLine);

            // 打印输出和错误信息
            System.out.println("输出内容: " + outputStream.toString());
            System.out.println("错误内容: " + errorStream.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,咱们使用了两个ByteArrayOutputStream对象来分别捕获标准输出和标准错误。然后,通过PumpStreamHandler将它们设置到执行器中。执行命令后,就可以从这些流中获取命令的输出和错误信息了。

处理错误情况

在处理外部命令时,咱们也需要考虑错误情况。比如命令执行失败或命令本身就是非法的。Commons Exec允许咱们通过ExecuteException来捕获这些错误情况。

比如说,咱们执行一个不存在的命令,就可以捕获到错误信息:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;

public class ErrorHandlingExample {
    public static void main(String[] args) {
        // 创建一个不存在的命令
        CommandLine cmdLine = CommandLine.parse("some-nonexistent-command");

        DefaultExecutor executor = new DefaultExecutor();

        try {
            // 尝试执行命令,期望捕获异常
            executor.execute(cmdLine);
        } catch (ExecuteException e) {
            System.err.println("命令执行出错: " + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,如果命令执行失败,ExecuteException就会被抛出。通过捕获这个异常,咱们就能获取失败的详细信息,比如错误的原因等。

第6章:进程控制与通信

进程控制

控制外部进程是Commons Exec的一大亮点。咱们不仅可以启动一个外部进程,还能够监控它的执行状态,甚至在需要时终止它。这在某些长时间运行的进程或需要精确控制的场景中特别有用。

比如说,咱们需要运行一个可能会长时间执行的命令,但又不希望它运行超过一定时间。这时候,就可以设置一个超时来自动终止这个进程。看下面这个例子:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.Executor;

public class ProcessControlExample {
    public static void main(String[] args) {
        // 创建命令行对象
        CommandLine cmdLine = CommandLine.parse("some-long-running-command");

        // 创建执行器
        Executor executor = new DefaultExecutor();

        // 设置超时时间,比如60秒
        ExecuteWatchdog watchdog = new ExecuteWatchdog(60000); // 60秒后自动终止
        executor.setWatchdog(watchdog);

        try {
            // 执行命令
            executor.execute(cmdLine);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,咱们通过ExecuteWatchdog设置了一个60秒的超时时间。如果命令执行超过这个时间,它会被自动终止。

进程间通信

有时候,咱们还需要进行进程间通信。这通常涉及到将数据传递给外部进程,或者从外部进程接收数据。Commons Exec提供了一些工具来帮助咱们实现这一点。

比如说,咱们想要向外部进程传递一些输入,可以使用PipedOutputStreamPipedInputStream来实现。下面是一个简单的例子:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;

import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintWriter;

public class ProcessCommunicationExample {
    public static void main(String[] args) throws Exception {
        // 创建命令行对象
        CommandLine cmdLine = CommandLine.parse("some-command-that-needs-input");

        // 创建管道输入输出流
        PipedOutputStream output = new PipedOutputStream();
        PipedInputStream input = new PipedInputStream(output);

        // 创建执行器,并设置输入输出处理器
        DefaultExecutor executor = new DefaultExecutor();
        executor.setStreamHandler(new PumpStreamHandler(System.out, System.err, input));

        // 在另一个线程中写入输入数据
        new Thread(() -> {
            try (PrintWriter writer = new PrintWriter(output)) {
                writer.println("这里是传给外部进程的数据");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();

        // 执行命令
        executor.execute(cmdLine);
    }
}

在这个例子中,咱们创建了一个PipedOutputStream来写入数据,然后通过PipedInputStream将这些数据传递给外部进程。这样就实现了Java程序和外部进程之间的数据传输。

第7章:高级特性和技巧

自定义执行器

虽然DefaultExecutor已经很强大,但有时候咱们可能需要更加定制化的执行行为。Commons Exec允许我们创建自定义的执行器来满足这种需求。比如说,咱们可能需要在执行命令之前或之后做一些特别的处理,或者改变命令执行的某些默认行为。

来看一个简单的例子,小黑在这里创建了一个自定义的执行器:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.Executor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteResultHandler;

public class CustomExecutorExample {
    public static void main(String[] args) {
        CommandLine cmdLine = CommandLine.parse("echo 自定义执行器");

        Executor customExecutor = new DefaultExecutor() {
            @Override
            public void execute(final CommandLine command, final ExecuteResultHandler handler) throws ExecuteException {
                // 在执行前做一些处理
                System.out.println("即将执行命令: " + command);

                // 调用父类的执行方法
                super.execute(command, handler);
            }
        };

        try {
            customExecutor.execute(cmdLine, new ExecuteResultHandler() {
                @Override
                public void onProcessComplete(int exitValue) {
                    System.out.println("命令执行完成,退出值:" + exitValue);
                }

                @Override
                public void onProcessFailed(ExecuteException e) {
                    System.err.println("命令执行失败:" + e.getMessage());
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,咱们扩展了DefaultExecutor并重写了它的execute方法,加入了一些自定义的逻辑。

处理超时

在一些场景下,咱们可能需要精确控制命令的执行时间,特别是在执行可能会占用大量时间的命令时。Commons Exec通过ExecuteWatchdog提供了超时处理的能力。

来看看如何使用这个功能:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.Executor;

public class TimeoutHandlingExample {
    public static void main(String[] args) {
        CommandLine cmdLine = CommandLine.parse("some-long-running-command");
        Executor executor = new DefaultExecutor();

        // 设置60秒的超时
        ExecuteWatchdog watchdog = new ExecuteWatchdog(60000);
        executor.setWatchdog(watchdog);

        try {
            executor.execute(cmdLine);
        } catch (Exception e) {
            if (watchdog.killedProcess()) {
                // 处理因超时被终止的情况
                System.err.println("命令执行超时,进程被终止");
            } else {
                // 处理其他执行错误
                e.printStackTrace();
            }
        }
    }
}
异步执行

Commons Exec还支持异步执行命令。这对于不需要即时等待命令完成的场景非常有用,比如在后台运行某个长时间的任务。

下面是异步执行的一个例子:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteResultHandler;

public class AsynchronousExecutionExample {
    public static void main(String[] args) {
        CommandLine cmdLine = CommandLine.parse("some-background-task");

        DefaultExecutor executor = new DefaultExecutor();
        executor.setExitValue(1);

        try {
            executor.execute(cmdLine, new ExecuteResultHandler() {
                @Override
                public void onProcessComplete(int exitValue) {
                    System.out.println("异步命令执行完成,退出值:" + exitValue);
                }

                @Override
                public void onProcessFailed(ExecuteException e) {
                    System.err.println("异步命令执行失败:" + e.getMessage());
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,咱们使用了execute方法的另一个变体,它接受一个ExecuteResultHandler作为参数,允许咱们处理异步执行的结果。

第8章:Commons Exec在实际项目中的应用

自动化脚本执行

在许多自动化和DevOps场景中,需要执行各种脚本来完成任务,比如自动部署、测试或数据备份。Commons Exec就非常适合这类工作。

比如说,咱们有一个定期执行数据库备份的脚本。使用Commons Exec,可以很容易地在Java应用中集成这个脚本的执行:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteResultHandler;

public class DatabaseBackup {
    public static void main(String[] args) {
        CommandLine cmdLine = CommandLine.parse("bash database-backup.sh"); // 假设这是数据库备份脚本

        DefaultExecutor executor = new DefaultExecutor();
        executor.setExitValue(1);

        try {
            executor.execute(cmdLine, new ExecuteResultHandler() {
                @Override
                public void onProcessComplete(int exitValue) {
                    System.out.println("数据库备份完成");
                }

                @Override
                public void onProcessFailed(ExecuteException e) {
                    System.err.println("数据库备份失败:" + e.getMessage());
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
第三方工具集成

在一些项目中,咱们可能需要集成第三方工具或命令行程序来完成特定的任务。例如,图像处理、文件转换等。Commons Exec可以帮助咱们轻松地在Java应用中执行这些工具的命令。

假设咱们需要在Java应用中使用ImageMagick来处理图片,可以这样做:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;

public class ImageProcessing {
    public static void main(String[] args) {
        CommandLine cmdLine = new CommandLine("magick");
        cmdLine.addArgument("input.jpg");
        cmdLine.addArgument("output.jpg");

        DefaultExecutor executor = new DefaultExecutor();
        try {
            executor.execute(cmdLine);
            System.out.println("图片处理完成");
        } catch (Exception e) {
            System.err.println("图片处理失败:" + e.getMessage());
        }
    }
}
复杂流程控制

在一些复杂的应用场景中,可能需要对多个外部进程进行精细的控制,比如顺序执行、并发执行或依赖处理。Commons Exec提供的高级功能,如异步执行、超时设置等,都可以在这些场景中发挥作用。

例如,咱们有一个需要顺序执行多个数据处理命令的任务,可以利用Commons Exec来实现流程控制:

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteResultHandler;

public class DataProcessing {
    public static void main(String[] args) {
        executeCommand("data-processing-step1");
        executeCommand("data-processing-step2");
        // ... 更多步骤
    }

    private static void executeCommand(String command) {
        CommandLine cmdLine = CommandLine.parse(command);

        DefaultExecutor executor = new DefaultExecutor();
        executor.setExitValue(1);

        try {
            executor.execute(cmdLine, new ExecuteResultHandler() {
                @Override
                public void onProcessComplete(int exitValue) {
                    System.out.println(command + " 执行完成");
                }

                @Override
                public void onProcessFailed(ExecuteException e) {
                    System.err.println(command + " 执行失败:" + e.getMessage());
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第9章:总结

Commons Exec作为一个强大的Java库,为外部进程的执行和管理提供了极大的便利。它解决了Java标准API在这方面的一些局限性,比如提供了更好的错误处理、超时控制和异步执行等功能。

  • 基本用法:咱们学习了如何使用Commons Exec执行基本的外部命令,包括带参数的命令和复杂的命令行。
  • 输出和错误处理:掌握了如何捕获和处理命令的输出及错误,这对于理解命令的执行结果至关重要。
  • 进程控制:了解了如何控制外部进程的生命周期,包括设置超时和处理进程的输入输出。
  • 高级特性:探索了自定义执行器、异步执行和超时处理等高级特性,这些都是在复杂应用场景中非常有用的技能。
  • 实际应用:最后,通过几个实际的案例,咱们看到了Commons Exec在真实项目中的应用,比如自动化脚本执行、第三方工具集成和复杂流程控制。

Commons Exec不仅仅是一个工具库,它更像是一个桥梁,连接了Java程序和外部环境。掌握了它,就等于在Java的世界里多了一只可以触达外部世界的手。无论是简单的自动化任务,还是复杂的系统集成,Commons Exec都能提供强有力的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker Linux快速安装及Nginx部署

前言 最近正在部署一套新的Linux服务器环境&#xff0c;基于Docker来部署所有的应用&#xff0c;顺便整理了一套经过验证的操作手册&#xff0c;以便大家遇到类似需求时&#xff0c;可以直接拿来用。 本文会涉及以下知识点&#xff1a;Docker的Linux安装和卸载、Docker用户组…

【网络安全】Nessus部署自动更新和端口权限开放

文章目录 Nessus 自动更新配置Nessus服务端口开放Nessus profession 版本需要开放端口Sensor ProxyTenable Security Center (TSC)Tenable OT Security (TOT)Tenable OT Security Enterprise Manager (IEM)Tenable OT Security Industrial Core Platform (ICP)Tenable OT Secur…

基于卷积神经网络的回归分析

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络的回归分析 完整代码:卷积神经网络的回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/…

基于深度学习大模型实现离线翻译模型私有化部署使用,通过docker打包开源翻译模型,可到内网或者无网络环境下运行使用,可以使用一千多个翻译模型语言模型进行翻译

基于深度学习大模型实现离线翻译模型私有化部署使用,通过docker打包开源翻译模型,可到内网或者无网络环境下运行使用,可以使用一千多个翻译模型语言模型进行翻译,想要什么语种直接进行指定和修改就行。 环境要求,电脑内存低于8G建议不要尝试了,有无GPU都可以运行,但是有…

秋招复习之栈与队列

前言 1 栈 「栈 stack」是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子&#xff0c;如果想取出底部的盘子&#xff0c;则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素&#xff08;如整数、字符、对象等&#xff09;&#xff0c…

释放创造力:可视化页面渲染引擎在低代码开发平台的应用

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 什么是页面渲染引擎? 页面渲染引擎是低代码开发平台的核心组件之一&#xff0c;它负责将开发者设计的页面布局和用户…

Docker 存储卷管理

一、存储卷简介 存储卷是一种方便、灵活、高效的Docker容器内数据存储方式。存储卷可以在容器内的不同进程间共享数据&#xff0c;并且可以在容器之间共享和重用。 二、存储卷的优点 可以在容器之间共享和重用&#xff0c;避免了在不同容器之间复制数据的繁琐。对数据卷的修…

Flume基础知识(七):Flume 事务与 Flume Agent 内部原理

1. Flume 事务详解 2. Flume Agent 内部原理 重要组件&#xff1a; 1&#xff09;ChannelSelector ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型&#xff0c; 分别是 Replicating&#xff08;复制&#xff09;和 Multiplexing&#xff08;多…

linux 的直接direct io

目录 什么是 Direct IO java 支持 使用场景 数据库 反思 在之前的文章零拷贝基础上&#xff0c;有一个针对那些不需要在操作系统的 page cache 里保存的情况&#xff0c;即绕过 page cache&#xff0c;对于 linux 提供了 direct io 的功能。 https://blog.csdn.net/zlpzl…

芯课堂 | LVG免费开源GUI图形库

概述 本文介绍目前LVGL的应用小知识&#xff0c;希望对采用MCU设计UI界面的用户有所启发&#xff0c;开发出界面更友好的消费品或者工业产品&#xff0c;造福大众。 01.LVGL系统架构 LVGL系统框架 应用程序创建GUI并处理特定任务的应用程序。 LVGL本身是一个图形库。我们的…

RFID技术在3C家电中的全方位应用

RFID技术在3C家电中的全方位应用 一、RFID技术简述 射频识别&#xff08;RFID&#xff09;技术是一种无线通信技术&#xff0c;已经在各行各业得到广泛应用。在3C家电领域&#xff0c;RFID技术的应用正在逐渐增加&#xff0c;为产品追溯、库存管理、防伪验证等方面提供了许多…

运维:电脑技巧:Win10常见的网络端口大全

目录 一、什么是网络端口&#xff1f; 二、网络传输协议 三、常见的 TCP 和 UDP 默认端口 一、什么是网络端口&#xff1f; 在计算机网络中&#xff0c;端口是通信端点。通常&#xff0c;端口标识分配给它们的特定网络服务。在操作系统中&#xff0c;端口号的主要用途协助是…

Python从入门到网络爬虫(内置函数详解)

前言 Python 内置了许多的函数和类型&#xff0c;比如print()&#xff0c;input()等&#xff0c;我们可以直接在程序中使用它们&#xff0c;非常方便&#xff0c;并且它们是Python解释器的底层实现的&#xff0c;所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…

Python爬取解放号外包需求案例,利用post参数多页爬取

代码展示&#xff1a; import requests import csv f open(外包数据.csv,modea,encodingutf-8,newline) csv_writer csv.writer(f) csv_writer.writerow([标题,编号,开始时间,结束时间,价格,状态,类型,投标人数,详情页]) def down_load(page): for page in range(1,page…

​电脑技巧:​笔记本电脑电流声的原因和解决方案

目录 一、音频设备接口接触不良 二、笔记本电源问题 三、笔记本电脑驱动程序问题 四、音频硬件问题 五、操作系统内部电磁干扰 六、最后总结 大家在日常生活当中&#xff0c;笔记本电脑已经成为我们工作、学习和娱乐的重要工具。但有时我们在使用过程中可能会遇到一个令人…

React组件之间的8种通讯方式

在 React 社区&#xff0c;遇到最多的其中一个问题是“不同组件之间如何相互通讯”。 在网上搜索了一些答案之后&#xff0c;早晚会有人提到 Flux&#xff0c;随后问题来了&#xff1a;“怎么用Flux解决通讯问题&#xff1f;Flux是必须的吗&#xff1f;”。 有时候 Flux 能解…

C++完成Query执行sql语句的接口封装和测试

1、在LXMysql.h 创建Query执行函数 //封装 执行sql语句 if sqllen 0 strlen获取字符长度bool Query(const char*sql,unsigned long sqllen0); 2、在LXMysql.cpp编写函数 bool LXMysql::Query(const char* sql, unsigned long sqllen){if (!mysql)//如果mysql没有初始化好{c…

C/C++ BM4 合并两个排序的链表

文章目录 前言题目1. 解决方案一1.1 思路概述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题采用两种方式&#xff0c;一种是直接插入法&#xff0c;还有一种就是递归调用。 题目 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表…

imgaug库指南(四):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

AntDB内存管理之内存上下文

1. 主题说明 AntDB的内存管理在开发时&#xff0c;使用了内存上下文机制来实现内存管理。本文就从AntDB的内存上下文机制出发&#xff0c;解析内存上下文的实现原理。AntDB的代码中&#xff0c;涉及到内存的处理时&#xff0c;经常会看到下面这样的代码。 图1&#xff1a;切换…