Module  java.base
软件包  java.net

Class URLConnection

  • 已知直接子类:
    HttpURLConnectionJarURLConnection


    public abstract class URLConnection
    extends Object
    抽象类URLConnection是表示应用程序和URL之间的通信链接的所有类的超类。 该类的实例可以用于从URL引用的资源中读取和写入。 通常,创建与URL的连接是一个多步骤过程:
    Describes the process of creating a connection to a URL: openConnection() and connect() over time. openConnection() connect() Manipulate parameters that affect the connection to the remote resource. Interact with the resource; query header fields and contents.
    ---------------------------->
    时间
    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
    • getLastModified

    提供方便的访问这些领域。 getContentType方法由getContent方法用于确定远程对象的类型; 子类可能会方便地覆盖getContentType方法。

    在常见情况下,所有预连接参数和一般请求属性都可以忽略:预连接参数和请求属性默认为明智的值。 对于这个界面的大多数客户端,只有两个有趣的方法: getInputStreamgetContent ,它们通过方便的方法镜像在URL类中。

    有关http连接的请求属性和标头字段的更多信息,请参见:

     http://www.ietf.org/rfc/rfc2616.txt
     
    调用close()的方法InputStreamOutputStream一个的URLConnection的请求后,可能释放与此实例相关联的网络资源,除非特定的协议规范为其指定不同的行为。
    从以下版本开始:
    1.0
    另请参见:
    URL.openConnection()connect()getContent()getContentEncoding()getContentLength()getContentType()getDate()getExpiration()getHeaderField(int)getHeaderField(java.lang.String)getInputStream()getLastModified()getOutputStream()setAllowUserInteraction(boolean)setDefaultUseCaches(boolean)setDoInput(boolean)setDoOutput(boolean)setIfModifiedSince(long)setRequestProperty(java.lang.String, java.lang.String)setUseCaches(boolean)
    • 字段详细信息

      • url

        protected URL url
        URL表示打开此连接的万维网上的远程对象。

        该字段的值可以通过getURL方法访问。

        该变量的默认值是URLConnection构造函数中的URL参数的值。

        另请参见:
        getURL()url
      • doInput

        protected boolean doInput
        此变量由setDoInput方法设置。 其值由getDoInput返回。

        URL连接可用于输入和/或输出。 doInput标志设置为true表示应用程序打算从URL连接中读取数据。

        该字段的默认值为true

        另请参见:
        getDoInput()setDoInput(boolean)
      • doOutput

        protected boolean doOutput
        此变量由setDoOutput方法设置。 其值由getDoOutput方法返回。

        URL连接可用于输入和/或输出。 doOutput标志设置为true表示应用程序打算将数据写入URL连接。

        该字段的默认值为false

        另请参见:
        getDoOutput()setDoOutput(boolean)
      • allowUserInteraction

        protected boolean allowUserInteraction
        如果是true ,这个URL正在上下文中进行检查,其中允许用户交互(例如弹出认证对话)是有意义的。 如果是false ,则不允许用户交互。

        该字段的值可以通过setAllowUserInteraction方法设置。 其值由getAllowUserInteraction方法返回。 其默认值是上次调用setDefaultAllowUserInteraction方法中的参数的值。

        另请参见:
        getAllowUserInteraction()setAllowUserInteraction(boolean)setDefaultAllowUserInteraction(boolean)
      • ifModifiedSince

        protected long ifModifiedSince
        某些协议支持跳过对象的提取,除非对象在某个时间以前已被更新。

        非零值给出了1970年1月1日GMT之后的毫秒数。 该对象只有在最近被修改的时间才被提取。

        此变量由setIfModifiedSince方法设置。 其值由getIfModifiedSince方法返回。

        该字段的默认值为0 ,表示提取必须始终发生。

        另请参见:
        getIfModifiedSince()setIfModifiedSince(long)
      • connected

        protected boolean connected
        如果是false ,则此连接对象尚未创建指定URL的通信链接。 如果是true ,通信链路已建立。
    • 构造方法详细信息

      • URLConnection

        protected URLConnection​(URL url)
        构造与指定URL的URL连接。 与URL引用的对象的连接不会创建。
        参数
        url - 指定的URL。
    • 方法详细信息

      • getFileNameMap

        public static FileNameMap getFileNameMap​()
        从数据文件加载文件名映射(模拟)。 它将首先尝试加载由“content.types.user.table”属性定义的用户特定表。 如果失败,它会尝试加载默认内置表。
        结果
        FileNameMap
        从以下版本开始:
        1.2
        另请参见:
        setFileNameMap(java.net.FileNameMap)
      • setFileNameMap

        public static void setFileNameMap​(FileNameMap map)
        设置FileNameMap。

        如果有安全管理员,则该方法首先调用安全管理员的checkSetFactory方法,以确保允许操作。 这可能会导致SecurityException。

        参数
        map - 要设置的FileNameMap
        异常
        SecurityException - 如果存在安全管理员,并且其 checkSetFactory方法不允许该操作。
        从以下版本开始:
        1.2
        另请参见:
        SecurityManager.checkSetFactory()getFileNameMap()
      • connect

        public abstract void connect​()
                              throws IOException
        打开与此URL引用的资源的通信链接,如果此类连接尚未建立。

        如果connect当连接已经打开方法被调用(由表示connected具有值字段true ),通话将被忽略。

        URLConnection对象经历两个阶段:首先创建它们,然后它们被连接。 在创建之后,在连接之前,可以指定各种选项(例如doInput和UseCaches)。 连接后,尝试设置它们是一个错误。 依赖于连接的操作(如getContentLength)将在必要时隐式执行连接。

        异常
        SocketTimeoutException - 如果在建立连接之前超时时间超时
        IOException - 如果在打开连接时发生I / O错误。
        另请参见:
        connectedgetConnectTimeout()setConnectTimeout(int)
      • setConnectTimeout

        public void setConnectTimeout​(int timeout)
        设置打开与此URLConnection引用的资源的通信链接时使用的指定超时值(以毫秒为单位)。 如果在建立连接之前超时超时,则引发java.net.SocketTimeoutException。 超时为零被解释为无限超时。

        这种方法的一些非标准实现可能会忽略指定的超时。 要查看连接超时设置,请调用getConnectTimeout()。

        参数
        timeout - 一个 int ,以毫秒为单位指定连接超时值
        异常
        IllegalArgumentException - 如果timeout参数为负
        从以下版本开始:
        1.5
        另请参见:
        getConnectTimeout()connect()
      • getConnectTimeout

        public int getConnectTimeout​()
        返回连接超时的设置。

        0返回意味着该选项被禁用(即无限超时)。

        结果
        一个表示连接超时值(毫秒)的 int
        从以下版本开始:
        1.5
        另请参见:
        setConnectTimeout(int)connect()
      • setReadTimeout

        public void setReadTimeout​(int timeout)
        将读取超时设置为指定的超时时间,以毫秒为单位。 非零值指定当连接建立到资源时从Input stream读取的超时。 如果在数据可用于读取之前超时超时,则会引发java.net.SocketTimeoutException。 超时为零被解释为无限超时。

        此方法的一些非标准实现忽略指定的超时。 要查看读取超时集,请调用getReadTimeout()。

        参数
        timeout - 一个 int ,指定要以毫秒为单位的超时值
        异常
        IllegalArgumentException - 如果timeout参数为负
        从以下版本开始:
        1.5
        另请参见:
        getReadTimeout()InputStream.read()
      • getReadTimeout

        public int getReadTimeout​()
        返回读取超时的设置。 0返回意味着该选项被禁用(即无限超时)。
        结果
        一个 int ,表示读取超时值(以毫秒为单位)
        从以下版本开始:
        1.5
        另请参见:
        setReadTimeout(int)InputStream.read()
      • getURL

        public URL getURL​()
        返回此 URLConnectionURL字段的值。
        结果
        该值为 URLConnectionURL字段。
        另请参见:
        url
      • getContentLength

        public int getContentLength​()
        返回content-length标题字段的值。

        注意getContentLengthLong()应该优于此方法,因为它返回一个long ,因此更便于携带。

        结果
        如果内容长度未知,或者内容长度大于Integer.MAX_VALUE,则该连接的URL引用的资源的内容长度为 -1
      • getContentLengthLong

        public long getContentLengthLong​()
        返回 content-length标题字段的值为long。
        结果
        该连接的URL引用的资源的内容长度,如果内容长度未知, -1
        从以下版本开始:
        1.7
      • getContentType

        public String getContentType​()
        返回 content-type标题字段的值。
        结果
        URL引用的资源的内容类型,如果不知道, null
        另请参见:
        getHeaderField(java.lang.String)
      • getContentEncoding

        public String getContentEncoding​()
        返回 content-encoding标题字段的值。
        结果
        URL引用的资源的内容编码,如果不知道, null
        另请参见:
        getHeaderField(java.lang.String)
      • getExpiration

        public long getExpiration​()
        返回 expires标题字段的值。
        结果
        该URL引用的资源的到期日期,如果不知道,则为0。 值为1970年1月1日GMT以来的毫秒数。
        另请参见:
        getHeaderField(java.lang.String)
      • getDate

        public long getDate​()
        返回 date标题字段的值。
        结果
        URL引用的资源的发送日期,如果不知道, 0 返回的值是自1970年1月1日GMT以来的毫秒数。
        另请参见:
        getHeaderField(java.lang.String)
      • getLastModified

        public long getLastModified​()
        返回last-modified标题字段的值。 结果是自1970年1月1日GMT以来的毫秒数。
        结果
        URLConnection引用的资源的日期是最后一次修改,如果不知道,则为0。
        另请参见:
        getHeaderField(java.lang.String)
      • getHeaderField

        public String getHeaderField​(String name)
        返回命名头字段的值。

        如果对可能不同的值多次设置相同标题的连接进行调用,则只返回最后一个值。

        参数
        name - 标题字段的名称。
        结果
        命名头字段的值,如果在标题中没有这样的字段, null
      • getHeaderFields

        public Map<String,List<String>> getHeaderFields​()
        返回不可修改的标题字段的映射。 Map键是表示响应头字段名称的字符串。 每个Map值是一个不可修改的字符串列表,表示相应的字段值。
        结果
        头字段地图
        从以下版本开始:
        1.4
      • getHeaderFieldInt

        public int getHeaderFieldInt​(String name,
                                     int Default)
        返回被解析为命名字段的值。

        存在此形式的getHeaderField ,因为某些连接类型(例如, http-ng )具有预解析头。 该连接类型的类可以覆盖此方法并使解析短路。

        参数
        name - 标题字段的名称。
        Default - 默认值。
        结果
        命名字段的值,解析为整数。 如果字段丢失或格式错误,则返回Default值。
      • getHeaderFieldLong

        public long getHeaderFieldLong​(String name,
                                       long Default)
        返回被解析为命名字段的值。

        存在此形式的getHeaderField ,因为某些连接类型(例如, http-ng )具有预解析头。 该连接类型的类可以覆盖此方法并使解析短路。

        参数
        name - 标题字段的名称。
        Default - 默认值。
        结果
        命名字段的值,解析为长。 如果字段丢失或格式错误,则返回Default值。
        从以下版本开始:
        1.7
      • getHeaderFieldDate

        public long getHeaderFieldDate​(String name,
                                       long Default)
        返回以日期解析的命名字段的值。 结果是自1970年1月1日GMT以指定字段表示的毫秒数。

        存在这种形式的getHeaderField ,因为某些连接类型(例如, http-ng )具有预分析头。 该连接类型的类可以覆盖此方法并使解析短路。

        参数
        name - 标题字段的名称。
        Default - 默认值。
        结果
        该字段的值被解析为日期。 如果字段丢失或格式错误,则返回Default参数的值。
      • getHeaderFieldKey

        public String getHeaderFieldKey​(int n)
        返回的关键n th头字段。 如果少于n+1字段,则返回null
        参数
        n - 一个索引,其中 n>=0
        结果
        键为 n th头字段,或者 null ,如果有不是较少 n+1字段。
      • getHeaderField

        public String getHeaderField​(int n)
        返回的值n th头字段。 如果少于n+1字段,则返回null

        该方法可以与getHeaderFieldKey方法结合使用,以遍历消息中的所有头。

        参数
        n - 一个索引,其中 n>=0
        结果
        所述的值 n th头字段或 null ,如果有少于 n+1字段
        另请参见:
        getHeaderFieldKey(int)
      • getContent

        public Object getContent​()
                          throws IOException
        检索此URL连接的内容。

        该方法首先通过调用getContentType方法来确定对象的内容类型。 如果这是应用程序第一次看到特定内容类型,则会创建该内容类型的内容处理程序。

        这样做如下:

        1. 如果应用程序使用setContentHandlerFactory方法设置了内容处理程序工厂实例,那么createContentHandler内容类型作为参数调用该实例的createContentHandler方法; 结果是该内容类型的内容处理程序。
        2. 如果还没有设置ContentHandlerFactory ,或者如果工厂的createContentHandler方法返回null ,则使用ServiceLoader机制来使用系统类加载器来定位ContentHandlerFactory实现。 工厂所在的订单是具体实施,实施可以自由地缓存位于工厂的工厂。 一个ServiceConfigurationErrorError或者RuntimeException从抛出createContentHandler ,如果遇到,将传播到调用线程。 每个工厂的createContentHandler方法(如果被实例化)都被调用,内容类型,直到工厂返回非空,或者所有工厂都已用尽。
        3. 否则,此方法尝试加载由ContentHandler定义的内容处理程序类。 如果类不存在,或者不是ContentHandler的子类,那么抛出一个UnknownServiceException
        结果
        提取对象。 应使用instanceof操作符来确定返回的对象的具体类型。
        异常
        IOException - 如果在获取内容时发生I / O错误。
        UnknownServiceException - 如果协议不支持内容类型。
        另请参见:
        ContentHandlerFactory.createContentHandler(java.lang.String)getContentType()setContentHandlerFactory(java.net.ContentHandlerFactory)
      • getPermission

        public Permission getPermission​()
                                 throws IOException
        返回一个权限对象,该对象表示创建此对象所表示的连接所需的权限。 如果不需要权限进行连接,此方法返回null。 默认情况下,此方法返回java.security.AllPermission 子类应该覆盖此方法,并返回最能代表连接到URL所需的权限的权限。 例如, URLConnection表示file: URL将返回java.io.FilePermission对象。

        返回的权限可能取决于连接的状态。 例如,连接前的许可可能与连接后的许可不同。 例如,HTTP服务器(如foo.com)可能将连接重定向到不同的主机,例如bar.com。 连接之前连接权限将代表连接到foo.com所需的权限,连接后返回的权限将是bar.com。

        权限通常用于两个目的:保护通过URLConnections获取的对象的缓存,并检查收件人了解特定URL的权限。 在第一种情况下,在获得对象应该获得许可。 例如,在HTTP连接中,这将表示连接到最终获取数据的主机的权限。 在第二种情况下,应连接获得并测试许可。

        结果
        表示由该URLConnection表示的连接所需的权限的许可对象。
        异常
        IOException - 如果权限的计算需要网络或文件I / O,并在计算时发生异常。
      • getInputStream

        public InputStream getInputStream​()
                                   throws IOException
        返回从此打开的连接读取的输入流。 如果读取超时在数据可用于读取之前超时,则可以从返回的输入流中读取SocketTimeoutException。
        结果
        从这个打开的连接读取的输入流。
        异常
        IOException - 如果在创建输入流时发生I / O错误。
        UnknownServiceException - 如果协议不支持输入。
        另请参见:
        setReadTimeout(int)getReadTimeout()
      • getOutputStream

        public OutputStream getOutputStream​()
                                     throws IOException
        返回写入此连接的输出流。
        结果
        一个写入此连接的输出流。
        异常
        IOException - 如果在创建输出流时发生I / O错误。
        UnknownServiceException - 如果协议不支持输出。
      • toString

        public String toString​()
        返回此URL连接的 String表示。
        重写:
        toStringObject
        结果
        这个 URLConnection的字符串表示 URLConnection
      • setDoInput

        public void setDoInput​(boolean doinput)
        将此URLConnectiondoInput字段的值设置为指定值。

        URL连接可用于输入和/或输出。 如果您打算使用URL连接进行输入,请将DoInput标志设置为true,否则返回false。 默认值为true。

        参数
        doinput - 新的价值。
        异常
        IllegalStateException - 如果已连接
        另请参见:
        doInputgetDoInput()
      • getDoInput

        public boolean getDoInput​()
        返回这个 URLConnectiondoInput标志的值。
        结果
        该值为 URLConnectiondoInput标志。
        另请参见:
        setDoInput(boolean)
      • setDoOutput

        public void setDoOutput​(boolean dooutput)
        将此URLConnectiondoOutput字段的值设置为指定值。

        URL连接可用于输入和/或输出。 如果您打算使用URL连接输出,请将DoOutput标志设置为true,否则返回false。 默认值为false。

        参数
        dooutput - 新的价值。
        异常
        IllegalStateException - 已连接
        另请参见:
        getDoOutput()
      • getDoOutput

        public boolean getDoOutput​()
        返回此值 URLConnectiondoOutput标志。
        结果
        该值为 URLConnectiondoOutput标志。
        另请参见:
        setDoOutput(boolean)
      • setAllowUserInteraction

        public void setAllowUserInteraction​(boolean allowuserinteraction)
        设置这个 URLConnectionallowUserInteraction字段的 URLConnection
        参数
        allowuserinteraction - 新值。
        异常
        IllegalStateException - 如果已经连接
        另请参见:
        getAllowUserInteraction()
      • getAllowUserInteraction

        public boolean getAllowUserInteraction​()
        返回此对象的 allowUserInteraction字段的值。
        结果
        该对象的 allowUserInteraction字段的值。
        另请参见:
        setAllowUserInteraction(boolean)
      • setDefaultAllowUserInteraction

        public static void setDefaultAllowUserInteraction​(boolean defaultallowuserinteraction)
        将所有将来的 URLConnection对象的 allowUserInteraction字段的默认值设置为指定的值。
        参数
        defaultallowuserinteraction - 新值。
        另请参见:
        getDefaultAllowUserInteraction()
      • getDefaultAllowUserInteraction

        public static boolean getDefaultAllowUserInteraction​()
        返回allowUserInteraction字段的默认值。

        默认是“粘性”,是所有URLConnections的静态状态的一部分。 此标志适用于下一个,以及创建的所有以下URLConnections。

        结果
        默认值为 allowUserInteraction字段。
        另请参见:
        setDefaultAllowUserInteraction(boolean)
      • setUseCaches

        public void setUseCaches​(boolean usecaches)
        将此URLConnectionuseCaches字段的值设置为指定值。

        一些协议执行缓存文档。 偶尔,重要的是能够“通过”并忽略高速缓存(例如浏览器中的“重新加载”按钮)。 如果连接上的UseCaches标志为true,则允许连接使用任何可以缓存的缓存。 如果是false,缓存将被忽略。 默认值来自DefaultUseCaches,默认值为true。 也可以使用setDefaultUseCaches(String,boolean)设置每个协议的默认值。

        参数
        usecaches - 表示是否允许缓存的 boolean
        异常
        IllegalStateException - 如果已连接
        另请参见:
        getUseCaches()
      • getUseCaches

        public boolean getUseCaches​()
        返回此 URLConnectionuseCaches字段的值。
        结果
        该值为 URLConnectionuseCaches字段。
        另请参见:
        setUseCaches(boolean)
      • setIfModifiedSince

        public void setIfModifiedSince​(long ifmodifiedsince)
        将此 URLConnectionifModifiedSince字段的值设置为指定值。
        参数
        ifmodifiedsince - 新值。
        异常
        IllegalStateException - 如果已连接
        另请参见:
        getIfModifiedSince()
      • getIfModifiedSince

        public long getIfModifiedSince​()
        返回此对象的 ifModifiedSince字段的值。
        结果
        该对象的 ifModifiedSince字段。
        另请参见:
        setIfModifiedSince(long)
      • getDefaultUseCaches

        public boolean getDefaultUseCaches​()
        返回默认值为URLConnectionuseCaches标志。

        这个默认值是“粘性”,是所有URLConnections的静态状态的一部分。 此标志适用于下一个,以及创建的所有以下URLConnections。 每个协议可以使用setDefaultUseCaches(String,boolean)覆盖此默认值

        结果
        默认值为 useCaches标志为 URLConnection
        另请参见:
        setDefaultUseCaches(boolean)
      • setDefaultUseCaches

        public static void setDefaultUseCaches​(String protocol,
                                               boolean defaultVal)
        将命名协议的useCaches字段的默认值设置为给定值。 该值将覆盖给定协议的setDefaultUseCaches(boolean)设置的任何默认设置。 对此方法的连续调用会更改设置,并影响该协议的所有未来连接的默认值。 协议名称不区分大小写。
        参数
        protocol - 设置默认的协议
        defaultVal - 是否为给定协议默认启用高速缓存
        从以下版本开始:
        9
      • getDefaultUseCaches

        public static boolean getDefaultUseCaches​(String protocol)
        返回给定协议的useCaches标志的默认值。 如果为给定协议调用了setDefaultUseCaches(String,boolean) ,则返回该值。 否则,如果调用了setDefaultUseCaches(boolean) ,则返回该值。 如果两个方法都没有被调用,则返回值为true 协议名称不区分大小写。
        参数
        protocol - 需要其defaultUseCaches设置的协议
        结果
        给定协议的默认值为 useCaches标志。
        从以下版本开始:
        9
      • setRequestProperty

        public void setRequestProperty​(String key,
                                       String value)
        设置一般请求属性。 如果具有密钥的属性已存在,则使用新值覆盖其值。

        注意:HTTP需要所有请求属性,它们可以合法地使用相同键的多个实例来使用逗号分隔的列表语法,这样可以将多个属性附加到单个属性中。

        参数
        key - 请求已知的关键字(例如,“ Accept ”)。
        value - 与之相关联的值。
        异常
        IllegalStateException - 如果已连接
        NullPointerException - 如果键是 null
        另请参见:
        getRequestProperty(java.lang.String)
      • addRequestProperty

        public void addRequestProperty​(String key,
                                       String value)
        添加由键值对指定的一般请求属性。 此方法不会覆盖与相同键相关联的现有值。
        参数
        key - 请求已知的关键字(例如,“ Accept ”)。
        value - 与之相关联的值。
        异常
        IllegalStateException - 如果已连接
        NullPointerException - 如果键为空
        从以下版本开始:
        1.4
        另请参见:
        getRequestProperties()
      • getRequestProperties

        public Map<String,List<String>> getRequestProperties​()
        返回此连接的一般请求属性的不可修改映射。 地图键是表示请求头字段名称的字符串。 每个Map值是一个不可修改的字符串列表,表示相应的字段值。
        结果
        该连接的一般请求属性的映射。
        异常
        IllegalStateException - 如果已经连接
        从以下版本开始:
        1.4
      • setContentHandlerFactory

        public static void setContentHandlerFactory​(ContentHandlerFactory fac)
        设置应用程序的ContentHandlerFactory 应用程序最多可以调用一次。

        ContentHandlerFactory实例用于从内容类型构造内容处理程序

        如果有安全管理员,则该方法首先调用安全管理员的checkSetFactory方法,以确保操作是允许的。 这可能会导致SecurityException。

        参数
        fac - 所需的工厂。
        异常
        Error - 如果工厂已经被定义了。
        SecurityException - 如果存在安全管理员,并且其 checkSetFactory方法不允许该操作。
        另请参见:
        ContentHandlerFactorygetContent()SecurityManager.checkSetFactory()
      • guessContentTypeFromName

        public static String guessContentTypeFromName​(String fname)
        根据URL的指定“文件”组件,尝试确定对象的内容类型。 这是可以覆盖getContentType方法的子类使用的getContentType方法。
        参数
        fname - 一个文件名。
        结果
        根据其文件名,猜测对象的内容类型。
        另请参见:
        getContentType()
      • guessContentTypeFromStream

        public static String guessContentTypeFromStream​(InputStream is)
                                                 throws IOException
        根据输入流开头的字符,尝试确定输入流的类型。 该方法可以覆盖getContentType方法的子类使用。

        理想情况下,不需要这个程序。 但是许多http服务器返回不正确的内容类型; 此外,还有许多非标准扩展。 直接检查字节以确定内容类型通常比相信http服务器声明的内容类型更准确。

        参数
        is - 支持标记的输入流。
        结果
        内容类型的猜测,或 null如果无法确定。
        异常
        IOException - 读取输入流时是否发生I / O错误。
        另请参见:
        InputStream.mark(int)InputStream.markSupported()getContentType()