zoukankan      html  css  js  c++  java
  • JDK_API剖析之java.net包

    为实现网络应用程序提供类。(按照字母顺序排序)

    1、Authenticator

    • 抽象类
    • 自1.2开始有
    • 无父类和接口
    • Authenticator 类表示懂得如何获得网络连接验证的对象。通常,它通过提示用户输入信息来完成此操作。应用程序通过重写子类中的 getPasswordAuthentication() 使用此类。此方法通常使用各种 getXXX() 访问器方法获取关于请求验证的实体的信息。然后,它必须通过与用户交互或者某些其他非交互手段获取用户名和密码。之后凭据将以 PasswordAuthentication 返回值的形式返回。接下来通过调用 setDefault(Authenticator) 向系统注册此具体子类的实例。需要进行验证时,系统将调用其中一个 requestPasswordAuthentication() 方法,这些方法将依次调用注册对象的 getPasswordAuthentication() 方法。请求验证的所有方法都有一个失败的默认实现

    2、BindException

    • 类、异常
    • 自1.1开始有
    • 继承SocketException
    • 试图将套接字绑定到本地地址和端口时发生错误的情况下,抛出此异常。这些错误通常发生在端口正在使用中或无法分配所请求的本地地址时。

    3、CacheRequest

    • 抽象类
    • 自1.5开始有
    • 无父类和接口
    • 表示在 ResponseCache 中存储资源的通道。这种类的实例提供一个 OutputStream 对象,协议处理程序可以调用该对象来将资源数据存储到缓存中;另外还提供一个 abort() 方法,该方法允许中断和放弃缓存存储操作。如果从缓存读取响应或将响应写入缓存时遇到 IOException,则将中止当前缓存存储操作。

    4、CacheResponse

    • 抽象类
    • 自1.5开始有
    • 无父类和接口
    • 表示从 ResponseCache 获取资源的通道。这种类的实例提供返回实体正文的 InputStream,同时提供一个返回关联响应头的 getHeaders() 方法。

    5、ConnectException

    • 类、异常
    • 自1.1开始有
    • 继承SocketException
    • 试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。这些错误通常发生在拒绝远程连接时(例如,没有任何进程在远程地址/端口上进行侦听)。

    6、ContentHandler

    • 抽象类
    • 自1.0开始有
    • 无父
    • 抽象类 ContentHandler 是从 URLConnection 读取 Object 的所有类的超类。应用程序一般不直接调用此类中的 getContent 方法。而是调用 URLURLConnection 类中的 getContent 方法。应用程序的内容处理程序工厂(实现 ContentHandlerFactory 接口的类的实例,该接口通过调用 setContentHandler 设置)通过某个 String 来调用,该 String 给出将在套接字上接收的对象的 MIME 类型。工厂返回 ContentHandler 的子类的实例,并调用其 getContent 方法创建对象。

    7、ContentHandlerFactory

    • 接口
    • 自1.0开始有
    • 无父
    • 此接口定义内容处理程序的工厂。此接口的实现应该将 MIME 类型映射到 ContentHandler 的实例中。URLStreamHandler 类使用此接口创建 MIME 类型的 ContentHandler

    • 创建从 URLStreamHandler 读取对象的新 ContentHandler的方法createContentHandler(String mimetype)

    8、CookieHandler

    • 抽象类
    • 自1.5开始有
    • 无父
    • CookieHandler 对象提供一种回调机制以将 HTTP 状态管理策略实现挂钩到 HTTP 协议处理程序。HTTP 状态管理机制利用 HTTP 请求和响应指定创建有状态的会话的方式。

      可以通过执行 CookieHandler.setDefault(CookieHandler) 来注册 HTTP 协议处理程序要使用的系统级 CookieHandler。调用 CookieHandler.getDefault() 可以获取当前注册的 CookieHandler。 有关 HTTP 状态管理的更多信息,请参见 RFC 2965: HTTP 状态管理机制

    9、CookieManager

    • 抽象类
    • 自1.6开始有
    • 继承CookieHandler
    • CookieManager 提供 CookieHandler 的具体实现,它将 cookie 的存储区与围绕接受和拒绝 cookie 的策略分离开来。使用管理存储的 CookieStore 以及做出 cookie 接受/拒绝决策的 CookiePolicy 对象来初始化 CookieManager。

      java.net 包中的 HTTP cookie 管理如下所示:

      use
      CookieHandler <------- HttpURLConnection
             ^
      | impl
      |         use
      CookieManager -------> CookiePolicy
      |   use
      |--------> HttpCookie
                   |              ^
      |              | use
      |   use        |
      |--------> CookieStore
                                  ^
      | impl
                                  |
      Internal in-memory implementation 

    10、CookiePolicy

    • 接口
    • 自1.6开始有
    • 无父
    • CookiePolicy 实现决定应该接受哪个 cookie 以及应该拒绝哪个 cookie。提供了三种预定义的策略实现,即 ACCEPT_ALL、ACCEPT_NONE 和ACCEPT_ORIGINAL_SERVER。

    11、CookieStore

    • 接口
    • 自1.6开始有
    • 无父
    • 表示 cookie 存储区的 CookieStore 对象。可以存储和获取 cookie。CookieManager 将调用 CookieStore.add 为每个传入的 HTTP 响应保存 cookie,调用 CookieStore.get 为每个传出的 HTTP 请求获取 cookie。CookieStore 负责移除已过期的 HttpCookie 实例。

    12、DatagramPacket

    • final类
    • 自1.0开始有
    • 无父
    • 此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

    13、DatagramSocket

    • 自1.0开始有
    • 无父
    • 此类表示用来发送和接收数据报包的套接字。

      数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

      在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

      示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于:DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket。

    14、DatagramSocketImpl

    • 抽象类
    • 自1.1开始有
    • 实现SocketOptions
    • 数据报和多播套接字实现的抽象基类。

    15、DatagramSocketImplFactory

    • 接口
    • 自1.3开始有
    • 无父
    • 此接口定义用于数据报套接字实现的工厂。DatagramSocket 类使用它来创建实际的套接字实现。

    • 方法DatagramSocketImpl  createDatagramSocketImpl()

    16、FileNameMap

    • 接口
    • 自1.3开始有
    • 无父
    • 提供在文件名和 MIME 类型字符串之间进行映射的机制的简单接口。

    • 方法String getContentTypeFor(String fileName),获取指定文件名的 MIME 类型。

    17、HttpRetryException

    • 类、异常
    • 自1.5开始有
    • 继承IOException
    • 抛出此异常指示 HTTP 请求需要重试,但由于启用了流模式而无法自动重试。

    18、HttpCookie

    • final类
    • 自1.6开始有
    • 实现Cloneable
    • HttpCookie 对象表示一个 http cookie,该 cookie 带有服务器和用户代理之间的状态信息。广泛采用 Cookie 来创建有状态 (stateful) 会话。

    19、HttpURLConnection

    • 抽象类
    • 自1.1开始有
    • 继承URLConnection
    • 支持 HTTP 特定功能的 URLConnection。有关详细信息,请参阅 the spec 。每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。

    20、IDN

    • final类
    • 自1.6开始有
    • 无父
    • 提供在普通 Unicode 表示形式和 ASCII 兼容性编码 (ACE) 表示形式之间进行国际化域名 (IDN) 转换的方法。国际化域名可以使用整个 Unicode 范围内的字符,而传统域名只限于 ASCII 字符。ACE 是只使用 ASCII 字符的 Unicode 字符串编码方式,能够与只识别传统域名的软件(如 Domain Name System)一起使用。

    21、Inet4Address

    • final类
    • 自1.4开始有
    • 继承InetAddress
    • 此类表示 Internet Protocol version 4 (IPv4) 地址。此类是由 RFC 790:Assigned NumbersRFC 1918:Address Allocation for Private InternetsRFC 2365:Administratively Scoped IP Multicast 定义的。

      IP 地址的文本表示形式

      用作方法输入的 IPv4 地址的文本表示形式采取以下形式之一:

      d.d.d.d
      d.d.d
      d.d
      d

      当指定四个部分时,将每个部分解释为一个数据字节,并从左到右分配给 IPv4 地址的四个字节。

      当指定三部分地址时,将最后一个部分解释为 16 位量,并放置在网络地址的最右边两个字节。这使得三部分地址格式便于将 Class B 网络地址指定为 128.net.host。

      当提供两部分地址时,将最后一个部分解释为 24 位量,并放置在网络地址的最右边三个字节。这使得两部分地址格式便于将 Class A 网络地址指定为 net.host。

      当仅给出一个部分时,值被直接存储在网络地址中,无需进行字节重排。

      对于将文本表示形式作为输出值返回的方法而言,使用第一种形式,即使用以点分隔的四个字符串。

    22、Inet6Address

    • final类
    • 自1.4开始有
    • 继承InetAddress
    • 此类表示互联网协议第 6 版 (IPv6) 地址。

    23、InetAddress

    • 自1.0开始有
    • 实现Serializable
    • 此类表示互联网协议 (IP) 地址。

    24、InetSocketAddress

    • 自1.0开始有
    • 继承SocketAddress
    • 此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。它提供不可变对象,供套接字用于绑定、连接或用作返回值。通配符 是一个特殊的本地 IP 地址。它通常表示“任何”,只能用于 bind 操作。

    25、InterfaceAddress

    • 自1.6开始有
    • 无父
    • 此类表示网络接口地址。简言之,对于 IPv4 地址,是指 IP 地址、子网掩码和广播地址。对于 IPv6 地址,是指 IP 地址和网络前缀长度。

    26、JarURLConnection

    • 抽象类
    • 自1.2开始有
    • 继承URLConnection
    • 连接到 Java ARchive (JAR) 文件或 JAR 文件中条目的 URL Connection。JarURLConnection 实例只能用于从 JAR 文件读取内容。使用此类获取 OutputStream 从而修改或写入基础 JAR 文件是不可能的。

      JAR URL 的语法为:

       jar:<url>!/{entry} 

    27、MalformedURLException

    • 类、异常
    • 自1.0开始有
    • 继承IOException
    • 抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法解析字符串。

    28、MulticastSocket

    • 自1.1开始有
    • 继承DatagramSocket
    • 多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0239.255.255.255 的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。将消息发送到多播组时,该主机和端口的 所有预定接收者都将接收到消息(在数据包的生存时间范围内,请参阅下文)。套接字不必成为多播组的成员即可向其发送消息。当套接字预定多播组/端口时,它将接收由该组/端口的其他主机发送的数据报,像该组和端口的所有其他成员一样。套接字通过 leaveGroup(InetAddress addr) 方法放弃组中的成员资格。多个 MulticastSocket 可以同时预定多播组和端口,并且都会接收到组数据报。

    29、NetPermission

    • 自1.1开始有
    • 继承BasePermission
    • 此类可用于各种网络权限。NetPermission 包含一个名称(也称为“目标名称”),但没有动作列表;可能有指定的权限,也可能没有。目标名称是网络权限的名称(参见以下内容)。命名约定遵守层次结构属性命名约定。另外,名称的末尾可能有一个星号,星号前有一个 ".",用来表示通配符。例如:"foo.*" 或 "*" 是有效的,而 "*foo" 或 "a*b" 则无效。

    30、NetworkInterface

    • 自1.4开始有
    • 无父
    • 此类表示一个由名称和分配给此接口的 IP 地址列表组成的网络接口。它用于标识加入多播组的本地接口。 接口通常是按名称(如 "le0")区分的。

    31、NoRouteToHostException

    • 类、异常
    • 自1.1开始有
    • 继承SocketException
    • 试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。通常为无法到达远程主机,原因是防火墙干扰或者中间路由器停机。

    32、PasswordAuthentication

    • final类
    • 自1.2开始有
    • 无父
    • PasswordAuthentication 类是供 Authenticator 使用的数据持有者。它只是用户名和密码的存储库。

    33、PortUnreachableException

    • 类、异常
    • 自1.4开始有
    • 继承SocketException
    • 在连接的数据报上已接收到 ICMP Port Unreachable 消息时,抛出该异常。

    34、ProtocolException

    • 类、异常
    • 自1.0开始有
    • 继承IOException
    • 抛出此异常指示在底层协议中存在错误,如 TCP 错误。

    35、Proxy

    • 自1.0开始有
    • 无父
    • 此类表示代理设置,通常为类型(http、socks)和套接字地址。Proxy 是不可变对象。

    36、ProxySelector

    • 抽象类
    • 自1.5开始有
    • 无父
    • 连接到 URL 引用的网络资源时选择要使用的代理服务器(如果有)。代理选择器是此类的具体子类,通过调用 setDefault 方法注册。当前注册的代理选择器可以通过调用 getDefault 方法获得。例如,注册代理选择器时,URLConnection 类的子类应该调用每个 URL 请求的 select 方法,这样代理选择器便可以决定应该使用直接连接还是代理连接。select 方法返回使用首选连接方法的连接上的迭代器。如果无法建立到代理(PROXY 或 SOCKS)服务器的连接,则调用方应该调用代理选择器的 connectFailed 方法来通知代理选择器,代理服务器不可用。

    37、ResponseCache

    • 抽象类
    • 自1.5开始有
    • 无父
    • 表示 URLConnection 缓存的实现。这种类的实例可以通过执行 ResponseCache.setDefault(ResponseCache) 向系统注册,系统将调用此对象以便:

      • 将从外部源获得的资源数据存储到缓存中
      • 试图获取可能存储在缓存中的请求资源

      ResponseCache 实现决定应该缓存的资源和缓存它们的时间。如果无法从缓存获得请求资源,则协议处理程序将从其初始位置获取该资料。 URLConnection#useCaches 的设置控制着是否允许协议使用缓存的响应。 有关 HTTP 缓存的更多信息,请参见 RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1

    38、SecureCacheResponse

    • 抽象类
    • 自1.5开始有
    • 继承CacheResponse
    • 表示最初通过安全方法(如 TLS)获得的缓存响应。

    39、ServerSocket

    • 自1.0开始有
    • 无父
    • 此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

    40、Socket

    • 自1.0开始有
    • 无父
    • 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

    41、SocketAddress

    • 抽象类
    • 自1.4开始有
    • 实现Serializable
    • 此类表示不带任何协议附件的 Socket Address。作为一个抽象类,应通过特定的、协议相关的实现为其创建子类。它提供不可变对象,供套接字用于绑定、连接或用作返回值。

    • 没有任何方法定义

    42、SocketException

    • 类、异常
    • 自1.0开始有
    • 继承IOException
    • 抛出此异常指示在底层协议中存在错误,如 TCP 错误。

    43、SocketImpl

    • 抽象类
    • 自1.0开始有
    • 实现SocketOptions
    • 抽象类 SocketImpl 是实际实现套接字的所有类的通用超类。创建客户端和服务器套接字都可以使用它。“普通”套接字严格按描述实现这些方法,无需尝试通过防火墙或代理。

    44、SocketImplFactory

    • 接口
    • 自1.0开始有
    • 无父
    • 此接口定义用于套接字实现的工厂。SocketServerSocket 类使用它来创建实际的套接字实现。

    45、SocketOptions

    • 接口
    • 自1.0开始有
    • 无父
    • 获取/设置套接字选项的方法的接口。此接口由 SocketImplDatagramSocketImpl 实现。它们的子类应该重写此接口的方法来支持它们自己的选项。在此接口中指定选项的方法和常量仅用于实现目的。如果不为 SocketImpl 或 DatagramSocketImpl 创建子类,就不要直接使用它们。在 Socket、ServerSocket、DatagramSocket 和 MulticastSocket 中,存在获取/设置所有这些选项的类型安全的方法。

    46、SocketPermission

    • final类
    • 自1.0开始有
    • 继承Permission,实现Serializable
    • 此类表示通过套接字对网络的访问。SocketPermission 由主机规范和一组指定到该主机的连接方式的“动作”组成。

    47、SocketTimeoutException

    • 类、异常
    • 自1.0开始有
    • 继承InterruptedIOException
    • 如果在读取或接受套接字时发生超时,则抛出此异常。

    48、UnknownHostException

    • 类、异常
    • 自1.0开始有
    • 继承IOException
    • 指示主机 IP 地址无法确定而抛出的异常。

    49、URI

    • final类
    • 自1.0开始有
    • 实现Comparable< URI>, Serializable
    • 表示一个统一资源标识符 (URI) 引用。

    50、URL

    • final类
    • 自1.0开始有
    • 实现Serializable
    • URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

    51、URLClassLoader

    • 自1.2开始有
    • 继承SecureClassLoader
    • 该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。这里假定任何以 '/' 结束的 URL 都是指向目录的。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件。创建 URLClassLoader 实例的 AccessControlContext 线程将在后续加载类和资源时使用。为加载的类默认授予只能访问 URLClassLoader 创建时指定的 URL 的权限。

    52、URLConnection

    • 抽象类
    • 自1.0开始有
    • 无父
    • 抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:

      openConnection()connect()
      对影响到远程资源连接的参数进行操作。 与资源交互;查询头字段和内容。
      ---------------------------->
      时间
      1. 通过在 URL 上调用 openConnection 方法创建连接对象。
      2. 处理设置参数和一般请求属性。
      3. 使用 connect 方法建立到远程对象的实际连接。
      4. 远程对象变为可用。远程对象的头字段和内容变为可访问。

      使用以下方法修改设置参数:

      • setAllowUserInteraction
      • setDoInput
      • setDoOutput
      • setIfModifiedSince
      • setUseCaches

      使用以下方法修改一般请求属性:

      • setRequestProperty

      使用 setDefaultAllowUserInteractionsetDefaultUseCaches 可设置 AllowUserInteractionUseCaches 参数的默认值。

      上面每个 set 方法都有一个用于获取参数值或一般请求属性值的对应 get 方法。适用的具体参数和一般请求属性取决于协议。

      在建立到远程对象的连接后,以下方法用于访问头字段和内容:

      • getContent
      • getHeaderField
      • getInputStream
      • getOutputStream

      某些头字段需要经常访问。以下方法:

      • getContentEncoding
      • getContentLength
      • getContentType
      • getDate
      • getExpiration
      • getLastModifed

      提供对这些字段的便捷访问。getContent 方法使用 getContentType 方法以确定远程对象类型;子类重写 getContentType 方法很容易。

      一般情况下,所有的预连接参数和一般请求属性都可忽略:预连接参数和一般请求属性默认为敏感值。对于此接口的大多数客户端而言,只有两个需要的方法:getInputStreamgetContent,它们通过便捷方法镜像到 URL 类中。

    53、URLDecoder

    • 自1.2开始有
    • 无父
    • HTML 格式解码的实用工具类。该类包含了将 String 从 application/x-www-form-urlencoded MIME 格式解码的静态方法。

      该转换过程正好与 URLEncoder 类使用的过程相反。假定已编码的字符串中的所有字符为下列之一:"a" 到 "z"、"A" 到 "Z"、"0" 到 "9" 和 "-"、"_"、"." 以及 "*"。允许有 "%" 字符,但是将它解释为特殊转义序列的开始。

      转换中使用以下规则:

      • 字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
      • 特殊字符 "."、"-"、"*" 和 "_" 保持不变。
      • 加号 "+" 转换为空格字符 " "。
      • 将把 "%xy" 格式序列视为一个字节,其中 xy 为 8 位的两位十六进制表示形式。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。

      该解码器处理非法字符串有两种可能的方法。一种方法是不管该非法字符,另一种方法是抛出 IllegalArgumentException 异常。解码器具体采用哪种方法取决于实现。

    54、URLEncoder

    • 自1.0开始有
    • 无父
    • HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。有关 HTML 格式编码的更多信息,请参阅 HTML 规范。

      对 String 编码时,使用以下规则:

      • 字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
      • 特殊字符 "."、"-"、"*" 和 "_" 保持不变。
      • 空格字符 " " 转换为一个加号 "+"。
      • 所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。

      例如,使用 UTF-8 编码机制,字符串 "The string ü@foo-bar" 将转换为 "The+string+%C3%BC%40foo-bar",因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。

    55、URLStreamHandler

    • 抽象类
    • 自1.0开始有
    • 无父
    • 抽象类 URLStreamHandler 是所有流协议处理程序的通用超类。流协议处理程序知道如何为特定的协议类型,如 httpftpgopher 进行连接。在大多数情况下,URLStreamHandler 子类的实例都不是由应用程序直接创建的。而是在构造 URL 过程中第一次遇到协议名称时,自动加载适当的流协议处理程序。

  • 相关阅读:
    编程总结2
    编程总结3
    《秋季学期学习总结》
    《人生路上对我影响最大的三位老师》
    第八周编程总结
    第七周编程总结
    第六周编程总结
    第五周作业
    第四周编程总结
    第三周编程总结
  • 原文地址:https://www.cnblogs.com/yang75n/p/8446397.html
Copyright © 2011-2022 走看看