构建方便安全的HttpClient工具类

2023-10-26

前言

在Java开发中经常遇见需要调用第三方接口的情况,这种情况下往往需要一个接口调用工具,常用的有hutool restTemplate httpClient。但是不管哪一种,在使用便捷性方面都不太方便。不如自己再去封装。
常见的二进制提交,formdata提交等需要做不少的代码转换。

开始

引入核心依赖

    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpmime</artifactId>
      <version>4.5.3</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.73</version>
    </dependency>

其它依赖

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>28.1-jre</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.10</version>
      <scope>provided</scope>
    </dependency>
    <!-- log start -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.25</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.5</version>
    </dependency>
    <!-- log end -->

封装工具类

1.UrlEntity

    import java.util.HashMap;
    import java.util.Map;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * url对象
     *
     * @author LiTing
     * @date 2021/2/26 11:18
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class UrlEntity {
      /** 基础url */
      public String baseUrl;
      /** url参数 */
      public Map<String, Object> params = new HashMap<>();
    
      public String toUrl() {
        int i = 0;
        StringBuilder text = new StringBuilder(baseUrl);
        for (Map.Entry<String, Object> entry : params.entrySet()) {
          if (i == 0) {
            text = text.append("?" + entry.getKey() + "=" + entry.getValue());
          } else {
            text = text.append("&" + entry.getKey() + "=" + entry.getValue());
          }
          i++;
        }
        return text.toString();
      }
    
      public UrlEntity addParam(Map<String, Object> map) {
        if (map != null) {
          params.putAll(map);
        }
        return this;
      }
    }

2.HttpClientException

    import lombok.Data;

    /**
     * 第三方服务调用异常
     *
     * @author LiTing
     * @date 2021/6/8 10:43
     */
    @Data
    public class HttpClientException extends Exception {
    
      public HttpClientException(String message) {
        super(message);
      }
    }   

