Java 中文官方教程 2022 版(四十五)(4)

简介: Java 中文官方教程 2022 版(四十五)

Java 中文官方教程 2022 版(四十五)(3)https://developer.aliyun.com/article/1488410

列出网络接口地址

原文:docs.oracle.com/javase/tutorial/networking/nifs/listing.html

从网络接口获取的最有用的信息之一是分配给它的 IP 地址列表。您可以通过使用两种方法之一从NetworkInterface实例中获取此信息。第一种方法getInetAddresses()返回一个InetAddressEnumeration。另一种方法getInterfaceAddresses()返回一个java.net.InterfaceAddress实例的列表。当您需要有关接口地址的更多信息时,可以使用此方法。例如,当地址是 IPv4 地址时,您可能需要有关子网掩码和广播地址的附加信息,以及在 IPv6 地址的情况下的网络前缀长度。

以下示例程序列出了计算机上所有网络接口及其地址:

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;
public class ListNets {
    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }
    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
}  

以下是示例程序的输出样本:

Display name: TCP Loopback interface
Name: lo
InetAddress: /127.0.0.1
Display name: Wireless Network Connection
Name: eth0
InetAddress: /192.0.2.0

网络接口参数

原文:docs.oracle.com/javase/tutorial/networking/nifs/parameters.html

你可以访问有关网络接口的网络参数,除了分配给它的名称和 IP 地址之外。

你可以使用isUP()方法来发现网络接口是否处于“up”(即运行)状态。以下方法指示网络接口类型:

  • isLoopback()指示网络接口是否为环回接口。
  • isPointToPoint()指示接口是否为点对点接口。
  • isVirtual()指示接口是否为虚拟接口。

supportsMulticast()方法指示网络接口是否支持多播。getHardwareAddress()方法在可用时返回网络接口的物理硬件地址,通常称为 MAC 地址。getMTU()方法返回最大传输单元(MTU),即最大数据包大小。

以下示例在列出网络接口地址的基础上,通过添加本页描述的额外网络参数进行了扩展:

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;
public class ListNetsEx {
    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }
    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("Up? %s\n", netint.isUp());
        out.printf("Loopback? %s\n", netint.isLoopback());
        out.printf("PointToPoint? %s\n", netint.isPointToPoint());
        out.printf("Supports multicast? %s\n", netint.supportsMulticast());
        out.printf("Virtual? %s\n", netint.isVirtual());
        out.printf("Hardware address: %s\n",
                    Arrays.toString(netint.getHardwareAddress()));
        out.printf("MTU: %s\n", netint.getMTU());
        out.printf("\n");
     }
}

以下是示例程序的输出样本:

Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /129.156.225.59
Up? true
Loopback? false
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: [0, 3, 4, 5, 6, 7]
MTU: 1500
Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
Up? true
Loopback? true
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: null
MTU: 8232

课程:处理 Cookies

原文:docs.oracle.com/javase/tutorial/networking/cookies/index.html

虽然您可能已经熟悉 cookies,但您可能不知道如何在您的 Java 应用程序中充分利用它们。本课程将引导您了解 cookies 的概念,并解释如何设置 cookie 处理程序,以便您的 HTTP URL 连接将使用它。

Java SE 为此功能提供了一个主要类,java.net.CookieHandler,以及以下支持类和接口:java.net.CookieManagerjava.net.CookiePolicyjava.net.CookieStore,和 java.net.HttpCookie

使用 Cookies 进行 HTTP 状态管理

本页面描述了 cookies 并解释了它们如何用于提供会话。

CookieHandler 回调机制

当您访问网站时,本页面解释了 cookie 处理程序是如何被调用以及如何设置 cookie 处理程序。

默认 CookieManager

Java SE 提供了一个默认的 cookie 处理程序实现,在大多数情况下都足够使用,并且高度可定制。

自定义 CookieManager

这里有一些如何自定义 cookie 策略并编写自己的 cookie 存储的示例。

使用 Cookies 进行 HTTP 状态管理

原文:docs.oracle.com/javase/tutorial/networking/cookies/definition.html

HTTP 状态管理机制指定了一种通过 HTTP 请求和响应创建有状态会话的方式。

