Java常用基本类库_第1页
Java常用基本类库_第2页
Java常用基本类库_第3页
Java常用基本类库_第4页
Java常用基本类库_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JavaJava这么学不枯燥这么学不枯燥基础篇基础篇JavaJava常用基本类库常用基本类库如鹏网StringString成员方法成员方法( (常用常用) )boolean equals(Object obj):判断字符串的内容是否相同,区分大小写。boolean equalsIgnoreCase(String str):判断字符串的内容是否相同,不区分大小写。boolean contains(String str):判断字符串对象是否包含给定的字符串。boolean startsWith(String str):判断字符串对象是否以给定的字符串开始。boolean endsWith(Stri

2、ng str):判断字符串对象是否以给定的字符串结束。案例:判断输入的是否是admin(不区分大小写);判断是否是网址:以http:/开头、以.com或者.cn结尾。StringString成员方法成员方法int length():int length():获取字符串的长度获取字符串的长度char charAt(int index):char charAt(int index):返回字符串中给定索引处的字符返回字符串中给定索引处的字符int indexOf(int ch):返回指定字符在此字符串中第一次出现的索引int indexOf(String str):返回指定字符串在此字符串中第一次出

3、现的索引lastIndexOf:最后一次出现的位置。String substring(int start):String substring(int start):截取字符串。返回从指定位置开始截取后的字符串。截取字符串。返回从指定位置开始截取后的字符串。String substring(int start,int end)String substring(int start,int end)截取字符串。返回从指定位置开始到指定位置截取字符串。返回从指定位置开始到指定位置结束截取后的字符串。结束截取后的字符串。案例获取一个文件名的名称和扩展名部分(备注)案例获取一个文件名的名称和扩展名部分(备

4、注)练习:获取番号练习:获取番号StringString成员方法成员方法String toLowerCase()String toLowerCase():把字符串变成小写:把字符串变成小写String toUpperCase():String toUpperCase():把字符串变成大写把字符串变成大写String replace(char oldChar,char newChar)String replace(char oldChar,char newChar):用新的字符:用新的字符去替换指定的旧字符去替换指定的旧字符String replace(String oldStr,String

5、newStr)String replace(String oldStr,String newStr):用新的字符串:用新的字符串去替换指定的旧字符串去替换指定的旧字符串( (* *) )String split(String regex)String split(String regex):切割功能,注意正则表达式:切割功能,注意正则表达式(以后讲)。把字符串用(以后讲)。把字符串用“, ,”分割分割String trim()String trim():去除字符串两端空格:去除字符串两端空格StringString是不可变的是不可变的,因此上面的操作都是生成新的字符串,因此上面的操作都是生成新

6、的字符串对象,要用返回值去取新的字符串。对象,要用返回值去取新的字符串。这么多方法怎么记得住?这么多方法怎么记得住?StringBufferStringBuffer使用jd-gui反编译发现 String s7=111+222+333+444+555 会被优化为 String s7 = 111222333444555;但是String s6 = s1 + s2 + s3 + s4 + s5;就没那么幸运了,每次+都会生成一个String对象,当连接字符串比较多的时候就会产生临时字符串对象。使用StringBuffer拼接字符串则不会有临时字符串对象的问题: StringBuffer sb =

7、new StringBuffer(); sb.append(s1); sb.append(s2); sb.append(s3); 因为append方法把this返回了,还可以sb.append(s1).append(s2).append(s3); 最后使用String s = sb.toString()一次性生成拼接结果字符串即可JDK1.5 增加了一个StringBuilder,用法和StringBuffer一样。StringBuffer是线程安全(*)的,效率略低;StringBuilder线程不安全,效率高,在大部分单线程环境使用StringBuilder会更好。基本数据类型不基本数据类

8、型不“面向对象面向对象”面向对象语言中应该“一切都是对象”,方法、int、double等应该都是类的对象。但是由于历史原因,java中的int、double、boolean等基本数据类型不是类。有的场合需要使用对象(JDBC中就会用到),怎么办? class IntClass private int value; public IntClass(int value) this.value = value; public int getInt() return this.value; int age=18; IntClass iAge = new IntClass(age); 使用使用insta

