Java中获取网络数据的多种最佳实践方法

 更新时间:2026年06月26日 09:19:57   作者:yaoxin521123  
这篇文章主要介绍了Java中从网络获取数据的不同方法,包括HttpClient、InputStream、transferTo和JSON库读取JSON数据等适用于Web应用和微服务场景的网络数据获取需求,需要的朋友可以参考下

在实际开发中,尤其是 Web 应用微服务 场景下,我们经常需要从网络上获取数据,例如:

  • 下载网页 HTML
  • 获取 JSON API 数据
  • 下载图片或其他二进制文件

Java 提供了多种方式来完成这些操作。

1. 使用 HttpClient(现代方式,Java 11+)

如果你需要设置 请求头 或读取 响应头,推荐用 HttpClient

HttpClient client = HttpClient.newBuilder().build();

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://horstmann.com/index.html"))
    .GET()
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

String result = response.body();
System.out.println(result);

✅ 特点:

  • 支持异步(sendAsync
  • 可以方便地添加 Header(如 Authorization
  • 对 REST API 特别适合

2. 快速获取网页内容(只要数据)

如果只想获取数据,而不关心 HTTP 细节,可以直接用 输入流

try (InputStream in = new URI("https://horstmann.com/index.html").toURL().openStream()) {
    byte[] bytes = in.readAllBytes();
    String result = new String(bytes);
    System.out.println(result);
}

👉 好处:

  • 简洁,一行代码搞定。
  • 适合只下载资源,不需要复杂 HTTP 配置的场景。

3. 下载文件(直接写入磁盘)

想把网络资源保存为文件,可以用 transferTo

try (InputStream in = new URI("https://horstmann.com/index.html").toURL().openStream();
     OutputStream out = Files.newOutputStream(Path.of("index.html"))) {
    in.transferTo(out);
}

✅ 特点:

  • 不需要写循环(传统方式需要 while ((read = in.read(buffer)) != -1))。
  • 简洁高效。

4. 读取 JSON(以 Jackson 为例)

很多 JSON 库(如 JacksonGson)都支持直接从 URL 读取数据:

URL url = new URI("https://dog.ceo/api/breeds/image/random").toURL();
Map<String, Object> result = com.fasterxml.jackson.jr.ob.JSON.std.mapFrom(url);

System.out.println(result);
// {message=https://images.dog.ceo/breeds/...jpg, status=success}

5. 下载并读取图片

假设我们刚从 API 获取到一张狗狗的图片 URL:

URL imgUrl = new URI(result.get("message").toString()).toURL();
BufferedImage img = javax.imageio.ImageIO.read(imgUrl);

// 输出图片宽高
System.out.println("Width: " + img.getWidth());
System.out.println("Height: " + img.getHeight());

👉 这里 直接传 URLImageIO.read 更好,
因为库可以根据 URL 提供的附加信息(如 MIME 类型)来判断图片格式,而不是仅仅依赖字节流。

6. 总结对比

方式适用场景示例
HttpClientREST API,复杂请求添加 headers、处理 JSON
InputStream + readAllBytes()快速获取网页/文件内容new URI(...).toURL().openStream()
transferTo下载文件in.transferTo(Files.newOutputStream(path))
JSON 库(Jackson/Gson)直接解析 APIJSON.std.mapFrom(url)
ImageIO.read(URL)下载图片自动识别图片格式

课堂练习建议

  1. 写一个程序,下载 https://www.example.com 的网页内容并保存到 example.html
  2. 调用 https://dog.ceo/api/breeds/image/random,解析 JSON,获取狗狗图片 URL,然后下载到本地。
  3. HttpClient 向一个 REST API 发送请求,带上自定义 Header(比如 User-Agent),打印返回的 JSON。

到此这篇关于Java中获取网络数据的多种最佳实践方法的文章就介绍到这了,更多相关Java获取网络数据最佳方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入解析Java的设计模式编程中建造者模式的运用

    深入解析Java的设计模式编程中建造者模式的运用

    这篇文章主要介绍了深入解析Java的设计模式编程中建造者模式的运用,同时文中也介绍了建造者模式与工厂模式的区别,需要的朋友可以参考下
    2016-02-02
  • MyBatis中insert操作返回主键的实现方法

    MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数。这篇文章主要介绍了MyBatis中insert操作返回主键的方法,需要的朋友可以参考下
    2016-09-09
  • java类加载机制、类加载器、自定义类加载器的案例

    java类加载机制、类加载器、自定义类加载器的案例

    这篇文章主要介绍了java类加载机制、类加载器、自定义类加载器的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • MyBatis批量插入数据过程解析

    MyBatis批量插入数据过程解析

    这篇文章主要介绍了MyBatis批量插入数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • MyBatis框架迭代器模式实现原理解析

    MyBatis框架迭代器模式实现原理解析

    这篇文章主要介绍了MyBatis框架迭代器模式实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 在Spring Boot中处理文件上传功能实现

    在Spring Boot中处理文件上传功能实现

    这篇文章主要介绍了如何在Spring Boot中处理文件上传,通过配置文件上传属性、创建控制器来处理上传的文件,并通过异常处理器来管理错误情况,可以快速实现文件上传功能,需要的朋友可以参考下
    2024-06-06
  • 本地启动RocketMQ未映射主机名产生的超时问题最新解决方案

    本地启动RocketMQ未映射主机名产生的超时问题最新解决方案

    这篇文章主要介绍了本地启动RocketMQ未映射主机名产生的超时问题,本文给大家分享最新解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • java调用第三方接口实现流式输出的示例代码

    java调用第三方接口实现流式输出的示例代码

    本文主要介绍了java调用第三方接口实现流式输出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • JDK21中虚拟线程到底是什么以及用法总结(看完便知)

    JDK21中虚拟线程到底是什么以及用法总结(看完便知)

    这篇文章主要给大家介绍了关于JDK21中虚拟线程到底是什么以及用法的相关资料,虚拟线程是一种轻量化的线程封装,由jvm直接调度和管理,反之普通的线程其实是调用的操作系统的能力,对应的是操作系统级的线程,需要的朋友可以参考下
    2023-12-12
  • Mybatis中的@Select、foreach用法

    Mybatis中的@Select、foreach用法

    这篇文章主要介绍了Mybatis中的@Select、foreach用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论