通常,HTTP 请求/响应对是相互独立的。然而,状态管理机制使得可以交换状态信息的客户端和服务器将这些对放入更大的上下文中,这被称为会话。用于创建和维护会话的状态信息被称为cookie

一个 cookie 是可以存储在浏览器缓存中的数据片段。如果您访问一个网站然后再次访问它,cookie 数据可以用来识别您为回访者。Cookies 使得状态信息,比如在线购物车,可以被记住。一个 cookie 可以是短期的,保存数据一个网页会话,也就是直到您关闭浏览器,或者一个 cookie 可以是长期的,保存数据一周或一年。

关于 HTTP 状态管理的更多信息,请参阅RFC 2965: HTTP 状态管理机制

CookieHandler 回调机制

原文:docs.oracle.com/javase/tutorial/networking/cookies/cookiehandler.html

Java SE 中通过 java.net.CookieHandler 类实现了 HTTP 状态管理。CookieHandler 对象提供了一个回调机制,在 HTTP 协议处理程序中提供 HTTP 状态管理策略的实现。也就是说,使用 HTTP 协议的 URL,例如 new URL("http://example.com"),将使用 HTTP 协议处理程序。如果设置了 CookieHandler 对象,此协议处理程序将回调到 CookieHandler 对象以处理状态管理。

CookieHandler 类是一个抽象类,具有两对相关方法。第一对方法,getDefault()setDefault(cookieHandler),是静态方法,允许您发现当前安装的处理程序并安装自己的处理程序。

没有安装默认处理程序,安装处理程序是在系统范围内进行的。对于在安全环境中运行的应用程序,即已安装了安全管理器的应用程序,您必须具有特殊权限才能获取和设置处理程序。有关更多信息,请参阅 java.net.CookieHandler.getDefault

第二对相关方法,put(uri, responseHeaders)get(uri, requestHeaders),允许您为指定的 URI 在响应/请求头中设置和获取所有适用的 cookie 到 cookie 缓存中。这些方法是抽象的,CookieHandler 的具体实现必须提供实现。

Java Web Start 和 Java Plug-in 都安装了默认的 CookieHandler。但是,如果您正在运行一个独立的应用程序并希望启用 HTTP 状态管理,您必须设置一个系统范围的处理程序。本课程的下两页将向您展示如何操作。

默认 CookieManager

原文:docs.oracle.com/javase/tutorial/networking/cookies/cookiemanager.html

java.net.CookieManager提供了CookieHandler的具体实现,对于大多数用户来说,足以处理 HTTP 状态管理。CookieManager将 cookie 的存储与接受、拒绝的策略分开。CookieManager通过java.net.CookieStorejava.net.CookiePolicy进行初始化。CookieStore管理 cookie 的存储。CookiePolicy根据策略决定是否接受或拒绝 cookie。

以下代码显示了如何创建并设置系统范围的CookieManager

java.net.CookieManager cm = new java.net.CookieManager();
java.net.CookieHandler.setDefault(cm);

第一行调用默认的CookieManager构造函数创建实例。第二行调用CookieHandler的静态setDefault方法来设置系统范围的处理程序。

默认的CookieManager构造函数创建一个具有默认 cookie 存储和接受策略的新CookieManager实例。CookieStore是存储任何接受的 HTTP cookie 的地方。如果在创建时未指定,CookieManager实例将使用内部的内存实现。这种实现不是持久的,只存在于 Java 虚拟机的生命周期内。需要持久存储的用户必须实现自己的存储。

CookieManager使用的默认 cookie 策略是CookiePolicy.ACCEPT_ORIGINAL_SERVER,只接受来自原始服务器的 cookie。因此,服务器的Set-Cookie响应必须设置“domain”属性,并且必须与 URL 中的主机域匹配。有关更多信息,请参阅java.net.HttpCookie.domainMatches。需要不同策略的用户必须实现CookiePolicy接口,并将其传递给CookieManager构造函数,或者通过使用setCookiePolicy(cookiePolicy)方法将其设置为已构造的CookieManager实例。

在从 cookie 存储中检索 cookie 时,CookieManager还执行来自RFC 2965第 3.3.4 节的路径匹配规则。因此,cookie 还必须设置其“path”属性,以便在从 cookie 存储中检索 cookie 之前应用路径匹配规则。