9、nceofinstanceof判断变量指向的对象类型。判断变量指向的对象类型。基本数据类型包装类基本数据类型包装类Java中内置提供了“包装类”(Wrapper):byteByte;shortShort;intInteger;longLong;floatFloat;doubleDouble;charCharacter;booleanBoolean。使用方法: int包装成Integer(装箱):Integer i=new Integer(18); int从包装中出来(拆箱):int i1 = Value();int等是基本数据类型,不能为null(没有指向任何对象);类变量可以是nu

10、ll。有时想表达“不知道数字是多少”的时候,用int任何值表示都不合适。Integer是类,因此可以为null,这样用null的Integer表示“没有赋值的整数、未知的整数”。自动装箱拆箱自动装箱拆箱(box/unbox)(box/unbox)J D K 1 . 5 之 后 i n t 和 I n t e g e r 之 间 转 换 不 需 要 n e w Integer/Value()。如下即可: Integer i = 123;/自动装箱 int i1= i;/自动拆箱通过jd-gui进行反编译看上面的代码生成的class,得知是编译器帮着完成的装箱拆箱。注意Integer 为

11、null的情况: Integer i2 = null; int i3 = i2;日期日期Java使用Date类(java.util包下)表示时间数据类型。n e w D a t e ( ) 当 前 时 间 , 也 有 n e w Date(System.currentTimeMillis(),看源代码,本质上是一样的。可以通过Date的getYear()、getMonth()、getHours() 等得到日期的年、月、小时等部分;也可以setYear等来设置日期,但是属于Deprecated(不推荐)的方法,因此尽量不要用。看文档提到了用CalendarCalendar是抽象类,通过调用get

12、Instance()静态方法得到一个当前时区、当前语言设置下的实例(猜测内部实现,打印cal.getClass()看一下返回的是哪个类的对象。这是一种设计模式),还可以使用getInstance()其他的重载获得其他时区、其他语言下的实例。CalendarCalendar根据DateTime得到各个部分:通过int get(int field)获得年月日小时分秒等部分,可选值Calendar的常量YEAR、MONTH、DAY_OF_MONTH(在月中的天数)、DAY_OF_WEEK(周中的天数,即周几)、DAY_OF_YEAR(一年中的第几天)、HOUR(12小时制)、HOUR_OF_DAY(

13、24小时制)、MINUTE(分钟)、SECOND(秒)。也可以void set(int field, int value)方法进行修改。 Calendar cal = Calendar.getInstance(); cal.setTime(new Date(); int day = cal.get(Calendar.DAY_OF_MONTH);根据设置各个部分,得到DateTime: void set(int year, int month, int date) void set(int year, int month, int date, int hourOfDay, int minute)

14、 DateTime date = cal.getTime();注意:Calendar的月份是从0开始。创建Date、解析Date都不要用自身的方法,而要通过Calendar。DateFormatDateFormatDateFormat用来把Date按照格式转换为String,它是抽象类,一般使用其子类Simp le D at e Format ,使用SimpleDateFormat(String pattern)这个构造函数,传递一个格式字符串进去。y年;M月;d天;H小时;m分钟;s秒。Year、Month、Day、Hour、Minute、Second“月”比“分钟”大,所以月M大写,分钟m

15、小写。测试“yyyy年MM月dd日 HH:mm:ss”、“yyyy-MM-dd”。使用String format(Date date),把Date格式化为字符串;public Date parse(String source)把字符串解析为Date。异常概念异常概念 Integer i1=null; int b = i1;异常发生在程序发生的不正常情况下。异常以一个异常类对象的形式抛出,异常类描述异常信息、发生的位置等。异常的根类为java.lang.Throwable,有两个直接子类java.lang.Error、java.lang.Exception。Error:程序本身无法恢复的严重错误

16、,比如内存不足等,一般不需要对Error进行处理;Exception:可以被程序捕获并处理的异常错误,比如文件找不到。编程中需要处理的异常一般都继承自Exception,*Exception类。异常的捕捉异常的捕捉 try /可能发生问题的代码 catch(异常类型 异常变量) /异常处理代码 finally /其他代码 比如: try Integer i1=null; int b = i1; catch (NullPointerException e) System.out.println(i1不能为null); e就是发生异常的异常类对象,变量名只要不冲突就任意。 在异常处理中,一旦try

17、里面有问题了。放弃try代码块中之后的代码,直接跳到catch里面执行。如果try代码后还有代码,则处理完catch后还会继续执行。多个异常的处理多个异常的处理 try int a = 10; int b = 0; System.out.println(a / b); int arr = 1, 2, 3 ; System.out.println(arr3); catch (ArithmeticException ae) System.out.println(除数不能为0); catch (ArrayIndexOutOfBoundsException ae) System.out.println

18、(数组越界异常); JDK 1.7之后还新增了一种简化多异常处理的语法: try / 操作代码 catch (ArrayIndexOutOfBoundsException | ArithmeticException e) System.out.println(这里出问题了); 里面有一个问题,就是异常处理的方法不好写了,因为得到的异常不明确了。ThrowableThrowable类类Throwable中的方法: public String getMessage():返回的是异常的消息字符串。 public void printStackTrace():把错误信息显示在控制台。e.printSt

19、ackTrace()并不是正确的处理异常的方式,要合理的识别异常类型,并且给出合适的处理,e.printStackTrace()只能让程序员知道“出错了”。也不用 catch(Exception ex) /空代码 这样以为“不会出错了”,其实是把异常“吃掉了”,会让程序陷入逻辑混乱状态,要科学合理的处理异常(以后经常用就明白了)。我一个学生吃掉数据库执行异常造成的“刷新不出数据”的假象。finallyfinally try /有可能有问题代码 catch(异常类型 异常变量) /处理方式 finally /无论“有可能有问题代码”是否出错都要执行的代码 finally中一般进行资源的回收等。面

20、试问题: final,finally的区别。 finally里面的代码真的永远会执行吗?永远执行。但是有一个特殊情况:在代码执行到finally之前,jvm就退出了。两种异常两种异常异常分为:非检查异常(Unchecked Exception)、检查异常(CheckedException)。RuntimeException为非检查异常,其他Exception子类都是检查异常。除了RuntimeException及其子类,其他类型的Exception都要被处理:catch或者throws。如果非RuntimeException不清楚catch住以后怎么处理合适或者不希望catch,那么可以用th

21、rows 声明到函数定义中“向上抛”:用下面的演示:用SimpleDateFormat的parse演示。可以throws多个异常:new一个不存在的FileInputStream路径。自定义异常类自定义异常类从Throwable使用Eclipse的【打开类型层次结构】查看Java异常类的继承层次。一般从RuntimeException、Exception继承的类提供常用的构造函数抛出异常FileFile文件处理文件处理Java中文件、文件夹都用File类表示。构造函数: File(String pathname):根据指定的路径创建File对象。 File(String parent, Str

22、ing child):根据指定的父文件夹和子文件或者文件夹创建File对象 File(File parent, String child):根据指定的父文件夹对象和子文件或者文件夹创建File对象判断类型: boolean isDirectory() 是文件夹 boolean isFile() 是文件如果是文件夹: boolean mkdir():创建指定的目录,如果存在,就不创建。 boolean mkdirs():创建指定的目录,如果存在,就不创建。这个时候,如果父目录不存在,它也会自动创建。FileFile文件处理文件处理( (自己试验自己试验) ) boolean delete():删

23、除这个文件或者文件夹。如果你删除的文件夹下还有内容,那么,必须先把所有内容删除完毕后,再删除文件夹。直接删除,不会保存到回收站。boolean exists():判断file对象是否存在boolean canRead():判断file对象是否可读boolean canWrite():判断file对象是否可写String getAbsolutePath():绝对路径String getPath():相对路径String getName():文件名称long length():文件大小,单位是字节long lastModified():上次修改时间的毫秒值。文件系统的遍历文件系统的遍历public

24、 static File listRoots():列出可用的系统文件根目录public String list():返回的是指定目录下所有文件或者文件夹的名称数组public File listFiles():返回的是指定目录下所有文件或者文件夹对象数组流流(Stream)(Stream)本地的照片是怎么上传到QQ空间服务器上的呢?播放器是怎么读取硬盘上的视频文件到播放器里面,然后显示的呢?我们编写的word文档是怎么保存到硬盘中的?这些都涉及到IO(Input/Output)操作。Java将IO操作(文件、网络等)简化成流模型,读取使用InputStream,写入使用OutputStream

25、。这两个类都是抽象类,网络、文件、加密等都是不同的子类,最常用的子类是FileInputStream、FileOutputStream。使用Stream的时候虽然可以:FileInputStream fis = new FileInputStream(.)但是InputStream fis = new FileInputStream(.)更好,在使用的变量类型提供的操作能满足的前提下,尽可能用父类、接口声明变量。FileOutputStreamFileOutputStreamFileOutputStream用于向文件中写入数据(throws):OutputStream fos = new Fi

26、leOutputStream(d:a.txt);byte bytes = abc你好de.getBytes();fos.write(bytes);fos.close();FileNotFoundException从IOException继承,所以只要throws IOException即可。OutputStream写入的单位是byte(字节),char转换为byte时候,一个英文char转换为一个byte(对应的ASCII码),一个中文char转换为两个byte(*采用Unicode编码),试着输出bytes的长度。不要往C盘写,因为Win7、Win8默认普通程序没有权限读取C盘。资源的关闭资

27、源的关闭直接把IOException throws 声明抛出是不负责的,如果write的发生异常,fos就不会被close了,其他程序就无法写入这个文件了,也会占用资源。资源要使用完毕才能close,一旦close之后就操作就会出错。编写一个比较标准的关闭资源的代码,见“课程笔记”解释: 把new、写入等操作都放到try块中,不用每句异常都try。 OutputStream fos = null;/ 不写=null行不行?为什么? 为什么finally中还要判断fos是否为null,因为以后可能在new FileOutputStream(.)之前会有代码(后面就会遇到),代码如果发生异常,那么

28、fos会没有来得及被赋值。 为什么fos.close()还要catch,但又什么不做?CloseQuietly(安静的关闭),因为后面还可能会关闭别人,不能因为关闭它出现异常就没机会关闭别人。(*)JDK1.7增加了try-with-resource语法,进一步简化资源关闭FileInputStreamFileInputStreamFileInputStream用于从文件中读取数据,代码见“课程板书”(备注)解释代码: byte bytes = new byte500 * 1024:每次读取多少字节数据,不能一次把一个文件读取出来,否则太占用内存,因为数组是占用内存的。这个就叫“缓冲区”,设的

29、太小CPU/硬盘会很忙、设的太大内存会很“撑”。 while (inStream.read(bytes) 0):继续从流中读取最多bytes长度那么多字节的数据拷贝到bytes数组中。下次read是从上次最后一个read最后的位置之后开始读,一次次的读取read方法返回这次一共读了多少字节(比如遇到最后一次读取,可能读不满),一旦返回的0更不容易出错)就说明读完了。对于基本数值类型数组,没有被赋值初始值就是0,因为没被填满的数组位置是0。 String str = new String(bytes); 把byte转换为对应String1. 1.字节流字节流不适合读取内容中包含中文的文本文档,容

30、易造成数据错乱(byte中含有一半的汉字)。要用后面讲的字符流字符流。复制文件复制文件使用FileInputStream 、FileOutputStream 配合完成文件拷贝:从源文件的FileInputStream 中读取一部分内容,再写入到目标文件的FileOutputStream 中。代码见“课程笔记”(备注)解释代码:1、while (len = fis.read(bytes) 0)把读取并且返回读取的长度给len,然后判断len的值综合为了一句话。复习:赋值表达式的值就是赋值后的变量的值。2、fos.write(bytes, 0, len) write函数的“签名”:void wri

31、te(byte b, int off, int len)每次write都会从上次write的最后位置接着写入。将byte数组b写入OutputStream中,off代码距离当前写入位置的偏移量,一般写0,len代表写入多长。当bytes是满满数据的时候调用write(byte b)即可,否则如果不满,则调用void write(byte b, int off, int len)缓冲区先设置为50,再修改为1M,体会速度的变化优化资源的关闭优化资源的关闭为了安全,每次关闭一个流都要写那么一堆代码,太麻烦,因此我们封装一个closeQuietly(安静的关闭)方法,思考怎么写?InputStrea

32、m一个closeQuietly、OutputStream一个closeQuietly,后面要讲的Socket、Writer、Reader等都要close,很累。从JDK1.5开始(since 1.5),所有需要close的资源都实现了Closeable接口,根据“多态”,只要声明一个closeQuietly(Closeable closeable)即可。多态的好处开始显现。案例:下载图片案例:下载图片惠及后人:封装一个函数void copy(InputStream inStream, OutputStream outStream,int bufferSize)用来把inStream拷贝到out

33、Stream中,缓冲区大小为bufferSize。要检查参数合法性(是否为null、bufferSize是否在合理范围)再提供一个使用默认缓冲区大小的copy的重载,复习重载URL是java中的一个类,可以用来表示一个网络资源。常用构造函数URL(String spec),因为给出的网址可能是错的,因此构造函数声明可能会抛出MalformedURLException使用URL的openStream方法可以得到文件的网络流,然后把这个文件下载下来。openStream返回的是什么类型的Stream?多态的好处ReaderReader、Writer Writer ( (文本内容文本内容) )直接用

34、InputStream/OutputStream(字节流)进行文本文件的读写会比较麻烦,因为要考虑文件的编码、中文字符等的问题。在a.txt中写入“你a好呀”,然后使用一个长度为4个byte去读,就会出现半个汉字的问题。Reader、Writer是用来读写字符流(character stream)的类,会帮着自动处理麻烦的问题。Reader、Writer是抽象类,有很多子类,最常用的就是InputStreamReader、O u t p u t S t r e a m W r i t e r , 用 来 基 于InputStream/OutputStream进行读写。演示:使用InputStr

35、eamReader进行读(备注)。 InputStreamReader的伪代码解释原理。演示:使用OutputStreamWriter进行写。编码编码由于历史原因,汉字等如何在计算机中以字节存储存在着多种标准,最常见的是GB2312(国家标准,表示汉字)、GBK(GB2312的扩展,还能表示繁体字等)、UTF-8(国际标准)、UTF-16等。举例:百度首页是采用UTF-8存储,点右键修改为GBK编码就会乱码;首页是采用GBK存储,修改为UTF-8也会乱码。再比如记事本保存文件的时候也可以选择编码:ANSI表示采用当前操作系统的默认编码,如果是中文Windows,默认就是GBK。用什么编码保存就

36、用什么编码读取,就不会乱码!用什么编码保存就用什么编码读取,就不会乱码!如何用其他编码保存?由OutputStreamWriter 构造函数决定(为什么?)new OutputStreamWriter(outStream,UTF-8)。怎么初步判断用什么编码,记事本“另存为”。读取的编码由InputStreamReader构造函数决定。BufferedBuffered直接使用InputStreamReader、OutputStreamWriter进行读写仍然是逐字符的进行,可以用Reader、Writer的另外子类BufferedReader、BufferedWriter配合读写,好处:不是一

37、个字符一个字符的读写,而是用缓冲区,效率更高;it is advisable to wrap a BufferedWriter around any Writer whose write() operations may be costly方便逐行处理:readLine、newLine1.警告:后面讲的会比较复杂,一堆类套来套去。但是这是“多态、设计模式”一个非常经典的案例。BufferedWriterBufferedWriter BufferedWriter buffWriter = null; OutputStreamWriter streamWriter = null; OutputSt

38、ream outStream = null; outStream = new FileOutputStream(d:1.txt); streamWriter = new OutputStreamWriter(outStream); buffWriter = new BufferedWriter(streamWriter); buffWriter.write(我爱你中国!); buffWriter.newLine();/windows下换行符rn,linux下是n buffWriter.write(I love you 中国!); buffWriter.newLine(); buffWriter

39、.write(thank you!); 首先得到OutputStream 这个原始字节流,再使用OutputStream 创建逐char读取写入的字符流写入器OutputStreamWriter ,再使用能批量写入字符串的BufferedWriter 注意关闭顺序的问题注意关闭顺序的问题注意关闭的顺序:如果 先关闭Stream,那么Writer就可能还没有把缓冲的数据写入,那只能强制writer.flush应该先关闭Writer(关闭之前把没有写入的自动flush写入)这样就不用手动flush,Stream关闭之后就写入不了东西了先 关 闭 依 赖 的 、 再 关 闭 被 依 赖 的 :Buf

40、feredWriterOutputStreamWriterOutputStream。BufferedReaderBufferedReaderBufferedReader buffReader = null;InputStreamReader streamReader = null;InputStream inStream = null;inStream = new FileInputStream(d:1.txt);streamReader = new InputStreamReader(inStream);buffReader = new BufferedReader(streamReader

41、);String line;while(line=buffReader.readLine()!=null)/逐行读取,当readLine返回null就读到了最后System.out.println(line);BufferedReaderBufferedReader注意:在别人没操作完之前不能close。思考:在读取的例子中:BufferedReader buffReader = null;BufferedReader buffReader = null;各自可以把声明改为父类Reader吗?为什么?复习,各自负责什么,怎么调用: BufferedWriter OutputStreamWriter OutputStream BufferedReader InputStreamReader InputS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论