3.IoUtil

    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    /**
     * 统一的io处理工具类
     *
     * @author liting
     */
    public class IoUtil {
      /** 默认的字节读取大小 */
      private static final int SIZE = 4 * 1024;
    
      public static File inputStream2File(
          InputStream inputStream, String targetFile, boolean closeStream) throws   IOException {
        File file = new File(targetFile);
        OutputStream outStream = null;
        try {
          outStream = new FileOutputStream(file);
          File parentFile = file.getParentFile();
          if (!parentFile.exists()) {
            parentFile.mkdirs();
          }
          byte[] buffer = new byte[SIZE];
          int bytesRead;
          while ((bytesRead = inputStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
          }
          outStream.flush();
        } finally {
          if (outStream != null) {
            outStream.close();
          }
          if (closeStream && inputStream != null) {
            inputStream.close();
          }
        }
        return file;
      }
    
      /** 目的是检查目录存不存在,不存在则创建. */
      public static void checkPath(String path) {
        File file = new File(path);
        if (file != null && file.isDirectory() && !file.exists()) {
          file.mkdirs();
        }
        if (file == null || !file.exists()) {
          file.mkdirs();
        }
      }
      
    
      /** byte数组转文件 */
      public static byte[] file2Byte(File file) throws IOException {
        byte[] buffer;
        FileInputStream fis = null;
        ByteArrayOutputStream bos = null;
        try {
          checkPath(file.getParent());
          fis = new FileInputStream(file);
          bos = new ByteArrayOutputStream();
          byte[] b = new byte[SIZE];
          int n;
          while ((n = fis.read(b)) != -1) {
            bos.write(b, 0, n);
          }
        } finally {
          if (fis != null) {
            fis.close();
          }
          if (bos != null) {
            bos.close();
          }
        }
        buffer = bos.toByteArray();
        return buffer;
      }
    }

4.UrlUtil

    import java.util.HashMap;
    import org.hhdbb.hhpclient.entity.UrlEntity;
    
    /**
     * url解析工具
     *
     * @author LiTing
     * @date 2021/2/26 11:12
     */
    public class UrlUtil {
    
      /**
       * 解析url
       *
       * @param url
       * @return
       */
      public static UrlEntity parse(String url) {
        UrlEntity entity = new UrlEntity();
        if (url == null) {
          return entity;
        }
        url = url.trim();
        if ("".equals(url)) {
          return entity;
        }
        String[] urlParts = url.split("\\?");
        entity.baseUrl = urlParts[0];
        // 没有参数
        if (urlParts.length == 1) {
          return entity;
        }
        // 有参数
        String[] params = urlParts[1].split("&");
        entity.params = new HashMap<>(8);
        for (String param : params) {
          String[] keyValue = param.split("=");
          entity.params.put(keyValue[0], keyValue[1]);
        }
    
        return entity;
      }
    }

5.SingletonUtil

    import com.google.common.util.concurrent.ThreadFactoryBuilder;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    import org.apache.http.client.config.CookieSpecs;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    
    /**
     * 单例工具类
     *
     * @author LiTing
     * @date 2021/3/26 18:22
     */
    public class SingletonUtil {
      private static volatile PoolingHttpClientConnectionManager   poolingHttpClientConnectionManager;
      private static volatile HttpClientBuilder httpClientBuilder;
      private static RequestConfig globalConfig =
          RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
      private static Lock lock1 = new ReentrantLock();
      private static Lock lock2 = new ReentrantLock();
      public static ThreadFactory namedThreadFactory =
          new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();
      public static ExecutorService executorService =
          new ThreadPoolExecutor(
              5, 100, 200L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(),   namedThreadFactory);
      /** 保证全局只使用提个连接池管理对象 */
      public static PoolingHttpClientConnectionManager
          getSingletonPoolingHttpClientConnectionManager() {
        if (poolingHttpClientConnectionManager == null) {
          lock1.lock();
          try {
            PoolingHttpClientConnectionManager cm = new     PoolingHttpClientConnectionManager();
            cm.setDefaultMaxPerRoute(800);
            cm.setMaxTotal(1000);
            poolingHttpClientConnectionManager = cm;
          } finally {
            lock1.unlock();
          }
        }
        return poolingHttpClientConnectionManager;
      }
    
      /** 保证全局只通过一个builder去创建client */
      public static HttpClientBuilder getSingletonHttpClientBuilder() {
        if (httpClientBuilder == null) {
          lock2.lock();
          try {
            httpClientBuilder =
                HttpClients.custom()
                    .setConnectionManager(
                        SingletonUtil.getSingletonPoolingHttpClientConnectionManager    ())
                    .setDefaultRequestConfig(globalConfig);
          } finally {
            lock2.unlock();
          }
        }
        return httpClientBuilder;
      }
    }   

开始构建

6.HttpClientUtil

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpHost;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpRequestBase;
    import org.apache.http.entity.ByteArrayEntity;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.entity.mime.HttpMultipartMode;
    import org.apache.http.entity.mime.MultipartEntityBuilder;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.hhdbb.hhpclient.entity.UrlEntity;
    import org.hhdbb.hhpclient.exception.HttpClientException;
    
    /**
     * http请求工具类
     *
     * @author LiTing
     * @date 2021/3/26 16:39
     */
    @Slf4j
    public class HttpClientUtil {
    
      private static final String DEFAULT_CHARSET = "UTF-8";
    
      private static class HttpClientUtilHolder {
        private static HttpClientUtil httpClientUtil = new HttpClientUtil();
      }
    
      public static final HttpClientUtil getSingleInstance() {
        return HttpClientUtilHolder.httpClientUtil;
      }
    
      public static void httpResponseToFile(CloseableHttpResponse httpResponse,   String path)
          throws IOException {
        HttpEntity httpEntity = httpResponse.getEntity();
        InputStream inStream = httpEntity.getContent();
        IoUtil.inputStream2File(inStream, path, true);
      }
    
      /**
       * 发送Get请求
       *
       * @param url
       * @param header
       * @param tClass
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:06
       */
      public static <T> T doGet(String url, Map<String, String> header, Class<T>   tClass)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpGet get = new HttpGet(url);
        setHeader(get, header);
        return getResult(httpClient, get, tClass);
      }
    
      /**
       * 发送Get请求
       *
       * @param url
       * @param header
       * @param tClass
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:06
       */
      public static <T> T doGetWithProxy(
          String url, Map<String, String> header, Class<T> tClass, String ip, int   port)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpGet get = new HttpGet(url);
        RequestConfig c = get.getConfig();
        if (c == null) {
          c = RequestConfig.DEFAULT;
        }
        RequestConfig requestConfig = RequestConfig.copy(c).setProxy(new     HttpHost(ip, port)).build();
        get.setConfig(requestConfig);
        setHeader(get, header);
        return getResult(httpClient, get, tClass);
      }
    
      /**
       * 发送get请求 带参
       *
       * @param url
       * @param params
       * @param header
       * @param tClass
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:06
       */
      public static <T> T doGet(
          String url, Map<String, Object> params, Map<String, String> header,   Class<T> tClass)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpGet get = new HttpGet(dealUrl(url, params));
        setHeader(get, header);
        return getResult(httpClient, get, tClass);
      }
    
      /**
       * 下载文件
       *
       * @param url
       * @param header
       * @param filePath
       * @return void
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:06
       */
      public static void doGetFile(String url, Map<String, String> header, String   filePath)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpGet get = new HttpGet(url);
        setHeader(get, header);
        try (CloseableHttpResponse res = doExecute(httpClient, get)) {
          httpResponseToFile(res, filePath);
        } catch (IOException e) {
          e.printStackTrace();
          // 换成自己的统一异常处理方法,省得到处抛HttpClientException
          throw new HttpClientException("HTTP工具类IO异常");
        }
      }
    
      /**
       * 获取文件输入流
       *
       * @param url
       * @param header
       * @return java.io.InputStream
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:05
       */
      public static InputStream doGetFileInputStream(String url, Map<String, String>   header)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpGet get = new HttpGet(url);
        setHeader(get, header);
        try (CloseableHttpResponse res = doExecute(httpClient, get)) {
          return res.getEntity().getContent();
        } catch (IOException e) {
          e.printStackTrace();
          // aa//换成自己的统一异常处理方法,省得到处抛HttpClientException
          throw new HttpClientException("HTTP工具类IO异常");
        }
      }
    
      /**
       * 发送 application/x-www-form-urlencoded请求
       *
       * @param url
       * @param param
       * @param header
       * @param tClass
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:05
       */
      public static <T> T doPost(
          String url, Map<String, Object> param, Map<String, String> header,   Class<T> tClass)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpPost httpPost = new HttpPost(url);
        setHeader(httpPost, header);
        try {
          setUrlFormEntity(httpPost, param);
          return getResult(httpClient, httpPost, tClass);
        } catch (IOException e) {
          e.printStackTrace();
          // 换成自己的统一异常处理方法,省得到处抛HttpClientException
          throw new HttpClientException("HTTP工具类IO异常");
        }
      }
    
      /**
       * 发送application/json请求
       *
       * @param url
       * @param json
       * @param header
       * @param t
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:04
       */
      public static <T> T doPostJson(String url, String json, Map<String, String>   header, Class<T> t)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpPost httpPost = new HttpPost(url);
        setHeader(httpPost, header);
        setJsonEntity(httpPost, json);
        return getResult(httpClient, httpPost, t);
      }
    
      /**
       * form表单文件上传
       *
       * @param url
       * @param params
       * @param headers
       * @param t
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:23
       */
      public static <T> T doPostFormData(
          String url, Map<String, Object> params, Map<String, String> headers,   Class<T> t)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpPost httpPost = new HttpPost(url);
        setHeader(httpPost, headers);
        setFormDataEntity(httpPost, params);
        return getResult(httpClient, httpPost, t);
      }
    
      /**
       * 仅上传文件
       *
       * @param url
       * @param file
       * @param headers
       * @param tClass
       * @return T
       * @throws
       * @version V1.0.0
       * @date 2021/3/26 17:30
       */
      public static <T> T doPostFile(
          String url, File file, Map<String, String> headers, Class<T> tClass)
          throws HttpClientException {
        CloseableHttpClient httpClient = getHttpClient();
        HttpPost httpPost = new HttpPost(url);
        setHeader(httpPost, headers);
        ByteArrayEntity byteArrayEntity = null;
        try {
          if (file != null) {
            byteArrayEntity = new ByteArrayEntity(IoUtil.file2Byte(file));
          }
          httpPost.setEntity(byteArrayEntity);
          return getResult(httpClient, httpPost, tClass);
        } catch (IOException e) {
          e.printStackTrace();
          // 换成自己的统一异常处理方法,省得到处抛HttpClientException
          throw new HttpClientException("HTTP工具类IO异常");
        }
      }
    
      public static CloseableHttpClient getHttpClient() {
        return SingletonUtil.getSingletonHttpClientBuilder().build();
      }
    
      public static void setHeader(HttpRequestBase hb, Map<String, String> headers)   {
        if (headers != null) {
          for (String key : headers.keySet()) {
            hb.setHeader(key, headers.get(key));
          }
        }
      }
    
      private static CloseableHttpResponse doExecute(CloseableHttpClient hc,   HttpRequestBase hb)
          throws IOException {
        CloseableHttpResponse ch = hc.execute(hb);
        return ch;
      }
    
      private static String dealUrl(String url, Map<String, Object> params) {
        UrlEntity urlEntity = UrlUtil.parse(url);
        urlEntity.addParam(params);
        return urlEntity.toUrl();
      }
    
      public static void setUrlFormEntity(HttpPost httpPost, Map<String, Object>   param)
          throws UnsupportedEncodingException {
        if (param != null) {
          List<NameValuePair> paramList = new ArrayList<>();
          for (String key : param.keySet()) {
            paramList.add(new BasicNameValuePair(key,     String.valueOf(param.get(key))));
          }
          UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
          httpPost.setEntity(entity);
        }
      }
    
      public static void setJsonEntity(HttpPost httpPost, String json) {
        StringEntity entity = new StringEntity(json, StandardCharsets.UTF_8);
        entity.setContentType("application/json;charset=utf-8");
        httpPost.setEntity(entity);
      }
    
      public static void setFormDataEntity(HttpPost httpPost, Map<String, Object>   params) {
        MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create();
        mEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        mEntityBuilder.setCharset(StandardCharsets.UTF_8);
        ContentType textContent = ContentType.create("text/plain",     StandardCharsets.UTF_8);
        params.forEach(
            (k, v) -> {
              if (v instanceof File) {
                File file = (File) v;
                mEntityBuilder.addBinaryBody(k, file);
              } else if (v instanceof Collection) {
                Collection cl = (Collection) v;
                cl.stream()
                    .forEach(
                        c -> {
                          File f = (File) c;
                          mEntityBuilder.addBinaryBody(k, f);
                        });
              } else {
                mEntityBuilder.addTextBody(k, v.toString(), textContent);
              }
            });
        httpPost.setEntity(mEntityBuilder.build());
      }
    
      public static <T> boolean checkStringResult(Class<T> t) {
        if (String.class.isAssignableFrom(t)) {
          return true;
        }
        return false;
      }
    
      public static <T> boolean checkJsonObjectResult(Class<T> t) {
        return JSONObject.class.isAssignableFrom(t);
      }
    
      public static <T> boolean checkJsonArrayResult(Class<T> t) {
        return JSONArray.class.isAssignableFrom(t);
      }
    
      public static <T> T getResult(CloseableHttpClient hc, HttpRequestBase hb,   Class<T> t)
          throws HttpClientException {
        String s;
        try (CloseableHttpResponse res = doExecute(hc, hb)) {
          s = EntityUtils.toString(res.getEntity(), DEFAULT_CHARSET);
          log.info("URI:{}", hb.getURI().toString());
          log.info("RESULT:{}", s);
          if (checkStringResult(t)) {
            return (T) s;
          } else if (checkJsonObjectResult(t)) {
            return (T) JSONObject.parse(s);
          } else if (checkJsonArrayResult(t)) {
            return (T) JSONArray.parse(s);
          }
        } catch (IOException e) {
          e.printStackTrace();
          // 换成自己的统一异常处理方法,省得到处抛HttpClientException
          throw new HttpClientException("HTTP工具类IO异常");
        }
        return JSON.parseObject(s, t);
      }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建方便安全的HttpClient工具类 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • stable diffusion图片资源分享和模型推荐,好用的模型有哪些呢?

    前言 这篇文章主要是分享我的图片和推荐一些好用的模型 模型不在多在于精 基于几个好的大模型适当下载一下LORA模型 就能画出非常好的图片 多话不说 图片分享 简单展示 详情请看 https space bilibili com 109890
  • 编程艺术 - 第二章 、俩个字符串是否包含问题以及扩展

    1 题目 假设这有一个各种字母组成的字符串 假设这还有另外一个字符串 而且这个字符串里的字 母数相对少一些 从算法是讲 什么方法能最快的查出所有小字符串里的字母在大字符串里 都有 比如 如果是下面两个字符串 String 1 ABCDEFG
  • 串联型PID,并联型PID与标准型PID简要说明

    串联型PID 并联型PID与标准型PID简要说明1 PID广泛应用于工业生产各个环节 然而对于不同PID结构会有一些差异 导致在调参时若按照常规的经验调试 结果将会有非常大的不同 串联型PID Serial PID 串联型PID的三个环节由
  • JMeter安装配置

    JMeter安装配置 安装小记 1 JMeter下载 2 环境变量配置 安装小记 1 JMeter下载 直接下载的链接 https download csdn net download weixin 43554548 80965649 官网
  • 一份简短又全面的数学建模技能图谱:常用模型&算法总结

    声明一下 下述内容的多数链接出自一本教材 司守奎 数学建模算法与应用 第二版的PDF版本 改成转载需要给出原创链接 实属无意冒犯 pdf版教材链接 百度网盘 https pan baidu com s 1TEYSW5ZImQU4Sy7Om2
  • 利用 Python 结合 UI 来模拟实现多人聊天

    一 界面功能展示 1 设置一个通信 用户1 2 设置通信 用户2 3 进入聊天功能界面 4 发送信息来实现实时通信 二 代码实现 1 服务器端 服务器需要能够与客户机进行直接通信 客户机之间不需要能够通信 服务器需要配置监听的IP 0 0
  • Qt5开发工具---常用Qt5开发工具(附下载地址)

    文章目录 一 简述 二 Qt界面开发工具 1 QT设计师 三 Qss控件美化工具 1 QSS Editor 2 Qss Stylesheet Editor 3 qtawesome icon broswer 四 官方文档 1 Qt官方文档 2
  • react如何实现数据渲染

    React数据渲染是指将组件中的数据映射到页面上 以展示出来 在React中 数据渲染通常是通过JSX和组件的state或props完成的 JSX是一个类似HTML的语法 可以在其中嵌入JavaScript表达式 在JSX中 可以使用 包裹
  • 关于数据库意向锁与封锁粒度若干问

    我们所说的加锁是谁对谁加锁 是事务T对某个封锁对象加锁 封锁对象的大小被称为封锁的粒度 这个对象可以是数据库 关系 也可以是元组 为什么要引入多粒度锁协议 封锁粒度大 系统被封锁的对象越少 并发度越小 系统开销越小 封锁粒度越小 系统被封锁
  • DB2:”因为未能分配专用虚拟内存,所以请求失败“错误的解决方法

    是在创建数据库的时候遇到的这个问题 解决方法作个记录 SQL1219N 因为未能分配专用虚拟内存 所以请求失败 SQLSTATE 57011 解决方法 1 DOS命令行中执行 db2set DB2 EXTSECURITY NO 2 重启DB
  • feign在DTO传参时GET请求自动转成POST请求

    文章目录 场景 解决 场景 1 网关请求发送到后端从GET变成了POST 2 代码如下 使用openfeign发请求时 发现GET请求转成了POST FeignClient name pd auth server fallback Reso
  • Java 程序员必须了解的 7 个性能指标

    来源 王韵菲 www evget com article 2015 11 16 22990 html 本文中 小编搜集了7个最有影响的衡量标注 让你可以不依赖日志文件来了解应用程序 现在 让我们看看这些性能指标 并了解如何查看并收集它们 1
  • linux 服务器搭建 elasticsearch(一)

    1 安装java jdk 环境 查看可安装版本 yum y list java 选择一个java版本进行安装 这里我们希望安装java1 8 因为我们的机器是64位的 所以选择安装java 1 8 0 openjdk devel x86 6
  • Linux编程复习(3)——信号与中断

    信号是响应某些状况而产生的事件 进程在接收到信号时会采取相应的行动 某些状况就是指某些条件错误 如内存段冲突 浮点处理器错误或者非法指令等 信号是在软件层次上对中断的一种模拟 所以信号也称为是软中断 信号与中断的相似点 1 都采用相同的额异
  • OpencvX.X中Mat与IplImage类型的相互转换

    1 Opencv4 x中Mat与IplImage的转换 1 Mat转IPLImage IplImage img cvIplImage mat 2 IplImage转Mat Mat cvarrToMat const CvArr arr boo
  • 从异步调用返回响应:多语言指南

    Asynchronous调用是现代编程的基础 可以有效地处理可能需要时间的任务 例如网络请求或文件操作 然而 response从这些asynchronous电话中获取信息可能会让新手感到困惑 在本指南中 我们将探讨如何从不同编程语言的异步调
  • 4款堪称神器的电脑黑科技软件,让人相见恨晚

    Syncthing 一款免费的开源跨平台文件同步客户端 服务器工具 支持Linux Windows OSX FreeBSD以及Solaris等系统 具有一个强大的响应式的网页管理界面 能够帮助用户简便地添加 删除和管理通过网络进行同步的文件
  • TX2上如何查看cuda版本

    如果知道安装的路径 一般都是在local下 可以直接查看 nvidia tegra ubuntu cat usr local cuda version txt CUDA Version 9 0 252 能看到机器上的CUDA版本是9 0 2
  • 国家级、省、市专精特新申报条件汇总

    国家级专精特新硬性条件 1 企业成立3年及以上 2 企业从业人员1000人以下或营业收入40000万元以下 3 已认定为省级专精特新 不硬性规定 有优先推荐权 4 截至上年末的近2 年主营业务收入或净利润的平均增长率达到5 以上 企业资产负
  • 构建方便安全的HttpClient工具类

    构建方便安全的HttpClient工具类 前言 开始 引入核心依赖 其它依赖 封装工具类 1 UrlEntity 2 HttpClientException 3 IoUtil 4 UrlUtil 5 SingletonUtil 开始构建 6