总之,CookieManager提供了处理 cookie 的框架,并为CookieStore提供了良好的默认实现。通过允许您设置自己的CookieStoreCookiePolicy或两者,CookieManager具有高度的可定制性。

自定义 CookieManager

原文:docs.oracle.com/javase/tutorial/networking/cookies/custom.html

CookieManager 类的两个方面可以定制,即 CookiePolicyCookieStore

CookiePolicy

为方便起见,CookiePolicy 定义了以下预定义的接受 cookie 的策略:

  • CookiePolicy.ACCEPT_ORIGINAL_SERVER 仅接受来自原始服务器的 cookie。
  • CookiePolicy.ACCEPT_ALL 接受所有 cookie。
  • CookiePolicy.ACCEPT_NONE 不接受任何 cookie。
  • 你还可以通过实现CookiePolicyshouldAccept方法来定义自己的 cookie 策略。然后,通过将其传递给多参数CookieManager构造函数或调用setCookiePolicy(cookiePolicy)方法来使用此CookiePolicy更改已经存在的 cookie 管理器。以下是一个拒绝来自黑名单域的 cookie,然后应用CookiePolicy.ACCEPT_ORIGINAL_SERVER策略的示例:
import java.net.*;
public class BlacklistCookiePolicy implements CookiePolicy {
    String[] blacklist;
    public BlacklistCookiePolicy(String[] list) {
        blacklist = list;
    }
    public boolean shouldAccept(URI uri, HttpCookie cookie)  {
        String host;
        try {
            host =  InetAddress.getByName(uri.getHost()).getCanonicalHostName();
        } catch (UnknownHostException e) {
            host = uri.getHost();
        }
        for (int i = 0; i<blacklist.length; i++) {
      if (HttpCookie.domainMatches(blacklist[i], host)) {
                return false;
            }
        }
        return CookiePolicy.ACCEPT_ORIGINAL_SERVER.shouldAccept(uri, cookie);
    }
}
  • 当你创建一个BlacklistCookiePolicy实例时,你需要传递一个表示不希望接受来自的域的字符串数组。然后,将此BlacklistCookiePolicy实例设置为CookieManager的 cookie 策略。例如:
String[] list = new String[]{ ".example.com" };
CookieManager cm = new CookieManager(null, new BlacklistCookiePolicy(list));
CookieHandler.setDefault(cm);
  • 此示例代码将不接受来自以下主机的 cookie:
host.example.com
domain.example.com
  • 然而,此示例代码将接受来自以下主机的 cookie:
example.com
example.org
myhost.example.org
  • CookieStoreCookieStore是一个代表存储 cookie 的接口。CookieManager为每个 HTTP 响应添加 cookie 到CookieStore,并为每个 HTTP 请求从CookieStore检索 cookie。你可以实现此接口以提供自己的CookieStore并在创建时将其传递给CookieManager。在创建CookieManager实例后无法设置CookieStore。但是,你可以通过调用CookieManager.getCookieStore()来获取对 cookie 存储的引用。这样做很有用,因为它使你能够利用 Java SE 提供的默认内存中CookieStore实现,并补充其功能。例如,你可能想创建一个持久性 cookie 存储,以便保存 cookie,即使 Java 虚拟机重新启动也可以使用。你的实现方式类似于以下方式:
  1. 之前保存的任何 cookie 都将被读取。
  2. 在运行时,cookie 被存储和检索到内存中。
  3. 在退出之前,cookie 被写入持久存储。
  • 以下是此 cookie 存储的不完整示例。此示例展示了如何利用 Java SE 默认的内存中 cookie 存储,并如何扩展其功能。
import java.net.*;
import java.util.*;
public class PersistentCookieStore implements CookieStore, Runnable {
    CookieStore store;
    public PersistentCookieStore() {
        // get the default in memory cookie store
        store = new CookieManager().getCookieStore();
        // todo: read in cookies from persistant storage
        // and add them store
        // add a shutdown hook to write out the in memory cookies
        Runtime.getRuntime().addShutdownHook(new Thread(this)); 
    }
    public void run() {
        // todo: write cookies in store to persistent storage
    }
    public void add(URI uri, HttpCookie cookie) {
        store.add(uri, cookie);
    }
    public List<HttpCookie> get(URI uri) {
        return store.get(uri);
    }
    public List<HttpCookie> getCookies() {
        return store.getCookies();
    }
    public List<URI> getURIs() {
        return store.getURIs();
    }
    public boolean remove(URI uri, HttpCookie cookie) {
        return store.remove(uri, cookie);
    }
    public boolean removeAll()  {
        return store.removeAll();
    }
}

