网站开发合肥,诚聘网站开发人员,西安网站推广慧创科技,黄骅港十里金沙滩门票成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的#xff0c;本身也是操作字符串的#xff0c;但是与String类不同#xff0c;String类的内容一旦声明之后则不可改变#xff0c;改变的只是其内存地址的指向#xff0c;而StringB…成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的本身也是操作字符串的但是与String类不同String类的内容一旦声明之后则不可改变改变的只是其内存地址的指向而StringBuffer中的内容是可以改变的对于StringBuffer而言本身是一个具体的操作类所以不能你String那样采用直接赋值的方式进行对象的实例化必须通过构造方法完成当一个字符串的内容需要被经常改变时就要使用StringBufferStringBuffer的内容是可以修改的通过引用传递的方式完成StringBuffer常用方法字符串连接操作append()在任意位置处为StringBuffer添加内容insert(int offset, boolean b)字符串反转操作reverse()替换指定范围的内容replace(int start, int end, String str)字符串截取substring(int start, int end)字符串截取delete(int start, int end)查找指定的内容是否存在indexOf()以上的常用方法实际上对于String类中也是存在的所以使用的时候直接根据DOC文档查看即可小结凡是需要频繁修改字符串内容的时候都要使用StringBuffer类完成StringBuffer类中也提供了一些方法是String类中所没有的包括delete()、insert()等等这些方法需要的时候直接通过DOC文档进行查找2.Runtime类Runtime运行时是一个封装了 JVM进程的类。每一个JAVA程序实际上都是启动了一个 JVM进程那么每一个JVM进程都是对应这一个Runtime实例此实例是由 JVM为其实例化的Runtime类的定义中根本就没有构造方法本类的构造方法被私有化了通过 getRuntime()静态方法就可以取得Runtime类的实例得到 JVM信息每一个Runtime对象都是由 JVM进行实例化所以可以直接通过此类取得一些信息可以直接使用 Runtime类运行本机的可执行程序public Process exec(String command) throws IOExceptionexec()方法的加值值是 Process表示一个进程的操作类可以通过 destroy()方法销毁掉一个进程小结Runtime类本身就是单态设计的一种应用因为在整个 JVM中只存在一个Runtime类的对象可以使用Runtime类取得 JVM的系统处或者使用 gc()方法释放掉垃圾空间还可以使用此类运行本机的程序3.国际化程序国际化程序根据不同的语言环境找到不同的资源文件之后从资源文件中取出内容资源文件中的内容都是以 key -value的形式保存的所以在读取的时候通过其 key找到对应的 value即可如果要想实现 Java程序的国际化操作必须通过以下的三个类完成java.util.Locale用于表示一个国家语言类java.util.ResourceBundle用于访问资源文件java.text.MessageFormat格式化资源文件的占位字符串Locale类Locale表示的是本地实际上使用的是一个 ISO编码的封装类。对于各个国家来说都存在一个唯一的编码那么这种编码就称为 ISO编码使用Locale可以指定好一个具体的国家编码中国编码zh-CN英语-美国的编码eh-US法语的编码fr-FRResourceBundle此类是专门完成属性文件读取操作的读取的时候直接指定文件名称即可(此文件名称一般不需要指定后缀后缀统一为 *.properties)可以根据Locale所指定的区域码来自动选择所需要的资源文件public static final ResourceBundle getBundle(String baseName)此方法就是指定要操作的资源文件此方法找到的是默认的操作系统的语言Locale对象public final String getString(String key)根据 key取得对应的 value资源文件命名的时候最好采用单词首字母大写的方式完成【注意】对于中文的资源文件虽然可以直接通中文读取但是这样做是不合理的应该将其进行 Unicode编码转换为Java认识的16进制这样可以避免一些系统所带来的乱码问题此工具为 JDK自动提供native2ascii.exe只要是中文就必须进行转码操作处理动态文本就必须在资源文件中进行一些动态文本的配置设置点位符则必须使用 MessageForm类此类是在 java.text包中定义的在 Format类中还存在数字格式化的 Format(NumberFormat)、日期格式化的 Format(DateFormat)JAVA新特性可变参数在 JDK1.5之后增加了新特性的操作可以向方法中传递可变的参数小结国际化程序实现的思路程序与显示相分离根据不同的 Locale指定的区域找到不同的资源文件并根据其 key取得对应的 value使用资源文件的方式保存所有的信息内容其基本原理就是依靠了 ResourceBundle类取得资源文件中的内容MessageForm是 Format类的子类以后还会有 Format其它子类的讲解4.System类System类是一些与系统相关的属性和方法的集合在 System类中所有的属性都是静态的要想引用这些属性和方法直接使用System类调用即可System类可以通过方法取得一个操作的计算时间System.currentTimeMillis()还可以列出本机的全部系统属性getProperties()一个对象如果不使用则要等待进行垃圾收集垃圾收集可以自动调用也可以手工调用手工调用的时候就是调用 System.gc()或者 Runtime.getRuntiom().gc()。但是如果一个对象在回收之前需要做一些收尾的工作则就必须覆写 Object类中的protected void finalize() throws Throwable在对象被回收之前进行调用以处理对象回收前的若干操作例如释放资源等等只有强制性调用 gc()的时候才可以发现对象被回收当然如果不调用则系统也会在一定时间内自动进行回收对象生命周期初始化-对象实例化-垃圾收集-对象终结-卸载小结System类本身提供的静态属性都是与 IO操作有关的在 IO操作中还将进一步涉及 System类的使用可以使用 System类取得计算的时间以及通过 gc()方法进行垃圾收集此方法就是包装了 Runtime类中的 gc()方法5.日期操作类Date类是一个较为常用的类但是其操作的日期格式会有一些不符合于个人的要求而如果要想进一步取得一些自己需要的时间则可以使用Calendar类在java.util包中定义了 Date类Data类本身使用非常简单直接输出其实例化对象即可如果希望可以按照自己需要的格式显示时间可以使用 Calendar类此类可以直接将日期精确到毫秒Calendar类是一个抽象类既然是一个抽象类则肯定无法直接使用此时就要利用对象多态性的概念通过向上转型关系实例化本类对象使用 Calendar类可以非常轻松取得一个完整的日期但是在取得月份的时候要特别注意需要增加1最好的做法是将 Date进行一些相关的格式化操作小结Date类虽然直接取出的时间格式并不是十分理想但是其作用依然很大通过 Calendar类可以完整的取得时间6.DateFormat、SimpleDateFormatDateFormat类是一个抽象类其类本身的内部提供了可以直接为其实例化的操作得到日期的 DateFormat对象public static final DateFormat getDateInstance()得到日期时间的 DateFormat对象public static final DateFormat getDateTimeInstance()直接使用 DateFormat类完成Date类的转换public final String Format(Date date)通过DateFormat类可以直接将 date类的显示进行合理的格式化操作此时采用的是默认的格式化操作也可以通过 Locale对象指定要显示的区域SimpleDateFormat类功能是完成日期的显示格式化的要想实现转换则必须首先准备好一个模板通过此模板进行日期数据的提取工作在SimpleDateFormat类使用的时候必须注意的是构造对象时要传入匹配的模板构造方法public SimpleDateFormat(String pattern)转换public Date parse(String source) throws ParseException此时取得的是全部的时间数格式化public final String format(Date date)将时间重新格式化成字符串显示小结DateFormat可以直接使用但其本身是一个抽象类可以根据 Locale指定的区域不同得到不同的日期时间显示效果SimpleDateFormat类是 DateFormat类的子类一般情况下来说 DateFormat类很少会直接使用而都使用 SimpleDateFormat类完成直接使用 SimpleDateFormat类取得时间会比使用 Calendar类更加方便而且不用去增加补零的操作所以在开发中如果需要取得一个日期的话则基本上都使用 SimpleDateFormat类进行操作7.Math与RandomMath类表示数学操作Math类中的方法都是静态方法直接使用“类.方法名称()”的形式调用即可Math.round求四舍五入的时候实际上是将小数点之后的内容全部忽略掉了如果此时需要进行准确倍数的四舍五入则需要使用其它的类完成BigDecimalRandom类的主要功能是产生随机数可以产生一个指定范围的随机数Random类是定义在 java.util包中的类小结Math类中的 round()方法要特别注意Random类的主要功能8.NumberFormat可以使用 NumberFormat类进行本地化的数字显示可以使用 DecimalFormat指定格式化模板NumberFormat表示数字的格式化类即可以按照本地的风格习惯进行数字的显示MessageForm、DateFormat、NumberFormat是 Format三个常用的子类如果要想进一步完成一个好的国际化程序则肯定需要同时使用这样三个类完成根据不同的国家显示日期或者显示货币的形式DecimalFormat是 NumberFormat类的子类可以直接指定其显示的模板DecimalFormat主要的作用是用来格式化数字使用当然在格式化数字的时候要比直接使用 NumberFormat更加方便因为可以直接指定按用户自定义的方式进行格式化操作与之前讲解的 SimpleDateFormat类似如果要想进行自定义格式化操作则必须指定格式化操作的模板小结NumberFormat完成的功能只是根据区域不同固定的数字显示格式DecimalFormat是可以由用户自己指定其显示的形式所以比较好用9.大数操作在java中有两个大数的操作类操作整型BigInteger操作小数BigDecimal如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话则此数据就无法装入所以此时要使用BigInteger类进行操作BigDecimal使用此类可以完成大的小数操作而且也可以使用此类进行精确的四舍五入这一点在开发中经常使用对于不需要任何准确计算精度的程序可以直接使用float或double完成但是如果需要精确计算的结果则必须使用BigDecimal类小结使用BigDecimal可以指定好四舍五入的精确位置10.对象克隆技术对象克隆对象的复制完整的复制一个对象如果要想完成对象克隆的话则肯定依靠 Object类方法protected Object clone() throws CloneNotSupportedExcetion以上的方法就是对象克隆的方法如果现在一个类的对象被克隆则就必须在此类中明确的覆写此方法但是此方法不能直接调用Cloneable是一个接口但是在此接口中并没有规定任何的操作方法所以此接口实际上属性标识接口表示一种能力对象克隆支持在java中支持对象的克隆操作直接使用 Object类中的clone()方法即可对象所有的类必须实现 Cloneable接口才可以完成对象的克隆操作小结在以后的JAVA类库中会经常看到 Cloneable接口的出现只有实现了 Cloneable接口的对象才可以被克隆否则无法克隆11.比较器(Comparable、Comparator)Array类中存在 sort()方法此方法可以直接对对象进行排序可以直接使用 java.util.Arrays类进行数组的排序操作但对象所在的类必须实现 Comparable接口用于指定排序接口比较器的排序原理实际上比较器的操作就是经常听到的二叉树的排序算法排序的基本原理使用第一个元素作为根节点之后如果后面的内容比根节点要小则放在左子树如果内容比根节点的内容要大则放在右子树另一种比较器如果一个类已经开发完成但是此类建立的初期并不实现 Comparable接口此时肯定是无法进行对象排序操作的所以为了解决这样的问题java又定义了另一个比较器的操作接口Comparator小结在使用中尽可能还是使用 Comparable在需要排序的类上实现好此接口而 Comparator需要单独建立一个排序的类这样如果有很多的话则排序的规则类就会非常的多操作起来比较麻烦掌握一点只要是对象排序则在java中永远是以 Comparable接口为准12.观察者模式如果要想实现观察者模式则必须依靠java.util包中提供的 Observable类和 Observer接口在 Observer接口中的 update方法里面有两个参数o表示 Observable类的对象arg需要被观察的内容小结此模式是一种Java本身的机制不使用 Observer和 Observable也是可以实现的只是比较复杂13.正则表达式正则表达式可以方便的对数据进行匹配可以执行更加复杂的字符串验证拆分、替换功能Pattern、Matcher两个类为正则的核心操作类两个类都定义在 java.util.regex包中Pattern类的主要作用是进行正则规范(如“[0-9]”就属于正则规范)的编写Matcher类主要是执行规范验证一个字符串是否符合其规范正则表达式\d表示数字[0-9]\D表示非数字[^0-9]\w表示字母、数字、下划线[a-zA-Z0-9]\W表示非字母、数字、下划线[^a-zA-Z0-9]要想驱动正则表达式必须依靠Pattern类和Matcher类Pattern类中没有明确的构造方法可以供用户使用那么则肯定此类的构造方法被私有化了则可以直接从Pattern类中取得本类的实例指定好操作的正则public static Pattern compile(String regex)可以为 matcher类实例化public Matcher matcher(CharSequence input)拆分public String[] spilt(Charsequence input)如果要验证一个字符串是否符合规范则可以使用Matcher类进行字符串的验证public boolean matcher()字符串替换public String replaceAll(String replacement)只要使用正则的验证的规则那么就可以匹配各种复杂的字符串String类对正则的支持在 JDK1.4之后Java对正则进行了一些扩充在 String中开始直接支持正则的操作字符串匹配public boolean matchers(String regex)字符串替换public String replaceAll(String regex, String replacement)字符串拆分public String[] split(String regex)【注意】如果有时候发现一个字符串无法按照指定的字符拆分的话则需要使用“\”转义转义的时候两个“\”表示一个“\”小结使用正则可以方便的完成字符串的验证、拆分、替换等复杂功能在开发中一般都会直接使用 String类中提供好的正则支持而往往很少直接使用 Pattern类或者Matcher类在一些正则应用的时候对于一些敏感的字符要进行转义操作14.定时调度定时调度每当一段时间程序会自动执行称为定时调度如果要使用定时调度则必须保证程序始终运行着才可以也就是说是相当于定时调度是在程序之外又启动了一个新的线程Timer和 TimerTask两个类完成定时调度Timer类Timer类是一种线程设施可以用来实现在某一时间或某一段时间后安排某一个任务执行一次或定期重复执行该功能要与 TimerTask配合使用。TimerTask类用来实现由 Timer安排的一次或重复执行的某一个任务每一个 Timer对象对应的是一个线程因此计时器所执行的任务应该迅速完成否则可能会延迟后续任务的执行而这些后续的任务就有可能堆在一起等到该任务完成后才能快速连续执行schedule()与scheduleAtFixedRate()方法的区别两者的区别在与重复执行任务时对于时间间隔出现延迟的情况处理schedule()方法的执行时间间隔永远是固定的如果之前出现了延迟的情况之后也会继续按照设定好的间隔时间来执行scheduleAtFixedRate()方法可以根据出现的延迟时间自动调整下一次间隔的执行时间TimerTask类要想执行具体的任务则必须使用TimerTask类TimerTask类是一个抽象类如果要使用该类需要自己建立一个类来继承此类并实现其中的抽象方法如果现在一个 Timer类要想调度程序的话则需要使用 TimerTask的子类完成一个具体的任务操作类以后定时调度的是此类的操作方法的主体就是 run()方法小结一般在 web的开发中此内容比较有用因为要维护一个窗口不关闭才可以一直定时操作下去JAVA IO1.File类所有的 io操作都保存在 java.io包中在整个 io包中唯一表示与文件本身有关的类就是 File类使用 File类可以进行创建或删除文件等常用操作构造方法public File(String pathname) -实例化 File类的时候必须设置好路径直接根据路径找到文件File类常用方法创建文件public boolean createNewFile() throws IOException分隔符File.separator删除一个文件public boolean delete()判断文件是否存在public boolean exists()所有的 JAVA IO操作并不会立刻执行因为 JAVA是通过 JVM与底层进行交互的所以所有的操作需要经过 JVM完成那么就有可能产生延迟创建文件夹public boolean mkdir()列出指定目录的全部文件以字符串数组的形式返回public String[] list()-只是列出全部的名字包括文件夹名字和文件名字以 File数组的形式返回pulic File[]listFiles()-列出一个完整的路径这样对于程序本身来说是很容易操作的判断一个给定的路径是否是目录public boolean isDirectory()小结File类是在 java.io包中唯一与文件本身有关的可以使用 File类创建、删除等常见的文件操作在使用 File类指定路径的时候一定要注意操作系统间的差异尽量使用 separator进行分割2.RandomAccessFileRandomAccessFile类的主要功能是完成随机读取功能可以读取指定位置的内容RandomAccessFile写数据的时候可以将一个字符串写入读的时候需要一个个的以字节的形式读取出来如果要想操作文件内容的话可以使用 RandomAccessFile完成小结RandomAccessFile类的作用RandomAccessFile类操作起来比较麻烦所以在 IO中会提供专门的输入、输出操作3.字节流与字符流流在程序中所有的数据都是流的方式进行传输或保存的程序需要数据的时候要使用输入流读取数据而当程序需要将数据保存起来的时候就要使用输出流完成程序中的输入输出都是以流的形式保存的流中保存的实际上全都是字节文件在 java.io包中操作文件内容的主要有两大类字节流、字符流两类都分为输入和输出操作在字节流中输出数据主要是使用 OutputStream完成输入使的是 InputStream在字符流中输出数据主要是使用 Writer类完成输入主要是使用 Reader类完成实际上四个操作类都是抽象类在 JAVA中 IO操作也是有相应步骤的以文件操作为例主要的操作流程如下使用 File类打开一个文件通过字节流或字符流的子类指定输出的位置进行读/写操作关闭输入/输出使用 File类操作的时候一定要有路径的问题注意分隔符IO操作属于资源操作对于资源操作操作的最后都必须关闭否则就有可能出现未知的错误字节流字节流主要是操作 byte类型数据以 byte数组为准主要操作类就是 OutputStream、InputStreamByte是字节肯定是字节流操作所有的数据基本上都可以直接使用 byte数组表示出来OutputStreamOutputStream是整个 IO包中字节输出流的最大父类OutputStream是一个抽象类如果要想使用此类的话则首先必须子类实例化对象那么如果现在要操作的是一个文件则可以使用FileOutputStream类通过向上转型之后可以为 OutputStream实例化Closeable表示可以关闭的操作因为程序运行到最后肯定要关闭Flushable表示刷新清空内存中的数据InputStream通过 InputStream可以从文件中把内容读取进来InputStream本身也是一个抽象类必须依靠其子类如果现在是从文件中读取子类肯定是 FileInputStream知道文件大小直接使用 File类即可public long length()字符流在程序中一个字符等于2个字节JAVA提供了Reader、Writer两个专门操作字符流的类WriterWriter本身也是一个抽象类如果要想使用此类则肯定要使用其子类此时如果是向文件中写入内容所以应该使用 FileWriter的子类字符流的操作比字节流操作好在一点就是可以直接输出字符串了不用再像之前那样进行转换操作了ReaderReader是使用字符的方式从文件之中取出数据Reader本身也是抽象类如果现在要从文件中读取内容则可以直接使用 FileReader子类字节流与字符流的区别字节流和字符流使用是非常相似的字节流在操作的时候本身是不会用到缓冲区(内存)的是与文件本身直接操作的字符流在操作的时候是使用到缓冲区的【问题】开发中使用字节流好还是字符流好在所有的硬盘上保存文件或是进行传输的时候都是以字节的方式进行的。包括图片也是按字节完成而字符是只有在内存中才会形成的所以使用字节的操作是最多的小结掌握流的概念掌握字节流和字符流操作文件的基本步骤本章是以文件为例实际以后的所有操作都可以通过此段代码完成只是替换子类而已字节流和字符流的区别字节流没有使用缓冲区字符流使用了缓冲区边读边写的方式在开发中非常有用处4.字节-字符转换流在整个 IO包中实际上就是分为字节流和字符流但是除了这两个流之外还存在了一组字节流-字符流的转换OutputStreamWriter是Writer的子类将输出的字符流变为字节流即将一个字符流的输出对象变为字节流的输出对象InputStreamReader是Reader的子类将输入的字节流变为字符流即将一个字节流的输入对象变为字符流的输入对象如果以文件操作为例则在内存中的字符数据需要通过 OutputStreamWriter变为字节流才能保存在文件之中读取的时候需要将读入的字节流通过 InputStreamReader变为字符流虽然只是以文件操作为例因为 OutputStreamWriter中接收的类型是 OutputStream只要是字节输出流都可以使用字符的形式操作而InputStreamReader()中接收的类型是 InputStream只要是字节的输入流都可以使用字符的输入流操作FileWriter和FileReader的说明从 JDK文档中可以知道 FileOutputStream是 OutputStream的直接子类FileOutputStream也是 InputStream的直接子类但是在字符流文件的两个操作类却有一些特殊FileWriter并不直接是Writer的子类而是 OutputStreamWriter的子类而 FileReader也是直接是 Reader的子类是 InputStreamReader的子类那么从这两个类的继承关系就可清楚的发现不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入输出流的也就是说最后不管如何虽然是以字符的输出流形式操作了字节的输出流但是实际上还是以字节的形式输出而字符的输入流虽然以字符的形式操作但是实际还是使用的字节流也就是说传输或者是从文件读取数据的时候文件里真正保存的数据永远是字节小结一定要掌握两个转换类的作用一定要明白操作的终端点实际上都是以字节的形式进行的FileWriter和FileReader两个子类的定义中间使用了转换类5.内存操作流之前的输入和输出都是从文件中来的当然也可以将输出的位置设置在内存之上此时就要使用 ByteArrayInputStream、ByteArrayOutputStream来完成输入、输出功能了ByteArrayInputStream主要完成将内容写入到内存之中ByteArrayOutputStream主要将内存中的数据输出此时操作的时候应该以内存为操作点如果要想把一个字符变为小写则可以通过包装类Character小结内存操作流的操作对象一定是以内存为准不要以程序为准实际上此时可以通过向上转型的关系为 OutputStream或 InputStream实例化这样的操作可以很好的体现对象的多态性通过实例化其子类的不同完成的功能也不同也就相当于输出位置也就不同如果是文件则使用 FileXxx如果是内存则使用 ByteArrayXxx内存输出流是 JAVA开发中也经常要使用到要重点掌握6.管道流管道流的主要作用是可以进行两个线程间的通讯分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream)如果要想进行管道输出则必须把输出流连在输入流之上在PipedOutputStream类上有一个方法用于连接管道public void connect(PipedInputStream snk) throws IOException要想实现管道流则可以使用 PipedInputStream和 PipedOutputStream小结在 JAVA开发中很少直接去开发多线程程序7.打印流在整个 IO包中打印流是输出信息最方便的类主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)在打印流类中定义了很多的 print()或 println()方法System.out.println()此方法可以打印任何数据类型构造方法public PrintStream(OutputStream out) -参数指定输出位置在 JDK1.5之后JAVA又对 PrintStream类进行了扩充增加了格式化的输出方式直接使用 printf()方法就可以完成操作小结PrintStream可以方便的完成输出的功能在以后的输出中基本上都使用 PrintStream完成因为比较方便一些PrintStream属于装饰设计模式8.System类对 IO类的支持System.out和 System.err的区别System.out和 System.err都是 PrintStream的实例化对象而且两者都可以输出错误信息但是一般来讲 System.out是将信息显示给用户看是正常的信息显示而 System.err的信息正好相反是不希望用户看到的会直接在后台打印是专门显示错误的System.in实际上是一个键盘的输入流其本身是 InputStream类型的对象那么此时就可以利用此方式完成从键盘读取数据的功能指定了输入数据的长度如果现在输入的数据超过了长度范围则只能输入部分数据指定的 byte数组长度是奇数的话则还有可能出现中文乱码的问题最好的输入方式最好的输入方式是将全部输入的数据暂放到一块内存之中之后一次性的从内存中读取出数据这样所有数据只读了一次则不会造成乱码而且也不会受长度的限制如果要想实现以上的功能则只能通过 BufferReader类完成重定向为 System.out输出重定向使用 setOut()方法完成为 System.err输出重定向使用 setErr()方法完成为 System.in输出重定向使用 setIn()方法完成对于重定向操作基本上都在 System.out上使用以把信息展现给用户观看小结三个常量的使用System.out是希望用户可以看见的信息用 IDE(Eclipse)的话错误信息是用黑颜色显示的System.err是不希望用户可以看见的信息用 IDE(Eclipse)的话错误信息是用红颜色显示的System.in对应键盘输以上三个常量的输入、输出都可以重定向但是一般只建议修改 setOut的重定向System.in 读取的时候会出现中文乱码问题则可以通过 BufferReader完成读取功能9.BufferedReader类如果想接收任意长度的数据而且避免乱码产生就可以使用 BufferedReaderpublic class BufferedReader extends Reader -因为输入的有可能出现中文所以此处使用字符流完成BufferedReader是从缓冲区中读取内容所有的输入的字节数据都将放在缓冲区之中System.in本身表示的是 InputSteam(字节流)现在要求接收的是一个字符流则需要将字节流变为字符流才可以InputStreamReader小结掌握 BufferedReader类的作用可以使用 BufferedReader接收输入的数据10.Scanner类在 JDK1.5之后 JAVA提供了专门的输入数据类此类可以完成 BufferReader类的功能也可以方便的对输入数据进行验证此类放在 java.util包中此类是个工具类如果要想输入空格的话则就必须修改分隔符将分隔符变成“\n”Scanner这个类虽然可以接收各种类型但是对于日期型的数据却无法接收如果要想接收 Date类型的数据则只能通过字符串转型但是在接收的时候依然可以使用 Scanner类中提供的方法进行验证进行验证public String next(Pattern pattern)进行接收public String next(String pattern)还可以直接从文件中读取信息在使用 Scanner读文件的时候要考虑到换行的功能小结掌握 Scanner类的作用方便的读取数据在读取操作的时候一定要注意分隔符的影响11.数据操作流在 IO包中提供了两个与平台无关的数据操作流数据输出流DataOutputStream数据输入流DataInputStream通常数据输出流会按照一定的格式将数据输出再通过数据输入流按照一定的格式将数据读入如果要想使用数据操作流则肯定要由用户自己指定数据的保存格式必须按指定好的格式保存数据才可以使用数据输入流将数据读取出来DataOutputStream继承自 FilterOutputStream类(FilterOutputStream是 OutputStream的子类)同时实现了 DataOutput接口在 DataOutput接口定义了一系列的写入各种数据的方法DataOutputStream接口定义了一系列的 writeXxx()的操作可以写入各种数据类型的数据要想使用 DataOutputStream写入数据的话则必须指定好数据的输出格式小结随机读取访问很相似两个接口DataOutput接口、DataInput接口这两个接口的操作彼此对应而且以后还要使用12.合并流合并流从概念上讲就是内容合并在一起了合并流的主要功能就是将两个文件的内容合并成一个文件主要操作的是内容SequenceInputStream类直接继承自 InputStream13.压缩流ZIP是一种常见的压缩形式在 Java中要想实现 ZIP的压缩需要导入 java.util.zip包可以使用此包中的 ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成操作在 JAVA IO中不仅可以实现 ZIP压缩格式的输入、输出也可以实现 JAR及 GZIP文件格式的压缩ZipEntry在每一个压缩文件中都会存在多个子文件那么这每一个的子文件在 JAVA中就使用 ZipEntry表示在实例化 ZipEntry的时候要设置名称此名称实际上就是压缩文件中每一个元素的名称如果要想完成一个文件或文件夹的压缩要使用 ZipOutputStream类完成ZipOutputStream是 OutputStream的子类就是一个字节的输出流此类的功能就是 ZIP格式输出的在压缩文件中每一个压缩的内容都可以用一个 ZipEntry表示所以在进行压缩之前必须通过 puNextEntry设置一个 ZipEntry即可ZipFile是一个专门表示压缩文件的类在 Java中每一个压缩文件都可以使用 ZipFile表示还可以使用 ZipFile根据压缩后的文件名称找到每一个压缩文件中的 ZipEntry并将其进行解压缩操作ZipFile在实例化的时候必须接收 File类的实例此 File类的实例是指向一个压缩的 *.zip文件ZipEntry对象可以找到每一个 ZipEntry的输入流但是 ZipInputStream并不能得到每一个输入流所以需要使用 ZipFile但是 ZipInputStream在取得每一个 ZipEntry的时候不需要每一个 ZipEntry的名称小结压缩文件中每一个压缩实体都使用 ZipEntry保存一个压缩文件中可能包含一个或多个的 ZipEntry对象在 JAVA中可以进行zip/jar/gz三种格式的压缩支持操作流程基本是一样的ZipOutputStream可以进行压缩的输出但是输出的位置不一定是文件ZipFile表示每一个压缩文件可以得到每一个压缩实体的输入流14.回退流回退给了用户第二次读的机会在 JAVA IO中所有的数据都是采用顺序的读取方式即对于一个输入流来讲都是采用从头到尾顺序读取的如果在输入流中某个不需要的内容被读取进来则只能通过程序将这些不需要的内容处理掉为了解决这样的读取问题在 Java中提供了一种回退输入流(PusbackInputStream、PushbackReader)可以把读取进来的某些数据重新退回到输入流的缓冲区中使用 InputStream要使用 read()方法不断读取是采用顺序的读取方式回退操作同样分为字节和字符流对于回退操作来说提供了三个 unread()的操作方法这三个操作方法与 InputStream类中的 read()方法是一一对应的15.字符编码在计算机世界里任何的文字都是以指定的 编码方式存在的在 JAVA程序的开发中最常见的是以下的几种、GBK/GB2312、unicode、UTFISO8859-1编码属于单字节编码最多只能表示 0~255的字符范围主要在英文上应用GBK/GB2312中文的国标编码专门用来表示汉字是双字节编码GBK包括中文繁体字库更大unicodejava中就是使用此编码式也是最标准的一种编码是使用16进制表示的编码但此编码不兼容ISO8859-1编码UTF由于 nnicode不支持 ISO8859-1编码而且容易占用更多的空间而且对于英文字母也需要使用两个字节编码这样使用 unicode不便于传输和存储因此产生了 utf编码utf编码兼容了 ISO8859-1编码同时也可以用来表示所有的语言字符不过 utf编码是不定长编码每一个字符的长度从 1~6个字节不等一般在中文网页中使用此编码因为这样可以节省空间如果没有处理好编码的事情则肯定在程序中出现乱码乱码产生的根本原因就是字符编码不统一造成的小结了解几种常用的编码特点理解乱码是如何产生的16.对象序列化什么叫对象序列化一个对象产生之后实际上是在内存中为其开辟了一个存储空间方便存储信息对象序列化就是把一个对象变为二进制的数据流的一种方法通过对象序列化可以方便的实现对象的传输或存储如果一个类的对象想被序列化则对象所在的类必须实现 java.io.Serializable接口Serializable接口中没有一个方法此接口属于一个标识接口表示具备了某种能力被序列化了的对象变为二进制 byte流对象的序列化和反序列化要想完成的输入或输出还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)使用对象输出流输出序列化对象的步骤有时也称为序列化而使用对象输入读入对象的过程有时也称为反序列化对象序列化依靠ObjectOutputStream对象反序列化依靠ObjectInputStreamObjectOutputStream类的使用形式与 PrintStream非常的相似在实例化时也需要传入一个 OutputStream的子类对象之后根据传和的 OutputStream子类的对象不同输出的位置也不同(装饰模式)SerialVersionUID在对象进行序列化或反序列化操作的时候要考虑 JDK版本的问题如果序列化的 JDK版本和反序列化的 JDK版本不统一则就有可能造成异常所以在序列化操作中引入了一个 SerialVersionUID的常量可以通过此常量来验证版本的一致性在进行反序列化时JVM会把传来的字节流中的 SerialVersionUID与本地相应实体(类)的 SerialVersionUID进行比较如果相同就认为是一致的要以进行反序列化否则就会出现序列化版本不一致的异常【问题】对象序列化到底序列化了哪些东西所有的对象拥有各自的属性值但是所有的方法都是公共的所以序列化对象的时候实际上序列化的就是属性Externalizable接口使用Serializable接口可以方便的序列化一个对象但是在序列化操作中也提供了另外一种序列化机制Externalizable接口被 Serializable接口声明的类其对象的内容都将被序列化如果现在用户希望可以自己指定序列化的内容则可以让一个类实现 Externalizable接口写入方法void writeExternal(ObjectOutput put) throws IOException读取方法void readExternal(ObjectInput in) throws IOExcetion,ClassNotFoundExceteption在使用 Externalizable接口的时候需要在被序列化的类中定义一个无参构造函数因为此接口在进行反序列化的时候会先用类中的无参构造方法为其进行实例化之后再将内容分别设置到属性之中transient关键字当使用 Serializable接口实现序列化操作时如果一个对象中的某个属性不希望被序列化的话则可以使用 transient关键字进行声明transient Serializable接口完成可以取代 Externalizable接口的功能序列化一组对象对象输出时只提供了一个对象的输出操作(writeObject(Object obj))并没有提供多个对象的输出所以如果现在要同时序列化多个对象的时候就可以使用对象数组进行操作因为数组属于引用数据类型所以可以直接使用 Object类型进行接收如果要保存多个对象则最好使用对象数组的形式完成数组保存的数据有限所以为了解决这样的问题Java中引入了类集框架解决数组的存储限制问题小结对象序列化的作用对象序列化并不一定都向文件中保存也有可能面向于其它的输入或输出被序列化的类必须实现 Serializable接口如果某个属性不希望被保存下来则可以使用 transient关键字声明ObjectOutputStream序列化对象ObjectInputStream反序列化对象Externalizable接口的作用开发人员手工实现序列化的操作使用序列化保存一组对象的时候要使用对象数组的形式操作