Java随堂笔记_第1页
Java随堂笔记_第2页
Java随堂笔记_第3页
Java随堂笔记_第4页
Java随堂笔记_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、一.Java的特性: 1.第一个纯面向对象编程语言2.是一个类C的语言,去掉C+里面多继承、指针、析构函数(Java实现代码托管JVM)3.是一个跨平台的编程语言(一次编译,处处运行)4.Java是一个编译解释型语言5.Java是一个免费开源的编程语言编译型语言:源代码 ->编译程序->可执行程序解释型语言:源代码->解释程序->边解释边执行编译解释型语言:Java 源代码->(javac)编译程序->(xxx.class)中间件(字节码文件)->(java)解释程序(JRE Java运行时环境)->边解释边执行JavaSE Standard E

2、dition Java标准版本 JavaEE Enterprise Edition Java企业版本JavaME Micro Edition Java微型版本Java开发步骤 1.获取对应OS的编译程序和解释程序(JDK)2.选择执行平台对应版本的JDK3.安装JDKJDK目录结构bin -所有的JDK可执行程序(javac.exe 编译程序解释程序)db -Java内置的小型数据库include -NDK(本地化开发包) JIT java in timejre -Java运行时环境lib -库文件是Java全部系统函数 src.zip -Java的源文件4.配置环境变量配置Path变量配置J

3、AVA_HOME变量重新开启CMD命令键入javac命令测试是否配置成功5.开发第一个Java程序新建文本文件,将后缀名改为.java6.使用EditPlus编辑该文件前对EditPlus进行配置 编写第一个Java程序public class Test public static void main(String args) System.out.println("hello,Java,我是牛牛");二.1.Java语言的注释/ 单行注释/* 多行注释*/* 文档注释* */文档注释的使用:javadoc Test.java -d c:help -version -aut

4、hor2.Java中的变量2.1 计算机存储形式:以字节为存储单位 1byte = 8bit 计算机是二进制的世界 二进制->十进制转换(1.对应法eg 101 1*22 + 0*21 + 1*20 = 5 2.8421法)十进制->二进制(除2求余法, 余数倒序的数列)可以使用十六进制简化十进制长度,是一组表示方法。范围是0-9A-F2.2变量的类型 关键字:Java语言预置的标识符,有特定功能。51个关键字其中goto,const是关键字中的保留字标识符:编程人员可以自定义的变量名,标识符规则:只能包含四种字符0-9 a-zA-Z _ $, 同时不能由数字开头,遵循的原则是:见