Trail: Bonus

原文:docs.oracle.com/javase/tutorial/extra/index.html

,引入于 J2SE 5.0,是对类型系统的期待已久的增强。它允许类型或方法在各种类型的对象上操作,同时提供编译时类型安全性。它为集合框架添加了编译时类型安全性,并消除了强制转换的繁琐工作。

教你关于 J2SE™版本 1.4 的一个强大功能,允许程序员暂停窗口系统,以便直接在屏幕上进行绘图。编写游戏或其他图形密集型应用程序的程序员应该阅读这个教训。

提供了关于培训资源的信息,并列出了教程中涵盖潜在考试主题的部分。

课程:泛型

原文:docs.oracle.com/javase/tutorial/extra/generics/index.html

作者:吉拉德·布拉查

J2SE 5.0 中引入的这一期待已久的类型系统增强允许类型或方法在提供编译时类型安全性的同时操作各种类型的对象。它为集合框架添加了编译时类型安全性,并消除了强制类型转换的繁琐工作。

介绍

定义简单的泛型

泛型和子类型化

通配符

泛型方法

与旧代码的互操作

详细信息

类文字作为运行时类型标记

更多有趣的通配符

将旧代码转换为使用泛型

致谢

介绍

原文:docs.oracle.com/javase/tutorial/extra/generics/intro.html

JDK 5.0 引入了 Java 编程语言的几个新扩展之一就是泛型

本教程是关于泛型的介绍。您可能熟悉其他语言中类似构造的概念,尤其是 C++的模板。如果是这样,您会发现有相似之处,也有重要的区别。如果您对其他地方类似的构造不熟悉,那就更好了;您可以从头开始,无需消除任何误解。

泛型允许您对类型进行抽象。最常见的例子是容器类型,比如在 Collections 层次结构中的类型。

这是一个典型的使用方式:

List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3  

第 3 行的强制类型转换略显烦人。通常,程序员知道特定列表中放入了什么类型的数据。然而,强制类型转换是必不可少的。编译器只能保证迭代器返回一个Object。为了确保将其分配给类型为Integer的变量是类型安全的,需要进行强制类型转换。

当然,强制类型转换不仅引入了混乱。它还引入了运行时错误的可能性,因为程序员可能会犯错。

如果程序员能够真正表达他们的意图,并将列表标记为仅包含特定数据类型,会怎么样?这就是泛型背后的核心思想。以下是使用泛型给出的程序片段的一个版本:

List<Integer> 
    myIntList = new LinkedList<Integer>(); // 1'
myIntList.add(new Integer(0)); // 2'
Integer x = myIntList.iterator().next(); // 3'

注意变量myIntList的类型声明。它指定这不仅仅是一个任意的List,而是一个IntegerList,写作List。我们说List是一个接受类型参数的泛型接口–在这种情况下是Integer。我们在创建列表对象时也指定了类型参数。

注意,第 3 行的强制类型转换已经消失了。

现在,您可能会认为我们所做的只是将混乱的地方移动了一下。在第 3 行进行Integer的强制类型转换,我们在第 1 行将Integer作为类型参数。然而,这里有一个非常大的区别。编译器现在可以在编译时检查程序的类型正确性。当我们说myIntList声明为类型List时,这告诉我们关于变量myIntList的一些信息,无论何时何地使用它,编译器都会保证这一点。相比之下,强制类型转换告诉我们程序员认为在代码中的某个单一点上是正确的。

整体效果,尤其是在大型程序中,是提高了可读性和健壮性。

