ii.IO字节流——的输入输出:
[1]InputStream和OutputStream简介:
这两个类是字节流的抽象读写类,两个类都为抽象类,类定义如下:
public abstract class InputStream extends Object implements Closeable
public abstract class OutputStream extends Object implements Closeable,Flushable
这里引入一点题外话,就是二者实现的两个接口的简单讲解:
Closeable接口(1.5 ): Closeable接口是从JDK 1.5 才引入的一个新的接口,该接口是可以关闭IO数据源或者目标的,调用close方法可释放对象保存的资源,比如我们常用的打开的文件。该接口里面只有一个方法:
void close() throws IOException
【个人思考*:这里提供一点点比较新的资料,在JDK 1.7 里面开始支持C#里面使用的 资源闭包 ,也就是类似C#里面的using语句的扩展方式,只是Java语言的关键字是try ,这种设计刚好为这种实现做了一定层次的铺垫,也就是在JDK 1.7 过后所有的资源在读写过程不需要显示调用close()方法 ,同样类似C#里面的using语句使用try块语句实现在一个代码块里面使得里面的输入输出流自动关闭,该接口的引入也使得所有输入输出流在操作过程更加倾向于规范,因为在JDK 1.5之前,所有的close()操作都是由类本身提供的,这种方式无疑使得整个关闭显得不够正规。而且需要谨记的是,所有的IO资源最好在最终处理的时候使用正常的代码方式关闭 ,否则会占用系统资源。】
Flushable接口(1.5 ) :Flushable接口也是JDK 1.5 才引入的一个新接口,该接口是可刷新数据的目标接口,调用flush方法将所有已经缓冲输出的数据写入底层流,该接口和Closeable一样,里面仅仅包含了一个输出流的常用方法:
void flush() throws IOException
【*:初学者对flush方法会存在很多困惑,有时候不知道该方法到底是怎么在执行,而在很多输出流中都会使用到flush方法。首先需要理解的是操作系统文件写入的原理,一般情况下,不论是写入的目标源是文件、控制台还是网络,其写入的原理都类似,使用Java语言编程的时候, Java语言本身只会衔接到JVM平台这一层,除非使用JNI(其实JNI也没有直接使用Java语言调用操作系统的API),否则Java语言很难直接操作操作系统底层的一些数据以及相关内容交互。 而IO输出的时候,往往是将数据写入缓冲区,一般情况下缓冲区存在于操作系统的内存,针对文件系统的操作有四个: 打开、关闭、读、写 ,JVM在执行命令过后,会将底层的操作递交给操作系统本身来完成。flush的操作就负责发送请求,请求操作系统将缓冲区的内容写入到磁盘上的物理文件,如果不定义缓冲区的大小,就根据JVM本身的配置和操作系统的本身性质由操作系统决定什么时候写入,一般情况下不进行该操作的话会实时写入 ,如果定义了缓冲区情况可能就不一样了。】
[2]字节流类结构详解:
InputStream和OutputStream都是抽象类,在实例化的时候,一般情况下是使用它子类进行实例化,它们本身不存在实例 。
InputStream字节流输入的类结构:
[A] InputStream(1.0 )
|—[C] javax.sound.sampled. AudioInputStream(1.3 )
|—[C] ByteArrayInputStream(1.0 )
|—[C] FileInputStream(1.0 )
|—[C] FilterInputStream(1.0 )
|—[C] BufferedInputStream(1.0 )
|—[C] java.util.zip. CheckedInputStream(1.6 )
|—[C] javax.crypto. CipherInputStream(1.4 )
|—[C] DataInputStream(1.0 )
|—[C] java.util.zip. DeflaterInputStream(1.6 )
|—[C] java.security. DigestInputStream(1.6 )
|—[C] java.util.zip. InflaterInputStream(1.6 )
|—[C] java.util.zip. GZIPInputStream(1.6 )
|—[C] java.util.zip. ZipInputStream(1.6 )
|—[C] java.util.jar. JarInputStream(1.2 )
|—[C] LineNumberInputStream(1.0 )【已过时】
|—[C] javax.swing. ProgressMonitorInputStream
|—[C] PushbackInputStream(1.0 )
|—[A] org.omg.CORBA.portable. InputStream(1.2 )
|—[A] org.omg.CORBA_2_3.portable. InputStream(1.2 )
|—[C] ObjectInputStream(1.1 )
|—[C] PipedInputStream(1.0 )
|—[C] SequenceInputStream(1.0 )
|—[C] StringBufferInputStream(1.0 )【已过时】
InputStream是表示字节流输入的所有类的超类,它的几个子类的介绍如下:
——AutioInputStream(1.3 )类 (javax.sound.sampled. AudioInputStream ):该类是音频输入流,具有指定音频格式和长度的输入流,长度用实例帧表示而不使用字节。该类提供了几种方法,用于从流读取一定数量的字节,或未指定数量的字节,音频输入流跟踪所读取的最后一个字节,可以跳过任意数量的字节以达到稍候的读取位置。该输入流可支持标记,设置标记的时候,会记住当前的位置,以便可以稍候返回该位置。
Java的AudioSystem类包括了许多操作AudioInputStream对象的方法,这些方法可以做以下的事情:
从外部音频文件、流或URL获得音频输入流
从音频输入流写入外部文件
将音频输入流转换为不同的音频格式
该类不是属于java.io的包,所以这个地方针对该类就不做过多的讨论。
——ByteArrayInputStream(1.0 )类: 该类包含了Java定义的一个内部的缓冲区 ,该缓冲区包含从流中读取的字节,内部计数器跟踪read方法要提供的下一个字节,若该输入流被关闭就无效,但是此类中的方法在关闭此流过后仍然可以被调用 ,而且不会产生IOException
——FileInputStream(1.0 )类: 该类从文件系统中的某个文件中获得输入字节 ,哪些文件可以取决于定义的主机环境,该类也可以用于读取图像数据之类的原始字节流
——FilterInputStream(1.0 )类: 该类包含了其他一些输入流,它将这些流作用其基本数据源,它可以直接传输数据或提供一些额外的功能,FilterInputStream类本身只是简单地重写那些将所有请求传递给所包含输入流的InputStream的所有方法,FilterInputStream的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
——BufferedInputStream(1.0 )类: 该类为另一个输入流添加一些功能,即缓冲输入 以及支持mark和reset方法 的能力,在创建BufferedInputStream时,会创建一个内部缓冲区数组,在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark操作记录输入流中的某个点,reset操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次mark操作后读取的所有字节。
—— java.util.zip. CheckedInputStream(1.6 )类: 该类是读取一个压缩包里面的类,是一个需要维护所读取数据校验和的输入流 ,校验和用来验证输入数据的完整性。
—— javax.crypto. CipherInputStream(1.4 )类: 该类由一个InputStream和一个Cipher组成,这样read()方法才能返回从底层InputStream读入但已经由该Cipher另外处理过的数据,在由CipherInputStream使用之前,该Cipher必须充分初始化 。如果Cipher初始化为解密,在返回解密的数据之前,CipherInputStream将尝试读入数据并且将其解密。该类严格遵守此语义,尤其是其祖先类FilterInputStream和InputStream的语义。此类具有其祖先类中指定的所有方法,并且对所有的这些方法进行了重写,除此之外,此类还对其祖先类未抛出的所有异常进行捕获。
——DataInputStream(1.0 )类: 数据输入流允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型,应用程序可以使用数据输出流写入由数据输入流读取的数据,DataInputStream有一点需要注意,对于多线程访问 不一定是安全的 ,线程安全是可以通过方法设置,它由此方法的使用者负责。
——java.util.zip. DeflaterInputStream(1.6 )类: 该类为使用“deflate” 压缩格式压缩数据实现输入流过滤器。
——java.security. DigestInputStream(1.6 )类: 使用通过流的位更新关联消息摘要的透明流,要完成消息摘要计算,先要调用此摘要输入流的一个read方法,之后在关联的信息摘要上调用一个digest方法。开启或关闭此流都是可能的,开启的时候,调用read方法之一将导致消息摘要的更新,但是关闭的时候,不更新消息摘要,该流在默认情况下是开启的。
——java.util.zip. InflaterInputStream(1.6 )类: 此类为解压缩“deflate” 压缩格式的数据实现流过滤器,它还用做其他解压过滤器的基础。
——java.util.zip. GZIPInputStream(1.6 )类: 此类为读取GZIP文件格式的压缩数据实现流过滤器
——java.util.zip. ZipInputStream(1.6 )类: 该类为读取ZIP文件格式的文件输入流过滤器。包括对已知和未压缩条目的支持。
——java.util.jar. JarInputStream(1.2 )类:JarInputStream 类用于从任何输入流读取JAR文件内容,它扩展了java.util.zip. ZipInputStream 类,使之支持读取可选的Manifest条目,Manifest可用于存储有关JAR文件及其条目的元信息
——LineNumberInputStream(1.0 )类【已过时】 : 该类已经过时这里不做讨论
——javax.swing. ProgressMonitorInputStream类: 监视读取某些InputStream的进度,这可以创建一个进度监视器,以监视读取输入流的进度,如果需要一段时间,将会弹出ProgressDialog,以通知用户,该类一般在Java Swing的开发中更加常见。
——PushbackInputStream(1.0 )类: 该类为另一个输入流添加性能,即“推回(push back )” 或“取消读取(unread )” 一个字节的能力,在代码片段可以很方便地读取由特定字节值分割的不定数据的数据字节时,这很有用;在读取终止字节后,代码片段可以“取消读取”该字节,这样,输入流上的下一个读取操作将会重新读取被推回的字节。
【*:org.omg的子包里面的两个类这里不做说明,IO部分暂时不涉及这一块内容,而且我自己平时用得也很少】
——ObjectInputStream(1.1 )类: 【该类在序列化和反序列化章节进行介绍】
——PipedInputStream(1.0 )类: 管道输入流应该连接到通道输出流,管道输入流提供要写入管道输出流的所有数据字节,通常数据由某个线程从PipedInputStream对象读取,并由其他线程将其写入到相应的PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程 。管道输入流包含一个缓冲区,可以在缓冲区限定的范围内将读和写操作分离开,如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
——SequenceInputStream(1.0 )类: 该类表示其他输入流的逻辑串联,它从输入流的有序集合开始,并且从第一个输入流开始读取,直到文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
OutputStream字节流输出的类结构:
[A] OutputStream(1.0 )
|—[C] ByteArrayOutputStream(1.0 )
|—[C] FileOutputStream(1.0 )
|—[C] FilterOutputStream(1.0 )
|—[C] BufferedOutputStream(1.0 )
|—[C] java.util.zip. CheckedOutputStream(1.6 )
|—[C] javax.crypto. CipherOutputStream(1.4 )
|—[C] DataOutputStream(1.0 )
|—[C] java.util.zip. DeflaterOutputStream(1.6 )
|—[C] java.util.zip. GZIPOutputStream(1.6 )
|—[C] java.util.zip. ZipOutputStream(1.6 )
|—[C] java.util.jar. JarOutputStream(1.6 )
|—[C] java.security. DigestOutputStream
|—[C] java.util.zip. InflaterOutputStream(1.6 )
|—[C] PrintStream(1.0 )
|—[C] java.rmi.server. LogStream(1.1 )【已过时】
|—[C] ObjectOutputStream(1.1 )
|—[A] org.omg.CORBA.portable. OutputStream(1.2 )
|—[A] org.omg.CORBA_2_3.portable. OutputStream(1.2 )
|—[C] PipedOutputStream(1.0 )
OutputStream类是表示字节流输出的所有类的超类,它的子类如下:
——ByteArrayOutputStream(1.0 )类: 此类实现了一个输出流,其中的数据被写入一个byte数组 ,缓冲区会随着数据的不断写入而自动增长 ,可使用toByteArray() 和toString() 方法获取数据。
——FileOutputStream(1.0 )类: 文件输出流是用于将数据写入File或FileDescriptor 的输出流,文件是否可用或能否可以被创建取决于基础平台,特别是某些平台一次只允许一个FileOutputStream打开文件 进行写入 ,在这种情况下,如果所涉及的文件已经打开,则此类的构造方法将会失败。
——FilterOutputStream(1.0 )类: 此类是过滤输出流的所有类的超类,这些流位于已存在的输出流之上,它们将已存在的输出流作为基本数据接收器,但可能直接传输数据或提供一些额外的功能。FilterOutputStream类本身只是简单地重写那些将所有请求传递给所包含输出的OutputStream的所有方法 。FilterOutputStream的子类可进一步地重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
——BufferedOutputStream(1.0 )类: 该类实现缓冲的输出流,通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
—— java.util.zip. CheckedOutputStream(1.6 )类: 需要维护写入压缩包的输出流,主要用来维护校验和,校验和可以用于验证输出数据的完整性 。
—— javax.crypto. CipherOutputStream(1.4 )类: 该类由一个OutputStream 和一个Cipher 组成,这样writer()方法才能在将数据写出到底层OutputStream之前对数据进行处理,在由CipherOutputStream使用之前,密码必须充分进行初始化 。比如密码初始化加密,CipherOutputStream将在写出该加密数据之前尝试加密该数据,该类和CipherInputStream相对应
——DataOutputStream(1.0 )类: 数据输出流允许应用程序以适当的方式将基本Java数据类型写入输出流中,然后,该应用程序可以使用数据输入流将数据读入。
—— java.util.zip. DeflaterOutputStream(1.6 )类: 此类为使用“deflate” 压缩格式压缩数据实现输出流过滤器,它还用作其他类型的压缩过滤器的基础
—— java.util.zip. GZIPOutputStream(1.6 )类: 此类为使用GZIP文件格式写入压缩数据实现流过滤器
—— java.util.zip. ZipOutputStream(1.6 )类: 该类为以ZIP文件格式写入文件实现输出流过滤器,包括对已压缩和未压缩的条目的支持
—— java.util.zip. JarOutputStream(1.4 )类: 该类用于向任何输出流写入JAR文件内容,它扩展了ZipOutputStream类,使之支持编写可选的Manifest条目,Manifest可用于指定有关JAR文件以及条目的元信息。
——java.security. DigestOutputStream类: 使用通过流的位更新关联消息摘要的透明流,要完成消息摘要的计算,先要调用此摘要输出流的一个write方法,之后在关联的消息摘要上调用digest方法之一。开启或关闭此流都是可能见的,开启时,调用write方法之一将导致消息摘要的更新,但是关闭的时候不需要消息更新,流在默认情况下是开启的。
——java.util.zip. InflaterOutputStream(1.6 )类: 为解压缩“deflate” 压缩格式存储的数据实现输出流过滤器
——PrintStream(1.0 )类: 该类为其他输出流添加了功能,使它们能够方便地答应各种数据值表示形式,它还提供其他两项功能,与其他输出流不同,PrintStream永远不会抛出IOException ;而是,异常情况仅设置可通过checkError 方法测试的内部标志,另外,为了自动刷新,可以创建一个PrintStream;这意味着可在写入byte数组之后自动调用flush方法,不需要 手动调用 ,可以调用其中一个println方法,该方法末尾会写入一个“/n”符
——java.rmi.server. LogStream(1.1 )类:【已过时】 ,该方法提供一种记录错误的机制,这一机制专门用来监视系统运行情况
——ObjectOutputStream(1.1 )类: 【该类在序列化和反序列化章节进行介绍】
【*:org.omg的子包里面的两个类这里不做说明,IO部分暂时不涉及,而且我自己平时用得也很少】
——PipedOutputStream(1.0 )类: 可以将管道输出流连接到管道输入流来创建通信管道,管道输出流是管道的发送端,通常,数据由某个线程写入PipedOutputStream对象,并由其他线程从连接的PipedInputStream读取,不建议对这两个对象尝试使用单个线程,因为这样有可能造成使用线程死锁,如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道损毁。
[3]字节流IO类的操作:
InputStream抽象类中的操作:
abstract int read():
该方法用来读取字节,并且返回读取到的字节,如果这个字节流结束 的时候,这个方法会返回-1 。
int read(byte [] b):
该方法将读取到的字节存储在传入的一个字节缓冲区也就是一个字节数组里面,而且每一次按照该数组的长度(b.length) 读取字节,和上边方法一样,如果读取到字节流的末尾该方法会返回-1 。
int read(byte [] b,int off,int len):
和上边方法一模一样,唯一不同的是三个参数:
b :将数据读入的缓冲区字节数组
off :将字节放入的数组的第一个位置
l en :需要读取的字节的最大长度
【*:这两个方法都是使用一个自定义的字节数组作为读取过程的读取缓冲区,只是操作方法不一样,具体操作可以根据当时的需求来选择。】
long skip(long n):
在输入流里面跳过n个字节,该方法返回跳过的字节数(前提条件是跳过的字节长度比流数据的总长度要小)
int available():
返回数据流里面合法数据的流数据块的数据流的字节长度
void close():
关闭输入流
void mark(int readlimit):
在输入流的某个地方放入一个标记,如果超过readlimit的字节数需要读取,则该字节流会自动忽略该标记
void reset():
返回输入流的最后一个标记,一般情况用来重置该输入流
boolean markSupported():
判断一个输入流是否支持标记功能,如果不支持标记功能就直接返回false ,反之返回true
OutputStream抽象类中的操作:
abstract void write(int n):
写入n个字节的数据
void write(byte [] b):
void write(byte [] b,int off,int len):
使用一个缓冲区字节数组来进行数据的写入,先把数据写入一个字节缓冲区,然后再进行流数据写入,和read方法 相对应
void close():
关闭输出流
void flush():
该方法就是输出流里面的特殊方法,把操作系统缓冲区里面的数据直接向物理目标源进行写入操作,这里缓冲区可以理解为缓冲区字节数组。
【*:其实从Java语言可以知道,当定义一个对象的时候,该对象是存储在内存里面的,也就是当创建了一个字节数组的时候,可以默认定义了一个内存里面的缓冲区,用来进行数据读写的缓冲做辅助使用。】
iii.IO字符流——输入和输出:
[1]Reader和Writer简介:
这两个类是字符流的IO读写超类,二者的类定义如下:
public abstract class Reader extends Object implements Readable,Closeable
public abstract class Writer extends Object implements Appendable,Closeable,Flushable
这里需要介绍两个新接口:
Readable接口(1.5 ): 该接口是一个以字符为输入源 的接口,一般只有字符流才会用到该接口,字节流不会使用这个接口
Appendable接口(1.5 ): 能够被添加char序列和值的对象,如果某个类的实例打算收取自Formatter的格式化输出,那么该类必须实现Appendable接口,要添加的字符应该是有效的Unicode字符,增补字符可能由多个16位char值组成,同样该接口不是线程安全 的。
[2]字符流类结构详解:
Reader字符流输入的类结构:
[A] Reader(1.1 )
|—[C] BufferedReader(1.1 )
|—[C] LineNumberReader(1.1 )
|—[C] CharArrayReader(1.1 )
|—[A] FilterReader(1.1 )
|—[C] PushbackReader(1.1 )
|—[C] InputStreamReader(1.1 )
|—[C] FileReader(1.1 )
|—[C] PipedReader(1.1 )
|—[C] StringReader(1.1 )
Reader是字符流输入的超类,它的子类解析如下:
——BufferedReader(1.1 ): 从字符输入流中读取文本,缓冲每个字符,从而实现字符、数组和行的高效读取。和Stream字节输入流一样,这个字符输入流同样可以指定缓冲区的大小,或者使用默认大小。
【*:这里有一天我自己也很困惑,仔细思考一下。照理说,上边讲到的字节的实时读取是不对的,BufferedReader的说法,实际上系统默认是存在一个缓冲区的,当写程序的时候如果没有自定义缓冲区,输入和输出使用的都是系统的缓冲区而不是实时读取,不过这一点影响不会太大,当我们真正需要提高IO性能的时候,下边会讲到一些比较简单的IO部分性能的提升法则。】
——LineNumberReader(1.1 ): 跟踪行号的缓冲字符输入流,此类定义了方法setLineNumber(int)和getLineNumber(),它们可分别用于设置和获取当前行号。默认情况下,行号编号从0开始,该行号随数据读取在每个行结束的地方开始递增,并且可以通过调用setLineNumber(int)更改行号。但是需要注意的是,该方法不会实际更改流当中的当前位置,它只是修改了getLineNumber()的返回值,其识别符号为:换行符“/n”、回车“/r”、或者回车后边紧跟换行符。
——CharArrayReader(1.1 ): 此类直接实现一个用作字符输入流的字符缓冲区
——FilterReader(1.1 ): 用于读取已过滤的字符流的抽象类,该类自身提供了一些将所有请求传递给包含的默认方法,它的子类应该重写这些方法中的一些,并且还可以提供一些额外的方法和字段。
——PushbackReader(1.1 ): 允许将字符推回到流的字符流Reader。
——InputStreamReader(1.1 ): 这是字节流到字符流的桥梁类 ,它使用指定的charset编码格式读取字节并且将其解码为字符,它使用的字符集可以由名称指定或者显示给定,或者可以接受平台默认的字符集。每次调用InputStreamReader中的一个read()方法都会导致从底层输入流中读取一个或者多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节,为了达到更高效率,可要考虑在BufferedReader内包装InputStreamReader。
——PipedReader(1.1 ): 直接传送字符的管道字符流输入类
——StringReader(1.1 ): 直接使用输入源为字符串的字符流输入 类
Writer字符流输出的类结构:
[A] Writer(1.1 )
|—[C] BufferedWriter(1.1 )
|—[C] CharArrayWriter(1.1 )
|—[A] FilterWriter(1.1 )
|—[C] OutputStreamWriter(1.1 )
|—[C] FileWriter(1.1 )
|—[C] PipedWriter(1.1 )
|—[C] PrintWriter(1.1 )
|—[C]StringWriter(1.1 )
Writer是字符流输出的超类,它的子类解析如下:
——BufferedWriter(1.1 ): 该类将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串 的高效写入 。
——CharArrayWriter(1.1 ): 此类实现一个可用作Writer的字符缓冲区,缓冲区会随向流中写入数据而自动增长,可使用toCharArray() 和toString() 获取数据,在此类上调用close()无效,并且在关闭该流后可以调用此类中的方法,而不会产生任何IOException。
——FilterWriter(1.1 ): 用于写入已过滤的字符流的抽象类,该类自身提供了所有请求传递给所包含字符流的默认方法,FilterWriter的子类应该重写这些方法中的一些方法,并且可以提供一些额外的方法和字段。
——OutputStreamWriter(1.1 ): 该类是字符流通向字节流的桥梁 ,可使用指定的charset将要写入流中的字符编码成字节,它使用的字符集可以由名称指定或显示给定,否则将接受平台默认的字符集,在调用过程,考虑使用OutputStreamWriter包装到BufferedWriter中,以避免频繁调用转换器
——FileWriter(1.1 ): 用来写入字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可以接受的,如果要自己指定,可以在FileOutputStream上构造一个OutputStreamWriter。文件是否可用或是否可以被创建取决于底层平台 ,特别是某些平台一次只允许一个FileWriter打开文件进行写入,这样的情况下,如果文件已经打开则就会构造失败。
——PipedWriter(1.1 ): 直接传送字符的管道字符流输出类
——PrintWriter(1.1 ): 向文本输出流打印对象的格式化表示形式,此类实现在PrintStream中的所有方法,它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。【*:该类和PrintStream不一样,该类不是等到特定的符号才完成刷新,如果启用了自动刷新过后,调用了println和printf以及format几个方法中的一个的时候才可能完成此操作,同样的这个类不会抛出IOException异常】
——StringWriter(1.1 ): 一个字符流,主要限制了目标输出源,这个方法主要用于目标源为String类型的对象的时候
iv.使用范例
上边介绍了IO的大部分类,下边使用代码针对一些特殊的情况进行说明和讲解,以帮助读者了解IO类的一些用法,关于File的部分保留到文件章节去讲,这里主要讲解上边比较常用的一些类以及一些常用的场景。
[1]普通使用范例介绍:
——[$] 输入输出的拷贝——
package org.susan.java.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class StreamCopier {
public static void main(String args[]){
try {
copy (System.in , System.out );
}catch (IOException ex){
System.err .println(ex);
}
}
public static void copy(InputStream in,OutputStream out) throws IOException{
byte [] buffer = new byte [1024];
while (true ){
int bytesRead = in.read(buffer);
if ( bytesRead == -1)
break ;
out.write(buffer, 0, bytesRead);
}
}
}
该类在输入流和输出流里面进行了拷贝操作,在方法内部创建了一个1024字节长度的自定义缓冲区 ,然后把输入的字符读入并且通过输出流输出。
在Java语言标准的I/O模型中,提供了System.in、System.out、System.err 三个
System.in: 该类属于java.lang.System 类的一个内部类,类类型为InputStream,这个类属于“标准”输入流 ,此流已打开并准备提供输入数据,通常此流对应键盘输入或者由主机环境或用户指定的另一个输入源,在Windows环境下,该输入流默认对应的是控制台里面的输入。
System.out: 该类属于java.lang.System 类的一个内部类,类类型为PrintStream,这个类属于“标准”输出流 ,此流已打开并准备接受输出数据,通常此流对应显示器输出或者由主机环境指定的另外一个输出目标,和System.in一样,在Windows环境下,该输出流默认对应的是控制台的输出。
System.err:“标准”错误输出流 ,此流已打开并准备接受输出数据,通常,此流对应于显示器或者由主机环境或用户指定的另一个输出目标,按照惯例,此输出流是用于错误信息输出的。
上边例子演示了从InputStream类型的System.in到PrintStream类的System.out 的字节拷贝,是一个很简单的IO的例子,上边的程序这里不提供演示效果,是一个在Console上边的用户可交互的程序,输入的是什么内容,输出就是什么,类似我们最开始学习C++的时候的cin和cout的交互操作。
——[$] 从URL读取流数据——
package org.susan.java.io;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class URLStream {
public static void main(String [] args) throws IOException{
InputStream inputStream = null ;
try {
URL url = new URL("http://www.google.com" );
inputStream = url.openStream();
for ( int c = inputStream.read(); c != -1; c = inputStream.read()){
System.out .write(c);
}
inputStream.close();
}catch (MalformedURLException ex){
System.err .println("Not a URL Java understands." );
}finally {
if ( inputStream != null )
inputStream.close();
}
}
}
这一段代码直接从一个在线的URL地址获取数据流,然后把从这个地址获取到的内容在控制台打印出来,读取的方式调用的是InputStream的read方法,它会逐个字节从字节流里面读取直到这个字节流被读取完为止。这里输出的是从http://www.google.com 地址读取到的HTML的代码,为方便初学者,我这里提供该程序的输出,找了个比较简洁的的页面也是不占篇幅:
你可能感兴趣的:(java牛人之路,java基础学习)
移动端城市区县二级联动选择功能实现包
good2know
本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery
深入解析JVM工作原理:从字节码到机器指令的全过程
一、JVM概述Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。JVM的主要职责:加载:读取.class文件并验证其正确性存储:管理内存分配和垃圾回收执行:解释或编译字节码为机器指令安全:提供沙箱环境限制恶意代码二、JVM架构详解JVM由三个主要子系统组成:1.类加载子系统类加载过程分为
JVM 内存模型深度解析:原子性、可见性与有序性的实现
练习时长两年半的程序员小胡
JVM 深度剖析:从面试考点到生产实践 jvm java 内存模型
在了解了JVM的基础架构和类加载机制后,我们需要进一步探索Java程序在多线程环境下的内存交互规则。JVM内存模型(JavaMemoryModel,JMM)定义了线程和主内存之间的抽象关系,它通过规范共享变量的访问方式,解决了多线程并发时的数据一致性问题。本文将从内存模型的核心目标出发,详解原子性、可见性、有序性的实现机制,以及volatile、synchronized等关键字在其中的作用。一、J
Java | 多线程经典问题 - 售票
Ada54
一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3
SpringMVC的执行流程
1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,
JAVA接口机结构解析
秃狼
SpringBoot 八股文 Java java 学习
什么是接口机在Java项目中,接口机通常指用于与外部系统进行数据交互的中间层,负责处理请求和响应的转换、协议适配、数据格式转换等任务。接口机的结构我们的接口机的结构分为两个大部分,外部接口机和内部接口机,在业务的调度上也是通过mq来实现的,只要的目的就是为了解耦合和做差异化。在接口机中主要的方法就是定时任务,消息的发送和消费,其他平台调用接口机只能提供外部接口机的方法进行调用,外部接口机可以提供消
最新阿里四面面试真题46道:面试技巧+核心问题+面试心得
风平浪静如码
前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni
图论算法经典题目解析:DFS、BFS与拓扑排序实战
周童學
数据结构与算法 深度优先 算法 图论
图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或
【异常】使用 LiteFlow 框架时,提示错误ChainDuplicateException: [chain name duplicate] chainName=categoryChallenge
本本本添哥
002 - 进阶开发能力 java
一、报错内容Causedby:com.yomahub.liteflow.exception.ChainDuplicateException:[chainnameduplicate]chainName=categoryChallengeatcom.yomahub.liteflow.parser.helper.ParserHelper.lambda$null$0(ParserHelper.java:1
Java并发核心:线程池使用技巧与最佳实践! | 多线程篇(五)
bug菌¹
Java实战(进阶版) java Java零基础入门 Java并发 线程池 多线程篇
本文收录于「Java进阶实战」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows10+IntelliJIDEA2021.3.2+Jdk1.8本文目录前言摘要正文何为线程池?为什么需要线程池?线程池的好处线程池使用场景如何创建线程池?线程池的常见配置源码解析案例分享案例代码演示案例运行
Java 队列
tryxr
java 开发语言 队列
队列一般用什么哪种结构实现队列的特性数据入队列时一定是从尾部插入吗数据出队列时一定是从头部删除吗队列的基本运算有什么队列支持随机访问吗队列的英文表示什么是队列队列从哪进、从哪出队列的进出顺序队列是用哪种结构实现的Queue和Deque有什么区别Queue接口的方法Queue中的add与offer的区别offer、poll、peek的模拟实现如何利用链表实现队列如何利用顺序表实现队列什么叫做双端队列
JVM 内存分配与回收策略:从对象创建到内存释放的全流程
在JVM的运行机制中,内存分配与回收策略是连接对象生命周期与垃圾收集器的桥梁。它决定了对象在堆内存中的创建位置、存活过程中的区域迁移,以及最终被回收的时机。合理的内存分配策略能减少GC频率、降低停顿时间,是优化Java应用性能的核心环节。本文将系统解析JVM的内存分配规则、对象晋升机制,以及实战中的内存优化技巧。一、对象优先在Eden区分配:新生代的“临时缓冲区”大多数情况下,Java对象在新生代
代码随想录算法训练营第三十五天
01背包问题二维题目链接01背包问题二维题解importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intM=sc.nextInt();intN=sc.nextInt();int[]space=newint[M];int[]value=new
微信公众号回调java_处理微信公众号消息回调
weixin_39607620
微信公众号回调java
1、背景在上一节中,咱们知道如何接入微信公众号,可是以后公众号会与咱们进行交互,那么微信公众号如何通知到咱们本身的服务器呢?咱们知道咱们接入的时候提供的url是GET/mp/entry,那么公众号以后产生的事件将会以POST/mp/entry发送到咱们本身的服务器上。html2、代码实现,此处仍是使用weixin-java-mp这个框架实现一、引入weixin-java-mpcom.github.
大数据之路:阿里巴巴大数据实践——大数据领域建模综述
为什么需要数据建模核心痛点数据冗余:不同业务重复存储相同数据(如用户基础信息),导致存储成本激增。计算资源浪费:未经聚合的明细数据直接参与计算(如全表扫描),消耗大量CPU/内存资源。数据一致性缺失:同一指标在不同业务线的口径差异(如“活跃用户”定义不同),引发决策冲突。开发效率低下:每次分析需重新编写复杂逻辑,无法复用已有模型。数据建模核心价值性能提升:分层设计(ODS→DWD→DWS→ADS)
学C++的五大惊人好处
为什么要学c++学c++有什么用学习c++的好处有1.中考可以加分2.高考可能直接录取3.就业广且工资高4.在未来30--50年c++一定是一个很受欢迎的职业5.c++成功的例子deepsick等AI智能C++语言兼备编程效率和编译运行效率的语言C++语言是C语言功能增强版,在c语言的基础上添加了面向对象编程和泛型编程的支持既继承了C语言高效,简洁,快速和可移植的传统,又具备类似Java、Go等其
Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】
Tony666688888
java windows 开发语言
针对集合排序,java8可以用Stream流的sorted()进行排序。示例Bean以下我们会使用这个Bean来做示例。publicclassOrder{privateStringweight;privateDoubleprice;privateStringdateStr;//忽略getter、setter、构造方法、toString}字段排序首先是比较器Comparator,形式如下:Compa
复杂工况下泵组的 “健康秘籍”:从监测到维护的全攻略
缘华工业智维
人工智能 制造 运维
在工业生产的宏大版图中,泵组堪称默默耕耘的“幕后英雄”,承担着流体输送的重任,如同人体循环系统中的血管,确保生产流程的顺畅运行。然而,泵组常常面临复杂工况的挑战,这犹如让它们在崎岖蜿蜒、障碍重重的道路上负重前行,对其健康状况构成诸多威胁。因此,深入了解复杂工况下泵组的运行状况,实施全面、科学的健康管理,对于保障生产的连续性与稳定性、控制运营成本,有着举足轻重的意义。复杂工况:泵组运行的“荆棘之路”
用代码生成艺术字:设计个性化海报的秘密
本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准
java实习生40多天有感
别拿爱情当饭吃
从5月15日开始,我开始第一步步入社会,我今年大三,在一家上市互联网公司做一名实习生,主要做java后端开发。开始的时候,觉得公司的环境挺不错的,不过因为公司在CBD,所以隔壁的午饭和晚饭都要20+RMB,而且还吃不饱,这让我感觉挺郁闷的。一到下午,我就会犯困(因为饿)。因此,我又不得不买一些干粮在公司屯着。关于技术,有一个比较大的项目在需求调研当中,我们做实习生,就是辅助项目经理,测试功能,并且
大学生入门:初识方法及其易踩坑的点
在java学习过程中,我们不难发现有很多重复使用的功能代码块,每次使用如果都要重新写一遍,岂不是很麻烦,就算是“cv”大法,感觉也不是很方便,那么,有什么办法可以解决这个问题呢?方法!java中,一段可重用的,用于执行特定功能的代码块叫做方法,它可以接收参数、返回结果,并且可以被多次使用。一、方法的基本结构[修饰符]返回值类型方法名([参数列表])[throws异常类型]{//方法体}[throw
《蛤蟆先生去看心理医生》:承担责任2个好处,即促进学习和行动
王明鹏
蛤蟆认识到自我进入成人状态的重大意义,这也是一条没有止境的探索和实践之路,自我成长之路。咨询师苍鹭给出了成人自我状态的解释,那就是承担责任,而且进一步说明担责的2个好处。成年人没有容易的生活,不动声色的冷静之下也在忍受压力,谈笑风生的背后也一样有焦虑,但是人家处理情绪的方式与一般人不同,这个最大不同就是面对、接受,即承担责任。担责带来好处,这个好处反过来又强化了担责的行动,这就是行为学习的解释和应
[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
这些不会的
解释:这个错误是很常见的错误,错误的提示已经很清楚了就是java的Object数组不能转换成为String[]数组,这就说明你要转换的数组它本身是Object类型的数组,但是你却非要把它转换为String类的数组,这当然是错误的。示例:[java]viewplaincopypackagecom.dada;importjava.util.ArrayList;importjava.util.List;
HikariCP调试日志深度解析:生产环境故障排查完全指南
HikariCP调试日志深度解析:生产环境故障排查完全指南更新时间:2025年7月4日|作者:资深架构师|适用版本:HikariCP5.x+|难度等级:中高级前言在生产环境中,数据库连接池往往是系统性能的关键瓶颈。HikariCP作为当前最流行的Java连接池,其调试日志包含了丰富的运行时信息,能够帮助我们快速定位和解决各种连接池相关问题。本文将深入解析HikariCP的日志体系,提供一套完整的故
大学社团管理系统(11831)
codercode2022
java spring boot spring echarts spring cloud sentinel java-rocketmq
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项目截图有需要的同学,源代码和配套文档领取,加文章最下方的名片哦!
今年校招竞争真激烈
12_05
程序员满大街,都要找不到工作了。即使人工智能满大街,我也后悔当初没学机器学习,后悔当初没学Java。C++真难找工作。难道毕了业就失业吗?好担心!
【免费下载】 Aspose for Java:解锁无水印、无限制的文档处理能力
房征劲Kendall
AsposeforJava:解锁无水印、无限制的文档处理能力【下载地址】AsposeforJava-去除水印和数量限制AsposeforJava-去除水印和数量限制Aspose是一个著名的文档处理库,专为Java应用程序设计,支持多种文档格式的操作,如Word、Excel、PDF等项目地址:https://gitcode.com/open-source-toolkit/56c82项目介绍在现代企业
微服务日志追踪,Skywalking接入TraceId功能
Victor刘
微服务 skywalking java
文章目录一、借助skywalking追加traceIdlogbacklog4j2效果二、让skywalking显示日志内容版本差异logback配置文件log4j2配置文件一、借助skywalking追加traceId背景:在微服务或多副本中难以观察一个链路的日志,需要通过唯一traceId标识来查找,下面介绍Skywalking-traceId在Java中的配置方法。介绍两种java日志的配置方
嘉峪关方特一日游一一丝绸之旅
孟向阳
今天我给大家介绍一下,丝绸之旅。我们随着工作人员,带我们坐上了游览丝绸之旅的观光车。喇叭里开始讲解丝绸之路的故事。丝绸之路是亚洲各国共同历史和辉煌文明的见证,是亚洲人民历史文化自豪感的源泉。它运用高科技打造荒漠沙海、古城遗址、寒冰石窟、烈焰山洪等古代西域的神奇场景,将带领我们体验丝绸古道、大漠孤烟的雄壮与奇幻。感受西域人民纯真而朴实的生活。我们坐的观光车缓缓地走着,先是风沙四起的戈壁滩,黄沙满天。
【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)
笙囧同学
java 前端 状态模式
核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认
关于旗正规则引擎下载页面需要弹窗保存到本地目录的问题
何必如此
jsp 超链接 文件下载 窗口
生成下载页面是需要选择“录入提交页面”,生成之后默认的下载页面<a>标签超链接为:<a href="<%=root_stimage%>stimage/image.jsp?filename=<%=strfile234%>&attachname=<%=java.net.URLEncoder.encode(file234filesourc
【Spark九十八】Standalone Cluster Mode下的资源调度源代码分析
bit1129
cluster
在分析源代码之前,首先对Standalone Cluster Mode的资源调度有一个基本的认识:
首先,运行一个Application需要Driver进程和一组Executor进程。在Standalone Cluster Mode下,Driver和Executor都是在Master的监护下给Worker发消息创建(Driver进程和Executor进程都需要分配内存和CPU,这就需要Maste
linux上独立安装部署spark
daizj
linux 安装 spark 1.4 部署
下面讲一下linux上安装spark,以 Standalone Mode 安装
1)首先安装JDK
下载JDK:jdk-7u79-linux-x64.tar.gz ,版本是1.7以上都行,解压 tar -zxvf jdk-7u79-linux-x64.tar.gz
然后配置 ~/.bashrc&nb
Java 字节码之解析一
周凡杨
java 字节码 javap
一: Java 字节代码的组织形式
类文件 {
OxCAFEBABE ,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组
}
&nbs
java各种小工具代码
g21121
java
1.数组转换成List
import java.util.Arrays;
Arrays.asList(Object[] obj); 2.判断一个String型是否有值
import org.springframework.util.StringUtils;
if (StringUtils.hasText(str)) 3.判断一个List是否有值
import org.spring
加快FineReport报表设计的几个心得体会
老A不折腾
finereport
一、从远程服务器大批量取数进行表样设计时,最好按“列顺序”取一个“空的SQL语句”,这样可提高设计速度。否则每次设计时模板均要从远程读取数据,速度相当慢!!
二、找一个富文本编辑软件(如NOTEPAD+)编辑SQL语句,这样会很好地检查语法。有时候带参数较多检查语法复杂时,结合FineReport中生成的日志,再找一个第三方数据库访问软件(如PL/SQL)进行数据检索,可以很快定位语法错误。
mysql linux启动与停止
墙头上一根草
如何启动/停止/重启MySQL一、启动方式1、使用 service 启动:service mysqld start2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start3、使用 safe_mysqld 启动:safe_mysqld&二、停止1、使用 service 启动:service mysqld stop2、使用 mysqld 脚本启动:/etc/inin
Spring中事务管理浅谈
aijuans
spring 事务管理
Spring中事务管理浅谈
By Tony Jiang@2012-1-20 Spring中对事务的声明式管理
拿一个XML举例
[html]
view plain
copy
print
?
<?xml version="1.0" encoding="UTF-8"?>&nb
php中隐形字符65279(utf-8的BOM头)问题
alxw4616
php中隐形字符65279(utf-8的BOM头)问题
今天遇到一个问题. php输出JSON 前端在解析时发生问题:parsererror.
调试:
1.仔细对比字符串发现字符串拼写正确.怀疑是 非打印字符的问题.
2.逐一将字符串还原为unicode编码. 发现在字符串头的位置出现了一个 65279的非打印字符.
 
调用对象是否需要传递对象(初学者一定要注意这个问题)
百合不是茶
对象的传递与调用技巧
类和对象的简单的复习,在做项目的过程中有时候不知道怎样来调用类创建的对象,简单的几个类可以看清楚,一般在项目中创建十几个类往往就不知道怎么来看
为了以后能够看清楚,现在来回顾一下类和对象的创建,对象的调用和传递(前面写过一篇)
类和对象的基础概念:
JAVA中万事万物都是类 类有字段(属性),方法,嵌套类和嵌套接
JDK1.5 AtomicLong实例
bijian1013
java thread java多线程 AtomicLong
JDK1.5 AtomicLong实例
类 AtomicLong
可以用原子方式更新的 long 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。
 
自定义的RPC的Java实现
bijian1013
java rpc
网上看到纯java实现的RPC,很不错。
RPC的全名Remote Process Call,即远程过程调用。使用RPC,可以像使用本地的程序一样使用远程服务器上的程序。下面是一个简单的RPC 调用实例,从中可以看到RPC如何
【RPC框架Hessian一】Hessian RPC Hello World
bit1129
Hello world
什么是Hessian
The Hessian binary web service protocol makes web services usable without requiring a large framework, and without learning yet another alphabet soup of protocols. Because it is a binary p
【Spark九十五】Spark Shell操作Spark SQL
bit1129
shell
在Spark Shell上,通过创建HiveContext可以直接进行Hive操作
1. 操作Hive中已存在的表
[hadoop@hadoop bin]$ ./spark-shell
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Welcom
F5 往header加入客户端的ip
ronin47
when HTTP_RESPONSE {if {[HTTP::is_redirect]}{ HTTP::header replace Location [string map {:port/ /} [HTTP::header value Location]]HTTP::header replace Lo
java-61-在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差. 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5,
bylijinnan
java
思路来自:
http://zhedahht.blog.163.com/blog/static/2541117420116135376632/
写了个java版的
public class GreatestLeftRightDiff {
/**
* Q61.在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差。
* 求所有数对之差的最大值。例如在数组
mongoDB 索引
开窍的石头
mongoDB索引
在这一节中我们讲讲在mongo中如何创建索引
得到当前查询的索引信息
db.user.find(_id:12).explain();
cursor: basicCoursor 指的是没有索引
&
[硬件和系统]迎峰度夏
comsci
系统
从这几天的气温来看,今年夏天的高温天气可能会维持在一个比较长的时间内
所以,从现在开始准备渡过炎热的夏天。。。。
每间房屋要有一个落地电风扇,一个空调(空调的功率和房间的面积有密切的关系)
坐的,躺的地方要有凉垫,床上要有凉席
电脑的机箱
基于ThinkPHP开发的公司官网
cuiyadll
行业系统
后端基于ThinkPHP,前端基于jQuery和BootstrapCo.MZ 企业系统
轻量级企业网站管理系统
运行环境:PHP5.3+, MySQL5.0
系统预览
系统下载:http://www.tecmz.com
预览地址:http://co.tecmz.com
各种设备自适应
响应式的网站设计能够对用户产生友好度,并且对于
Transaction and redelivery in JMS (JMS的事务和失败消息重发机制)
darrenzhu
jms 事务 承认 MQ acknowledge
JMS Message Delivery Reliability and Acknowledgement Patterns
http://wso2.com/library/articles/2013/01/jms-message-delivery-reliability-acknowledgement-patterns/
Transaction and redelivery in
Centos添加硬盘完全教程
dcj3sjt126com
linux centos hardware
Linux的硬盘识别:
sda 表示第1块SCSI硬盘
hda 表示第1块IDE硬盘
scd0 表示第1个USB光驱
一般使用“fdisk -l”命
yii2 restful web服务路由
dcj3sjt126com
PHP yii2
路由
随着资源和控制器类准备,您可以使用URL如 http://localhost/index.php?r=user/create访问资源,类似于你可以用正常的Web应用程序做法。
在实践中,你通常要用美观的URL并采取有优势的HTTP动词。 例如,请求POST /users意味着访问user/create动作。 这可以很容易地通过配置urlManager应用程序组件来完成 如下所示
MongoDB查询(4)——游标和分页[八]
eksliang
mongodb MongoDB游标 MongoDB深分页
转载请出自出处:http://eksliang.iteye.com/blog/2177567 一、游标
数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效控制,从shell中定义一个游标非常简单,就是将查询结果分配给一个变量(用var声明的变量就是局部变量),便创建了一个游标,如下所示:
> var
Activity的四种启动模式和onNewIntent()
gundumw100
android
Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Android总Activity的启动模式分为四种:
Activity启动模式设置:
<acti
攻城狮送女友的CSS3生日蛋糕
ini
html Web html5 css css3
在线预览:http://keleyi.com/keleyi/phtml/html5/29.htm
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>攻城狮送女友的CSS3生日蛋糕-柯乐义<
读源码学Servlet(1)GenericServlet 源码分析
jzinfo
tomcat Web servlet 网络应用 网络协议
Servlet API的核心就是javax.servlet.Servlet接口,所有的Servlet 类(抽象的或者自己写的)都必须实现这个接口。在Servlet接口中定义了5个方法,其中有3个方法是由Servlet 容器在Servlet的生命周期的不同阶段来调用的特定方法。
先看javax.servlet.servlet接口源码:
package
JAVA进阶:VO(DTO)与PO(DAO)之间的转换
snoopy7713
java VO Hibernate po
PO即 Persistence Object VO即 Value Object
VO和PO的主要区别在于: VO是独立的Java Object。 PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实际数据库中。
实际上,这个VO被用作Data Transfer
mongodb group by date 聚合查询日期 统计每天数据(信息量)
qiaolevip
每天进步一点点 学习永无止境 mongodb 纵观千象
/* 1 */
{
"_id" : ObjectId("557ac1e2153c43c320393d9d"),
"msgType" : "text",
"sendTime" : ISODate("2015-06-12T11:26:26.000Z")
java之18天 常用的类(一)
Luob.
Math Date System Runtime Rundom
System类
import java.util.Properties;
/**
* System:
* out:标准输出,默认是控制台
* in:标准输入,默认是键盘
*
* 描述系统的一些信息
* 获取系统的属性信息:Properties getProperties();
*
*
*
*/
public class Sy
maven
wuai
maven
1、安装maven:解压缩、添加M2_HOME、添加环境变量path
2、创建maven_home文件夹,创建项目mvn_ch01,在其下面建立src、pom.xml,在src下面简历main、test、main下面建立java文件夹
3、编写类,在java文件夹下面依照类的包逐层创建文件夹,将此类放入最后一级文件夹
4、进入mvn_ch01
4.1、mvn compile ,执行后会在