5、名知义。Java中的数据类型:1.数值型 -基本数据类型 byte(1) short(2) int(4) long(8) float(4) double(8)2.字符型 -基本数据类型 char(2) 3.布尔型 -基本数据类型 boolean(1位) true false4.字符串 -引用类型(特殊的引用类型) String2.3变量的使用1.声明变量 int i;2.为变量赋值 i = 10;3.使用变量 int j = i;2.4Java运算符1.算术运算符 + - * / % += -= *= /= + -(注意:前后置不同)2.赋值运算符 = (注意:赋值运算符两边类型要匹配,如果不

6、匹配,Java会尝试自动转型 Java中自动转型原则是:小容量自动变为大容量,整形自动提升成浮点型)(注意:Java中可以由编程人员完成手动转型,在数据前面使用(目标类型)强制转型) 3.逻辑运算符 &&与 |或 !非 异或 (注意:在Java中逻辑运算符分为全操作和短路操作 &&表示短路 &表示全运算 开发时候尽量使用短路操作) 4.关系运算符 > < >= <= != = 5.逻辑位运算符 & | 6.位运算符 << >> >>> 7.字符串连接符 + (注意:在Java中会使

7、其他操作数类型自动转为字符串)2.5表达式优先级单目运算符 > 双目运算符 三目运算符 布尔值?值1:值2 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 (建议:开发使用()显示优先级关系)2.6执行结构1.顺序 2.分支(选择) 1.if 2.if else 3. if else if 4.switch (注意:Java中If的条件表达式必须是布尔值(true|false) 3.循环(迭代) 1.while 2.do while 3.for 4.增加for (jdk1.5) 4.循环内控制语句 continue break return (System.

8、exit() 可以使用转义字符完成一些特殊效果 r n t '一'(19968) '龥'(40869) (char)7为响铃2.7 局部变量的作用范围Java中的局部变量只在声明的语句块中有效,一旦脱离语句块自动释放。 注意:在对性能要求苛刻的编程环境,常常采用即用即释放的方式,提高内存的使用效率。2.8 数组的定义和使用Java中的数组特点:1.多个元素是同一种数据类型 2.元素的顺序在内存里是连续的 3.元素下标是从0开始的4数组的长度是通过length属性获取 5.数组是一种引用类型 6.Java多维数组只是数组中的数组 7.数组的长度一旦声明,是不可改变

9、(定长) Java中定义数组: 数组元素类型 数组变量名 = new 数组元素类型长度;Java中定义多维数组: 数组元素类型. 数组变量名 = new 数组元素类型长度长度;Java中内存区域功能: 加载区: 1.加载当前运行的class文件 2.加载import的class文件 3.进行安全校验 4.进入预执行状态(机器码) 5.执行 栈: 局部变量,基本数据类型的值直接保存在栈中,引用类型的址保存在栈中,空间小,速度快 堆: new出来的,空间大,速度有限 共享区: 放置常量值和静态变量、静态常量new关键字:使用new在堆内存中开辟的区域都会自动赋值整形自动赋0 浮点自动赋0.0 bo

10、olean自动赋false char自动赋值'u0000' 引用类型自动赋null数组中常见的运行时异常: java.lang.ArrayIndexOutOfBoundsException2.9 字符串Java的字符串在java.lang.String中Java中字符串是常量 (注意:常量:是一旦赋值后不可再改变的内存区域。在Java中使用final 来定义常量)常量的定义 规则是注意final位置,规范是常量全大写常量的赋值方式:1.声明即赋值 2.后期赋值声明字符串:1.String s1 = "abc" 2.String s1; s1 = "

11、abc" 3.String s2 = new String("abc");字符串的两种比较方式 1.= 比较栈的内容 2.equals() 比较字符串内容为了解决字符串常量产生大量临时垃圾的问题,Java提供了java.lang.StringBuffer(同步 安全 性能稍低)和java.lang.StringBuilder(不安全,性能高) .append()字符串中常见的运行时异常: java.lang.StringIndexOutOfBoundsException字符串 java.lang.String java.lang.StringBuffercharA

12、t()获取字符串对应数组位置的字符compareTo()返回正整数表示前面大,返回负数后面大,返回0一样大。注:在Java中字符串的比较是以字符的Unicode编码值Contains()判断母串中是否有子串,返回true或falseEquals()比较两个字符串内容,相同返回trueequalsIgnoreCase()忽略大小写比较,相同返回trueindexOf()在字符串中检索指定内容,找到就返回第一次出现的下标位置,若无则返回-1lastIndexOf()从后向前检索,返回第一次遇到的下标Replace(旧,新)将字符串中指定内容进行替换Split(分隔字符串)将字符串按照指定字符串分割

13、成字符串数组Substring()从母串提取子串第一个参数起始下标,第二参数结束下标(不包含)startsWith()判断字符串是否以指定字符开始toCharArray()将字符串转换成字符数组toLowerCase()将字符串内字母转换成小写toUpperCase()将字符串内字母转换成大写trim()去前后的空格valueOf()将基本数据类型转化成字符串类型length()获取字符串的长度replaceAll()使用正则表达式进行替换Format()%参数位置$4S|d|t S(String) d(int double) t(Calendar) eg:%1$4ty|m|d|h|M|S数学

14、类 java.lang.MathMath.PI系统提供的double类此PIAbs()求绝对值Floor()取比他小的数里最大的整数Ceil()取比他大的数里最小的整数Max(值1, 值2)取两个数里最大的Min(值1, 值2)取两个数里最小的Pow(2, 3)取幂次方round()取四舍五入值random()获取>=0.0 到 < 1.0的随机数 可以配合ceil()获取指定范围的数值日期类 (常见的非运行时异常java.text.ParseException) Java.util.DateDate now = new Date(); now = new Date(长整形); 等

15、效setTime(长整型)Java.util.CalendarCalendar c = Calendar.getInstance(); c.set(year,month-1,day) c.get(常量)Java.text. SimpleDateFormat1.将日期转换成自定义的字符串格式 转换器.format("规则字符串") 返回String2.将自定义字符串转换成日期 转换器.parse("字符串") 返回Date注:先创建转换规则,元字符 y M d H m s SJava.util.TimeZoneTimeZone tz = TimeZone.

16、getTimeZone("地区字符串");1.Calendar c = Calendar.getInstance(tz);2.c.setTimeZone(tz); 注:先设置时区,再设置时间 c.setTime(date类型);正则表达式java.util.regex. Matcher 不能使用import java.util.* Java不会引入子文件夹里的类java.util.regex.Pattern正则表达式功能:1.匹配 2.查找(替换) 正则表达式有旗识位 全局 (g) 忽略大小写 (i) 多行 (m) Java中正则的使用方式1.Pattern p = Ppi

17、le("正则表达式字符串"); Matcher m = p.matcher("用户字符串"); boolean b = m.matches(); 2.使用String直接支持正则表达式方法(此方法无需引入正则文件夹) eg: boolean b = "用户字符串". matches("正则表达式字符串")查找 /用户字符串 String s = ""/查找Pattern p = Ppile("java", Pattern.CASE_INSENSITIVE); /正则规则Mat

18、cher m = p.matcher(s); /获取匹配器/查找所有匹配出来组while(m.find() String str = m.group();System.out.println(str);替换 /用户字符串 String s = ""String str = s.replaceAll("(j|J)ava", "JavaScript");System.out.println(str);u4E00-u9FA5:匹配任一中文字符w+w+(.(com|org|net|cn)+ 邮箱地址(0-9|1-90-9|10-90-9|20

19、-40-9|250-5)(.(0-9|1-90-9|10-90-9|20-40-9|250-5)3$ IP地址2.10方法的定义和使用方法:是一系列的语句,这些语句至少完成一个特定的功能。方法作用:使代码复用。方法的定义: 修饰符 返回类型 方法名称(参数类型 参数名,.) 方法在类里面声明,而不是在方法中。方法的调用:在同一个类中,直接调用void:该返回类型要求无值返回接收方法返回结果: 返回类型 结果 = 方法(参数类型 参数名,.);方法名和变量名使用驼峰命名法: xxxYyyZzz方法参数如果是(基本数据类型或者是String)方法内的改变不会影响外面的变量,但是如果是其他引用类型,

20、方法内的改变会将影响外面的变量2.11 方法的重载(overload) 重载的作用:方便用户调用如何形成重载:方法名相同,参数列表不同参数个数|参数类型不同|参数顺序(重载条件) 注:返回类型不同,不作为重载的条件2.12递归方法2.13数组操作类 Java.util.Arrays1.升序排序 Arrays.sort(数组);2.二分查找 Arrays.binarySearch(数组, 查找值); 注:二分查找前,需对数组进行排序3.填充内容 Arrays.fill(数组, 填充值);2.14 Eclipse工具的使用快速删除行 ctrl + D快速复制行 ctrl + alt + 方向键快速

21、移动行 alt + 方向键快速单行注释切换 ctrl + /快速多行注释 ctrl + shift + /快速多行去注释 ctrl + shift + */快速运行程序 ctrl + f11*/f5进入深层运行 f6跳过方法运行 f7跳过方法后续,返回调用处 f8跳过后续正常运行三 面向对象3.1 封装(把现实中的事物,用数据类型的方式进行描述,描述是两种状态(静态(字段)和动态(方法)))类:类型 采集相同特性信息则可以分为一类,客观不存在字段:field(属性) 对象:一个类的特例(实例),客观存在的,万物皆对象。使用类就是创建对象的过程构造方法:与类名称相同的方法构造方法特点:1.该方法

22、没有返回 2.构造方法是自动调用,不能手动调用3.构造方法会为字段赋初值4.任何一个普通类都至少有一个构造方法构造方法的重载:一旦我们创建一个有参构造,系统就不会提供无参构造。通过反编译命令javap 类名称 观察成员变量和局部变量成员变量:直接放在类中的字符,成员的变量在整个类都有效,使用m_作为前缀this变量:保存的是对象自身的地址,可以使用this.成员可以使用this(参数)调用带参数的构造方法,但是必须是第一句。包:在Java中包就是组织类的方式,相同与文件目录,目的是保证项目之间的类名不冲突。使用javac -d . Test.java 可以编译时自动打包包名规范:package

23、 com.公司名称.项目名称.项目组名称.项目成员名称.模块名称;注:包名全小写,只有字母数字执行带包的字节码的命令: java ject1.team1.howie.studentmrg.Test访问修饰符: public private default protected(什么都不写)public 所有类(跨包)都可以访问default 同包可以访问private 同一类可以访问protected 有继承关系则可以访问,跨包也可第三个运行时异常:java.lang.NullPointerException3.2 继承产生的原因:解决过度封装,抽取共性,统一管理。

24、3.2.1 static 静态变量(类变量)特点:1.属于类的共享数据 2.代码加载时,在共享区创建 3.形成静态代码块4.创建的顺序快于创建对象,且只有一次 5.静态的方法只能访问静态变量,成员方法即可以访问成员变量也可以访问静态变量静态方法(类方法)作用:无需堆空间,就可以进行方法的调用,而且由于只有一份更加节省内存。静态常量:节省内存,方便调用,产生的时间靠前 3.2.2 extends Java继承特点:1.Java只允许单继承 2.Java类有且仅有一个父类(Object是根类) 3.Java里的父类也称为(超类|基类) 4.为了方便继承链完整,往往在父类明确编写无参构造。 3.2.

25、3 super1.Java中使用super明确引用父类(直接)的成员2.可以使用super()调用父类的构造方法,该调用语句只能在子类构造方法中使用,而且必须是第一句。 3.2.4里氏替换原则 子类自动向父类转型,但是会丢失子类特性。 父类强制向子类转型,重新获取子类特性。 父类 = new A子类; B子类 = (B)父类; 由于无法还原:java.lang.ClassCastException 3.2.5 instanceof使用insanceof 判断里氏替换是否能够成功 3.2.6 重写 重写或覆盖(override)是在继承关系中,强化或着重写父类功能,重写方法要与父类中的方法声明完

26、全相同(访问修饰符可以不同,更加的公开,父类中不能是私有)3.3多态产生的原因:继承父子类型转换不方便,多态可以完成自动转型多态:按照实例的具体类型,做对应的操作。(一定要有继承,一定要有重写 Java默认实现的虚函数)3.3.1抽象类 (1.强制要求多态的实现 2.避免用户创建桥接类 3.节省内存)where(设计父类)1.是使用abstract关键字修饰的类2.抽象类不能实例化(不能new)3.方法可以用abstract修饰,成为抽象方法,抽象方法没有实现语句4.有抽象方法的类,一定是抽象类,但是抽象类中可以没有抽象方法。5.抽象方法需要被子类实现,此时子类无需成为抽象类,但是如果子类没有

27、实现父类的抽象方法,子类一定是抽象类。6.抽象类一定不能是终结类。7.抽象类有构造方法,而且可以对构造方法重载。3.3.2接口(1.支持多实现,灵活 2.不占父类的名额 3.模拟枚举 4.制定标准(类标识) where(设计父接口)1.使用interface关键字定义接口, 接口里面没有任何实现方法,接口不能实例化(不能new)2.一个类可以实现多个接口3.类实现接口的关键字implements ,实现接口册需要实现接口中的所有方法,否则实现类成为抽象类。4.接口中的方法必须是public5.接口中的成员变量必须是public static final修饰的常量6.接口可以继承接口,接口可以多

28、继承7.接口使用Pascal命名法,常常加able为后缀,表示类具备某种能力。四.面向对象高级4.1.容器(集合):容纳多个对象。4.1.1装单个对象<<java.util.Collection>>(接口)<<java.util.List>>(接口)1.有序 2.可重复 3.内存连续 特点:查询快,修改慢 java.util.ArrayList 注:需要重写Object中equals()定义比较规则,完成部分操作常用方法Add(Object)追加对象元素Add(int, Object)在指定位置添加元素addAll(Collection)追加集合

29、对象addAll(int, Collection)在指定位置添加集合对象Remove(int)删除指定位置的对象Remove(Object)删除对象(需要按自己的比较规则重写equals()removeRange(int,int)删除指定下标范围的对象,结束下标不包含Clear()删除所有元素对象Contains(object)查看是否包含该对象Size()获取集合对象个数toArray()将集合转换成对象数组toArray(泛型)Student objs = new Studentlist.size();list.toArray(objs);Get(int)按下标位置获取对象indexOf(

30、object)获取对象下标第一次出现位置Set(int, Object)替换指定位置对象java.util.LinkedList 栈(FILO) 队列(FIFO)常用方法addFirst(Object)添加到头部addLast(Object)添加到尾部getFirst()获取头部getLast()获取尾部removeFirst()移除头部removeLast()移除尾部Get(int)按下标位置获取对象 沙箱 在Java1.5后提供的基本数据类型与引用类型的转换机制int i = 10; Object obj = i; /自动装箱 基本数据->封装类->Object

31、double j = (double)obj; /手动拆箱 Object->封装类->基本数据类型 Vector类和Hashtable类Vector(同步 安全 性能较低 追加一倍)ArrayList(不同步 不安全 高效 追加一半)Hashtable(同步)<<java.util.Set>>(接口)1.无序 2.不可重复(一个null) 3.内存不连续 特点:查询慢, 修改快哈希算法:产生一个尽量做到散列分布的地址系数java.util.HashSet java.util.TreeSet(排序)由于使用了哈希算法,内存存在哈希表,找寻对象先找

32、哈希表(hashcode(),再找对象4.1.2装键值KeyValue对象 <<java.util.Map>>常用方法containsKey(Object key)判断是否有指定键containsValue(Object value)判断是否有指定值entrySet()获取键值对象集合Set(Map.Entry)get(Object key)按键获取值keySet()获取所有键的集合put(K , V )在集合中添加键值对象putAll(Map)在集合中添加子集合values()获取所有值的集合java.util.Has

33、hMap(异步,性能较好)java.util.Hashtable(同步,性能较差,使用较老API进行迭代)4.1.3泛型 在编译期就对数据类型进行严格检查,如果类型不匹配,编译无法通过。自定义泛型:1.精确指定 2.模糊指定(? 匹配任意类型 ? extends T 匹配自己及子类类型 ? super T 匹配自己及父类类型)4.1.3 比较器 java.util. Comparable 其中只有一个需要实现的方法int compareTo(T o) 使用步骤:1.编写元素对象类 2.元素类实现Comparable接口,在compareTo方法中实现比较规则 3.使用List的

34、实现集合添加多个元素对象 4.使用Collections.sort()方法对集合元素进行排序 实现Comparable接口局限性:对于一套集合只能配一套排序算法,多于多套排序规则无能为力。此时可以考虑使用java.util.Comparator接口实现,在该接口中有一个核心方法int compare(T o1, T o2)需要实现。使用步骤:1.编写比较器类,实现Comparator接口。 2.使用Collections(集合, 你自己的比较器对象);注:第二种方式,适合不修改元素类源码,即可实现多种排序规则。 对于Set和Map使用TreeSet和TreeMap进

35、行排序,集合元素需要实现Comparable接口,如果实现多套排序规则,可以使用构造方法绑定比较器对象完成。4.2.异常与单元测试4.2.1 异常异常:在代码运行时发生的错误。4.2.2 异常分类java.lang. Throwable1. java.lang.Error 严重错误:1编译 2.用户不可干预的特殊异常2. java.lang.Exception 运行后发生不太严重的错误(程序员应该尽量避免)2.1 非运行时异常:必须由程序员进行捕获处理,否则需要向上抛出。2.2 运行时异常:1.无需抛出 2.JVM默认处理方式(java.lang.RuntimeException)注:1.Ar

36、raysIndexOutOfBoundsExceptiion 2.StringIndexOutOfBoundsException3.NullPointerException4.ArithmeticException5.ClassCastException6. SystemException4.2.3 异常的处理在Java中异常处理:需要try catch finally throw throws 关键字异常处理语法:try catch(异常类型 参数) catch(异常类型 参数) | finally 异常处理机制:try块中一旦出现异常,检查catch部分异常类型,如果有对应类型便交由对应c

37、atch块处理(异常顺序应由子向父排放),如有资源释放可以放在finally语句块中。(该语句块无论如何都会执行,甚至是return前)异常处理的原则:1.判断可能出现错误的代码 2.进行精确捕获 3.如有必要分段捕获为什么不使用异常父类接受所有异常:1.捕获非运行异常,可能需要具体异常类对象的特殊方法2.对不同异常,进行合适的处理throw:手动抛出异常对象 throw new Exception(String);throws:声明该方法有可能产生的异常,目的告诉调用者有这些异常需要处理。(运行时异常可以不处理)注:对于运行时异常,如果强制调用者,提升运行时异常为非运行时异常。4.2.4 异

38、常的继承关系如果出现继承或者实现这样的关系,要求子类(实现类)不能抛出更多的异常。要求子类不能抛出更多的异常,设计初衷是什么?如果只希望该方法完成字符串转换,不希望有其他功能模块,可以此种技术,除非用户自行处理其他模块的异常。4.2.5 异常的逐级处理异常使用技巧:将当前无法解决的问题交由调用者去解决,如果采用的非运行时异常进行通知,即变成强制要求用户处理,或者继续抛出。(错误日志,给前台用户转递提示信息)4.2.6 单元测试框架 使用规范:1.测试用列类在单独的test包中 2.XxxTest 给测试类命名 3.test方法名 给测试方法命名JUnit(4.0支持注解 注解:给编译器看的注释

39、,为类或方法添加额外标识。)BeforeClass 方法在类加载时执行 AfterClass 方法在类释放时执行Before 方法在测试方法前执行After 方法在测试方法后执行Test 方法为测试方法Ignore 说明该测试方法暂时停止测试Assert(测试时使用的断言类)4.3. GUI图形用户界面(Graphical User Interface)AWT抽象窗口工具集(Abstract Window Toolkit) java.awt.* => javax.swing.*(纯Java代码)组件(java.awt.Component) -> 容器(java.awt.Contai

40、ner) -> 窗口(java.awt.Window) -> 窗体(javax.swing.JFrame)1.创建组件对象2.将组件添加到容器中3.为组件添加事件处理内部类4.3.1 JFrame4.3.2 JButton4.3.3 JTextField4.3.4 JPassword4.3.5 JCombBox4.3.6 JCheckBox4.3.7 JTable4.3.8 LayoutManager4.4. IO流 java.io包中4.4.1 IO流概念 (1.文件系统 2.数据流 3.序列化)IO(Input Output stream) 水流:1.连续性 2.方向性 3.源

41、头尽头以程序端参考数据的流向,程序获取数据(Input),程序向外输出数据(Output);作用:将内存数据输出到外部文件或网络,还可以获取外部文件和网络中的数据。重要作用做数据持久化。4.4.2 文件系统文件:File常用方法:File.separator获取对应系统的文件分隔符canRead()是否可读canWrite()是否可写createNewFile()创建指定文件名的空文件delete()删除文件exists()判断文件是否存在getAbsolutePath() getAbsoluteFile()获取文件的完整物理路径getName()获取文件名称 getParent() getP

42、arentFile()获取父目录的名称isDirectory()判断文件是否是目录length()获取文件的长度list() listFiles()获取指定目录下文件列表mkdirs()构造完整目录结构(包括父目录)4.4.3 数据流 字节流:数据类型是二进制100011100,传递非文本文件(视频、音频、压缩文件)java.io.InputStream和java.io.OutputStream是字节流的父类字节流的功能AudioInputStream 获取音频流(*.mid *.wav)ByteArrayInputStream 内存交互流ObjectInputStream 对象

43、序列化PipedInputStream 管道流(进程或者线程之间传递数据)SequenceInputStream 顺序流(将两个数据流前后连接形成新的数据流).1 文件字节流 java.io.FileInputStream FileOutputStreamFileInputStream常见方法available()一次性能读的文件长度close()关闭流,释放系统资源read()一次只读一个字节,如果到文件结尾,返回-1read(byte b)一次读取多个字节,并装入字节数组,同时返回读取的真实个数read(byte,int int)一次读取多个字节,按指定范围装入sk

44、ip(long n)判断文件是否存在.2 顺序流作用:将多个流组合成一个完整的流SequenceInputStream sis = new SequenceInputStream(fis1, fis2);.3 音频流/AudioInputStream 音频流/AudioFormat 音频格式 mid wav mp3/SourceDataLine 数据源行/AudioSystem 音频提取File file = new File("C:UsersAdministratorDesktop黄子韬 - 十九岁.mp3");/音频提取器提取音频流

45、AudioInputStream ais = AudioSystem.getAudioInputStream(file);/获取原始音频的格式AudioFormat oldFormat = ais.getFormat();/对音频编码AudioFormat targetFormat = new AudioFormat(Encoding.PCM_SIGNED, oldFormat.getSampleRate(), 16, oldFormat.getChannels(), oldFormat.getChannels()*2, oldFormat.getSampleRate(), false);/产

46、生编码后的输入流AudioInputStream ais2 = AudioSystem.getAudioInputStream(targetFormat, ais);/对音频行提取DataLine.Info info = new DataLine.Info(SourceDataLine.class, targetFormat);/创建音频行的对象SourceDataLine sdl = (SourceDataLine)AudioSystem.getLine(info);/打开音频行sdl.open(targetFormat);/开始音频行读取sdl.start();byte buf = new

47、 byte1024;int len = 0;while(len=ais2.read(buf) != -1) sdl.write(buf, 0, len);/声卡调用结束sdl.stop();/音频行关闭sdl.close();/音频流关闭ais2.close();ais.close();4.4.4 字符流针对于非英语系的国家和地区,提供了一套方便读写方式。java.io.Reader和java.io.Writer文件字符流java.io.FileReader和java.io.FileWriter4.4.5 转换流作用:字符流的本质就是字节流,所有字符流提供一种将自己转化成字节流的

48、形式,或者字节流包装成字符流。java.io.InputStreamReader和java.io.OutputStreamWriter (字节流=>字符流)4.4.6 节点流和包装流(Java采用装修(装饰)模式)节点流:数据流的源头(字节流 FileInputStream等 字符流:FileReader)包装流:将节点流或其他的包装流,按自己功能特点进行扩充,使数据流增加了对应的功能。字节包装流1. java.io.BufferedInputStream和java.io.BufferedOutputStream:使文件流带缓冲功能,提高性能2. java.io.DataI

49、nputStream:对于基本数据类型进行了封装,读写基本数据类型3. java.io.PrintStream:1.换行跨平台2.打印任意类型3.与System.out是同一类型4.java.io.ObjectInputStream字符包装流1. java.io.BufferedReader 和java.io.BufferedWriter 1.提高字符流读写性能 2.读取整行4.4.7 对象序列化和反序列化对象序列化:对引用类型的数据进行持久化(读写)。java.io. ObjectInputStream和java.io. ObjectOutputStream完成对

50、象的序列化步骤:序列化的类要实现Serializable接口,同时该类中所有成员都需要实现该接口。扩展:序列化的内容 1.对象的属性 2.对象的类型 3.对象类的版本信息 (方法不序列化) 反序列化的条件1.比较类型是否一致 2.序列化的版本要与当前的类的版本一致。结论:应该对需要序列化的类,添加版本信息,方便后期代码的扩展和维护。注意:保证序列化的对象的所有属性都是可序列化的。父类序列化后,子类自动继承了父类序列化的能力,但是依然建议添加序列化版本信息。 关键字transient作用:灵活的控制对象中哪些属性的值不参与序列化。注意:就算使用transient修饰的成员也依然需要

51、实现Serializable接口。 Externalizable第二种实现序列化的方式:轻量级的实现。无需修改源码,序列化容量小,速度快,但是没有版本约束,安全性差。4.5.多线程(并发)4.5.1 多线程概念 进程:程序运行时所征用的系统资源。 线程:是一种轻量级的进程,在进程的内部进行并发执行。注:Java的多线程依赖于操作系统是否支持。4.5.2 多线程的实现方式:本质上只用一种1.继承java.lang.Thread类实现步骤1.编写Thread子类 2.重写run()方法 3.实例化线程类 4.调用start()方法2.实现java.lang.Runnable3.实现java.util.Timer 配合 java.util.TimerTask,使用schedule4.实现线程池 jdk1.5后ExecutorService Executors FutureTask<Runnable|Callable>4.5.3 多线程常见方

温馨提示

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

评论

0/150

提交评论