相关文章
|
3天前
|
机器学习/深度学习 移动开发 测试技术
《手把手教你》系列技巧篇(五十一)-java+ selenium自动化测试-字符串操作-下篇(详解教程)
【5月更文挑战第15天】自动化测试中进行断言的时候,我们可能经常遇到的场景。从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言。这个时候就需要我们对字符串进行操作,宏哥这里介绍两种方法:正则和字符串切片函数split()。
18 2
|
10天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
【5月更文挑战第3天】本文介绍了如何在Web自动化测试中使用JavaScript执行器(JavascriptExecutor)来完成Selenium API无法处理的任务。首先,需要将WebDriver转换为JavascriptExecutor对象,然后通过executeScript方法执行JavaScript代码。示例用法包括设置JS代码字符串并调用executeScript。文章提供了两个实战场景:一是当时间插件限制输入时,用JS去除元素的readonly属性;二是处理需滚动才能显示的元素,利用JS滚动页面。还给出了一个滚动到底部的代码示例,并提供了详细步骤和解释。
35 10
|
10天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
26 0
|
1天前
|
前端开发 JavaScript 测试技术
《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-上篇(详细教程)
【5月更文挑战第17天】本文介绍了在Web自动化测试中处理文件上传操作的方法。Selenium的WebDriver未提供直接的API来处理文件上传,因为这涉及到操作系统级别的窗口交互,而WebDriver无法识别非Web元素。文件上传主要分为两类:基于input控件的上传和非input控件的上传。对于input控件,可以直接使用sendKeys()方法输入文件的绝对路径来模拟选择文件。在项目实战中,给出了一个简单的HTML页面和对应的Java代码示例,展示了如何使用Selenium选取并上传文件。
7 0
|
2天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(五十二)-java+ selenium自动化测试-处理面包屑(详细教程)
【5月更文挑战第16天】本文介绍了网页面包屑导航的概念、作用及其实现方式。面包屑导航是一种用户界面元素,帮助用户理解他们在网站中的位置并方便返回。通常形式为“首页>分类>子分类>内容页”,最多三层结构。在自动化测试中,处理面包屑涉及获取层级关系和当前层级,可以通过查找包含面包屑的div或ul元素,再提取其中的链接来实现。文中还提供了一个基于HTML和JavaScript的简单示例,并展示了相应的自动化测试代码设计和运行结果。
10 0
|
4天前
|
搜索推荐 Java 测试技术
《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)
【5月更文挑战第14天】本文介绍了自动化测试中如何从字符串中提取特定信息,主要讲解了两种方法:正则表达式和字符串切片操作。文章提供了一个测试场景,即在搜索引擎中搜索“北京宏哥”并比较百度和必应的搜索结果数量。通过字符串切片函数`split()`,可以从搜索结果的描述中提取出数字。代码示例展示了如何使用Java实现这个功能,包括在百度和必应的搜索页面获取结果数量,并进行比较。文章最后还简单提到了其他字符串截取的方法,如`substring()`和`StringUtils`类中的方法。
19 2
|
5天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十九)-java+ selenium自动化测试-隐藏元素定位与操作(详解教程)
【5月更文挑战第13天】本文主要讨论了在Selenium自动化测试中如何处理前端隐藏元素的问题。隐藏元素通常是通过`type="hidden"`或`style="display: none;"`属性实现的,它们在页面上不可见,但仍然存在于HTML代码中。Selenium可以定位到这些隐藏元素,但无法直接进行点击、输入等操作,会报错“ElementNotInteractableException”。
28 3
|
6天前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
【5月更文挑战第12天】本文介绍了WebDriver中用于判断元素状态的三个方法:`isEnabled()`、`isSelected()`和`isDisplayed()`。`isSelected()`检查元素是否被选中,通常用于勾选框。`isDisplayed()`则用来判断元素是否在页面上可见。`isEnabled()`方法确定元素是否可操作,例如是否能点击或输入内容。
17 1
|
7天前
|
存储 JavaScript Java
《手把手教你》系列技巧篇(四十七)-java+ selenium自动化测试-判断元素是否显示(详解教程)
【5月更文挑战第11天】WebDriver 的 `isDisplayed()` 方法用于检查页面元素是否可见,如果元素存在于DOM中且可视,返回`true`,否则返回`false`。在自动化测试中,这个方法常用于验证元素是否真正显示在页面上。示例代码展示了如何使用 `isDisplayed()` 判断百度登录页面的特定错误提示文字是否出现。
18 1
|
8天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
22 2