1、JAVA复习,丁鑫哲,JAVA复习,第6章 java语言中的面向对象特性 第7章 数组和向量 第8章 字符串处理 第10章 异常处理 第11章 输入输出处理 第13章 线程 第1415章 图形界面 习题、模拟题,第6章 java语言中的面向对象特性,类 对象 包 封装性 抽象类 接口,类,类声明 实例变量类的实现 成员变量类变量(static)类体方法声明成员方法方法体,类的声明:一个文件中可以定义多个类,其中最多只能有一个public类(可以没有),文件名必须和public类的类名相同。成员变量修饰符: 修饰符: static:静态变量,否则为实例变量 final:常量 transient:
2、暂时性变量(序列化) volatile:共享变量(线程),一.final总结 1.final修饰类:表示该类不可继承;final不能修饰interface接口; 2.final修饰方法:表示该方法不能被子类覆盖(即子类不能重写父类的final方法,可以继承);final不能修饰构造函数; 3.final修饰字段属性:表示属性值第一次初始化后不能被修改;final属性可以直接初始化或在构造函数中初始化;如果属性是直接初始化,则其值不能被其它函数(包括构造函数)修改;,4.final修饰函数参数参数值不能被函数修改; 5.final修饰函数中的局部变量局部变量被第一次初始化后不能被修改public
3、 void hello() final String name;name = “hi“; /okname = “hello“; /error,二.static总结 1.static修饰成员函数:该成员函数不能使用this对象static不能修饰构造函数static不能修饰函数参数static不能修饰局部成员变量 2.static修饰成员变量当类被虚拟机加载时,首先按照字段声明的先后顺序对static成员字段进行初始化,3.static修饰语句块static所修饰的方法和字段是只属于类,所有对象共享。在static所修饰的函数和语句块中不能使用非static成员字段。在Java不能直接定义全局变
4、量,是通过static来实现的在Java中没有const,不能直接定义常量,通过static final来实现,Static修饰的变量,Static修饰的变量是类变量 对该类所声明的所有实例对象共享同一个类变量 类变量可以通过类名直接访问,也可以通过实例对象来访问 一个类的main()方法必须用static来修饰,因为系统在开始执行一个java程序前并未生成类的一个实例,只能通过类名来调用main()方法作为程序入口 例:见Test.java,成员方法(函数) 方法重载(Method Overloading):同一个类的多个方法使用相同的名字,但它们的参数形式(个数、类型)不同。 例: cla
5、ss MethodOverloading void receive(int i)System.out.println(“received int data:” + i);void receive(String s)System.out.println(“received string data:” + s);void receive(int x, int y)System.out.println(“received two int datas:” + i + ” “ + j); ,class MethodOverloadingTest public static void main(Strin
6、g args )MethodOverloading mo=new MethodOverloading();mo.receive(1);mo.receive(“1”);mo.receive(1,2); 结果(编译、执行): received int data:1 received string data:1 received two int datas:1 2,注意,只有方法能对成员变量进行操作,成员变量在定义的同时可以赋初值;实例方法可以操作实例成员和类成员,而类方法只能操作类成员;一个类中的方法可以相互调用。重写后的方法不能有更严格的访问权限,不能产生更多的异常;,对象,对象:将某一个类通过
7、new运算符实例化后产生。 对象之间通过方法调用(即消息传递)产生特殊的行为,或直接修改成员变量值(不提倡使用),最终完成复杂的任务。 对象的生成:包含三方面的内容:声明、实例化、初始化格式:type objectName=new type(参数列表); 即:类名 对象名=new 构造方法(参数列表); String s=new String();,注意,对象是引用型变量(类似指针) 实例变量和类变量区别: 同一个类的不同对象对实例变量分配不同的空间,而对类变量分配同一个内存空间,即:对象共享类变量。 实例成员和类成员的调用区别: 类成员不仅可以由对象调用,而且可以直接由类名调用。 见Test
8、.java,包,包:放置多个字节代码文件的文件夹路径名。它是用于管理类名的特殊手段。,package语句,用package语句定义类所在的包。格式为:package pkg1.pkg2.pkg3; 注意: 如果用package语句,它必须是源程序中的第一条语句; 含有package语句的源程序中所有的类都属于该包; 不能指定到文件上,如”package p1.SameName”只能说明后续的类是p1.SameName包中的类; 编译包含该语句的Java程序后,需要将编译生成的所有的class文件拷贝到当前目录下的pkg1pkg2pkg3目录内,否则不能正确访问这些类; 包名与源程序的编译没有任
9、何关系,只在运行类和实例化类时起作用。,引入包之后,代码第一行加入package,且只能有一句 执行时执行 包名.类名 该*.java文件中的多个类都属于该包 编译后字节码存放位置Javac d空格 . Point.java,Import语句,import语句用于引入需要的包。一般格式为:import pkg1.pkg2.pkg3.classname|*; 其中:*表示同一个包中的所有类; 可以一次只引入包中的一个类。 如果不用import语句,需要在使用类的地方书写完整的包名,所以一般不采用这种方法。 见实验4 CylinderTest.java,封装性,优点:模块化、信息隐藏、可移植化、访
10、问控制,程序和数据不被外界干扰且不被误用。 有三种修饰符实现访问权限限制:public、private和protected。 public:公有权限,可以被程序中的任何代码访问; private:私有权限,只能被类中的其他成员访问,同一包内的其他类也不能访问。这种修饰符对封装性至关重要; protected:保护权限,用于类继承场合的访问控制,介于public和private之间,任何包内所有类以及包外子类可以访问; 默认(没有修饰符,也称为友好权限):和public类似,在包内可以存取(public),但在包以外不能存取。,继承性,继承:一个类获取另一个类的所有变量和方法的过程。在继承的基础
11、上新类可以保留原有代码或更新原有代码,因此继承是代码复用的主要实现机制。 extends语句:实现继承,如: class SubClass extends SuperClass 如果没有继承任何类,Java默认其父类为java.lang.Object。Java不支持多重继承。,子类可以继承父类的除了private以外的所有成员变量和方法,即public,protected,default 例如: class SuperClassstatic int i=0; class SubClass extends SuperClasspublic static void main(String args
12、)System.out.println(i); 如果定义了同类型同名称成员变量,那么它们隐藏父类的同名成员变量,即成员变量的隐藏; 如果定义了同名、同返回类型、同参数的成员方法,那么它们隐藏父类的同名方法,即方法重写。,继承性,思考问题:既然子类可以从父类继承非私有的成员,那么当创建子类对象时,所继承的父类成员是如何初始化的?super:代表当前类的父类对象,常见三种用法:super(参数列表) ,代表调用父类的构造方法.super.父类成员变量super.父类成员方法,注意,子类构造函数的第一行位置会首先自动调用父类无参的构造方法 若子类想调用父类带参构造方法,则用 super(参数);见i
13、nheritance.java,多态性,多态性:由于方法重载和覆盖引起的方法同名不同功能现象。 分类:静态多态性和动态多态性 静态(编译时)多态性:方法重载,如println方法 动态(运行时)多态性:多个子类继承同一个父类,并各自重写父类的方法,那么运行时可以完成不同的功能。,方法重写原则 重写后的方法不能有更严格的访问权限; 重写后的方法不能产生更多的异常,避免出现应该捕获而未捕获的异常。 对象类型的确定:由于多个子类都可以作为父类对象使用,所以判断实例对象到底属于哪个子类可以用instanceof操作符来进行。 如:static void testInstance(Shape aObje
14、ct)if (aObject instanceof ShapeCircle)System.out.println(“A Circle“);if (aObject instanceof ShapeTringle)System.out.println(“A Tringle“);,其他特性 1、final关键字 final变量:常量 final方法:不能被重写 final类:不能被继承,如String类 2、static关键字:类成员 实例变量和类变量(带static关键字):内存分配不同 实例方法和类方法(带static关键字): 类方法不能访问实例变量,实例方法可以访问任何变量 类变量值相同,实
15、例变量值不相同 实例方法必须由实例对象调用,类方法可以被实例对象调用以外,还可以由类名直接调用,如main()方法 类方法中不能使用this或super,3、java.lang.Object类:所有类的根,它定义了一些最基本的对象属性和行为。 toString():返回对象的字符串表示 equals():判断两个对象是否相等 JDK源代码: public boolean equals(Object obj) return (this = obj); 注意:对简单数据类型进行封装的Boolean、Byte、Char、Short、Integer、Long、Float、Double以及String,
16、Date,File类把equals方法重写为判断 值 是否相等。,4、abstract关键字:1)抽象类不能创建对象,必须派生出子类,由子类创建对象;2)抽象方法只允许声明,不允许实现,即没有方法体;3)抽象类的子类必须重写父类中所有的抽象方法;4)抽象类中可以没有抽象方法,但抽象方法必须放到抽象类中.,接口,定义:方法定义和常量值的集合 接口的定义 interfaceDeclaration interface Body 1)接口声明 简单的接口声明:interface interfaceName完整的接口声明:public interface interfaceName extends li
17、stOfSuperInterface ,2)接口体 常量定义 接口体方法定义:只进行方法的声明;()常量定义的格式:type NAME=value;()方法定义的格式: return Type methodName(paramlist);(3)方法具有public和abstract属性接口中只进行方法的声明,而不提供方法的实现,例:interface Collection int MAX_NUM=100;void add(int x, int y);void delete(Object obj);Object find(Object obj);int currentCount();,int前面
18、自动添加final,Void后面自动添加public abstract,接口的实现: 在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现(重写)接口中定义的所有抽象方法若使用多个接口,用逗号隔开接口名。 例:在类FIFOQueue中实现上面所定义的接口Collection: class FIFOQueue implements Collection public void add(int x, int y )public void delete(Object obj)public Object find(Object obj)retu
19、rnpublic int currentCountreturn 重写接口函数,访问权限是public,class InterfaceType public static void main(String args)Collection c=new FIFPQueue();c.add(obj); 接口的回调,只能调用接口中与类中共有的函数 类似于上转型对象 接口实例:见实验4 Computable.java,总结,1. 类的定义 2. 对象的创建及使用 3. 包的定义及使用 4. Java的面向对象特性(封装、继承、多态) 5. 接口的定义及使用 6.其他特性 特殊方法:方法重载、方法重写、构造
20、方法; 特殊类:java.lang.Object 特殊包:java.lang 无名包,关键字,本章所学重点关键字:class interfacethis superpublic private protected static final abstract import packageextends implements,第7章 数组和向量,一维数组 多维数组 向量,一维数组,声明: type arrayName ; (或type arrayName;) 1、type 可为JAVA中的任意的数据类型(简单类 型,复合类型) 2、arrayName为一个合法的标识符,即数组名 3、 指明该变量是
21、一个数组类型变量eg : float boy;,一维数组的初始化: 静态初始化 type arrayName = element,element2. . . 例:int INTaRRAY=1,2,3,4 动态初始化 -简单类型的数组arrayName=new typearraySize; -复合类型的数组 (1)arrayName=new typearraySize; (2)arrayName0=new type(paramList);,引用方式: 引用数组元素 arrayNameindexindex 为数组下标,从0开始在JAVA中对数组元素进行越界检查以保证安全 引用整个数组 直接使用数组
22、名字,如: int array=4,3,2,1; sort(array); length属性指明数组的长度,如:intArray.length,多维数组,定义:type arrayName (type arrayName) 初始化 -静态 int intArray=1,2,2,3,3,4; -动态 arrayName=new typearrayLength1arrayLength2; 从最高维开始,分别为每一维分配空间; 引用 arrayNameindex1index2,拷贝数组:System.arraycopy()方法如:int a =1,2,3,4,5,6;int b = 10,9,8,7
23、,6,5,4,3,2,1System.arraycopy( a, 0, b, 0, a.length);,向量,长度可变化的数组,更灵活。 java.util.Vector类 向量的元素类型为Object,使用时需类型转换。 无下标,通过类中方法定位元素。 setElementAt()修改指定位置的对象。 elementAt() 得到指定位置的对象 addElement() 添加对象置末尾(以索引位置0 1 2顺序添加) size() 得到向量中的元素个数 Vector v=new Vector(30); 详见例7.5 p83 见实验5,第8章 字符串处理,字符串的表示 访问字符串 修改字符串
24、 其他操作,字符串常量,字符串常量是用双引号括住的一串字符,比如“Hello!World!” Java编译器自动为每一个字符串常量生成一个String类的实例. 可以直接用字符串常量初始化一个String对象; 如:String s=new String(“we are students”);等价于:s=“we are students”;java对同一个常量指向同一个空间例:String s1=“hello”,s2=“hello”;s1=s2; 字符串常量可以调用类String中提供的方法 如:int len=“hello world!”.length();,用String表示字符串 缺省的
25、构造方法不需要任何参数,它生成一个空串, 如:String s=new String( ); 从字符数组或字节数组生成字符串的构造方法包括: String(char chars ) String(char chars , int startIndex,int numChars) String(byte ascii ,int hiByte) String(byte ascii ,int hiByte, int startIndex, int numChars) 其中,chars 、ascii 为用来生成字符串的数组,startIndex和numChars指明字符串在数组中的起始索引以及它所包含的
26、字符数,访问字符串、修改字符串、其他操作,访问的函数: length()、charAt()、indexOf()、lastIndexOf()、getChars()、getBytes() 修改字符串函数: Concat();replace();substring();toLowerCase();toUpperCase(); 其他操作: equals();regionMatches();,字符串转换,字符串-数值 int x=Inter.parseInt(“123”); long x=Long.parseLong(“123”); float x=Float.parseFloat(“123”); do
27、uble x=Double.parseDouble(“123”); 或者double x=Double.valueOf(“123”).doubleValue();,字符串转换,数值-字符串 String s=String.valueOf(123);java.lang.Object中提供了方法toString( )把对象转化为字符串。,Java 对运算符“”进行了重载 注意:除了对运算符“”进行了重载外,Java不支持其他运算符的重载,这是因为考虑到滥用运算符的重载会大大降低程序的可读性。,类StringBuffer类StringBuffer 表示可变字符串,可在其中插入或在末尾添加字符。如果超
28、出已分配的缓冲区,系统会自动地为它分配额外空间。,1、append( ) public synchronized StringBuffer append( String str); 用途:在已有字符串末尾添加 一个字符串str。 2、insert( )public syncronized StringBuffer insert( int offset, String str);用途:在字符串的索引offset位置处插入字符串str. 3 、setCharAt( )public synchronized void setCharAt (int index, char ch); 用途:设置指定索引
29、index位置的字符值。,注意,String 和StringBuffer的区别:二者对字符串的连接效果是不同的。 String 中对字符串的连接操作是对新生成的一个字符串拷贝进行的,操作结果不影响源串;StringBuffer中是对源串本身进行的,操作后源串的值发生了变化,变成连接后的串。见MusicTest.java,第10章 异常处理,异常的定义及其处理机制 异常类的类层次 异常的处理 声明抛弃异常 抛弃异常 异常类的使用,异常的定义及其处理机制,一、异常的定义:异常是在程序的运行过程中所发生的异常事件,它中断指令的正常执行。 二、异常处理机制 抛弃异常在Java程序的执行过程中,如果出现
30、了异常事件,则生成一个异常对象。它将传递给Java 运行时系统,这一异常的产生和提交过程称为抛弃异常。 捕获异常:当Java运行系统得到一个异常对象时,它将会寻找处理这一异常的代码。找到处理该异常的方法,运行时系统把当前异常对象交给该方法进行处理。这一过程称为捕获异常。,异常类的类层次,Java中的异常事件分为两大类。 一类继承于类Error,包括动态连接失败、虚拟机错误等。通常Java 程序不应该捕获也不会抛弃这种异常。另一类继承于Exception,这是Java程序中所大量处理的异常。,异常类的类层次,见课本p133,异常的处理,一、捕获异常: 通过try-catch-finally语句实
31、现 语法: try catch(ExceptionName1 e) catch(ExceptionName2 e) catch(ExceptionName3 e) finally注:子类异常放在前面,父类异常放在后面,1、try 用try选定捕获异常的范围,由try所限定的代码块中的语句在执行过程中可能会生成生成异常对象并抛弃。 2、catch 用于处理try代码块中所生成的异常事件。 catch语句参数类型指明它能够捕获的异常类型。 3、finally finally语句为异常处理提供一个统一的出口,对程序的状态作统一的管理。 不论在try代码块中是否发生了异常事件,finally代码块中的
32、语句都会执行。,声明抛弃异常,声明抛弃异常是在一个方法中的throws子句中声明的。 例如: public int read ( ) throws IOExceptionthrows子句中同时可以指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛弃他们。要求它的调用者必须考虑处理这些异常。,抛弃异常,抛弃异常首先要自己来生成异常对象。 抛弃异常对象是通过throw语句实现的。 如:IOException e=new IOException( );throw e;注意:可以抛弃的异常必须是Throwable或其子类的实例。,throws与throw的区别,Throws系统自动抛出的异常
33、用法: void fun(int a) throws IOException在这个函数中,可能会产生IO异常,但是程序本身不处理,直接交给java虚拟机处理。 ,Throw是语句抛出的异常 用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。 用法: void doA(int a) throws IOException,Exception1,Exception3 trycatch(Exception1 e)throw e;catch(Exception2 e)System.out.println(“出错了!“);if(a!=b)throw n
34、ew Exception3(“自定义异常“); 见实验六Weekdays.java,异常类的使用,几点建议: 1、对于运行时异常,如果不能预测它何时发生,程序可以不做处理,而是让Java虚拟机去处理它。 2、如果程序可以预知运行时异常可能发生的地点和时间,则应在程序中处理,而不应简单地把它交给运行时系统。 3、在自定义异常类时,如果它所对应的异常事件通常总是在运行时产生的,而且不容易预测它将在何时、何处发生,则可以把它定义为运行时异常,否则应定义为非运行时异常。,第11章 输入输出处理,I/O概述 文件处理 过滤流 字符流处理 对象的串行化 其他常用流,I/O概述,Java把不同类型的输入、输
35、出源抽象为流 Java开发环境提供了java.io包 java.io包中有4个重要的abstract类: 1InputStream(字节输入流) 2Reader(字符输入流) 3OutputStream(字节输出流) 4Writer(字符输出流),1文件的属性 经常使用File类的方法获取文件本身的一些信息: public String getName() 获取文件的名字。 public boolean canRead()判断文件是否是可读的 Public boolean canWrite()判断文件是否可被写入 public boolean exits() 判断文件是否存在 public l
36、ong length() 获取文件长度(单位是字节),文件,File的构造方法有3个: File(String filename); File(String directoryPath,String filename); File(File f, String filename); 例: File f=new File(“file.txt“); File f=new File(“c:myfile“,“file.txt“); File f1=new File(f, “file1.txt“); f.createNewFile();,public String getAbsolutePath() 获
37、取文件的绝对路径。 public String getParent() 获取文件的父目录。 public boolean isFile() 判断文件是否是一个正常文件,而不是目录。 public boolean isDirectroy() 判断文件是否是一个目录。 public boolean isHidden() 判断文件是否是隐藏文件。 public long lastModified() 获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数,2目录(1)创建目录public boolean mkdir():创建一个目录,如果创建成功返回true,否则返回false。(
38、2)列出目录中的文件public String list() 用字符串形式返回目录下的全部文件,public File listFiles() 用File对象形式返回目录下的全部文件。,public String list(FilenameFilter obj) 该方法用字符串形式返回目录下的指定类型的所有文件。public File listFiles(FilenameFilter obj) 该方法用File对象返回目录下的指定类型所有文件。,3文件的创建与删除当使用File类创建一个文件对象后,例如File f=new File(“c:myletter“,“letter.txt“);如果c
39、:myletter目录中没有名字为letter.txt文件,文件 对象f调用方法:public boolean createNewFile()可以在c:myletter目录中建立一个名字为letter.txt的文 件。文件对象调用方法public boolean delete()可以删除当前文件,例如:f. delete();,字节流,InputStream类,所有字节输入流的父类。 方法简介: int read();从输入流中读取下一个字节,返回范围在0255之间的一个整数,该方法属性为abstract,必须为子类所实现。 int read(byte b); 从输入流中读取长度为b.leng
40、th的数据写入字节数组b,并返回读取的字节数。 int read(byte b,int off,int len); 从输入流中读取长度为len的数据写入字节数组b从off开始的位置,并返回读取的字节数。 对以上方法,如果达到流的末尾位置,则返回-1,int available();返回从输入流中可以读取的字节数 long skip(long n);输入流的当前读取位置向前移动n个字节,并返回实际跳过的字节数。 close();关闭流并释放于该流相关的系统资源。 void mark(in readlimit);在输入流的当前读取位置做标记.从该位置开始读取readlimit所指定的数据后,标记失
41、效 Void reset();重置输入流的读取位置为方法mark()所标记的位置 boolean markSuppont();确定输入流是否支持方法mark()和reset();,字节流,OutputStream类,所有字节输出流的父类。 方法简介: void write(int b);将指定字节b写入输出流(abstract属性,若b255,只输出低位字节) void write(byte b);把字节数组中的b.length个字节写入输出流 void write(byte b,int off,int len);把字节数组中从索引off开始的len个字节写入输出流 flush();刷空输出流
42、并输出所有被缓存的字节 close();关闭流,文件字节流,1FileInputStream类为了创建FileInputStream类的对象,可以使用下列构造方法:FileInputStream(String name)FileInputStream(File file),输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数据,read方法给程序提供一个从输入流中读取数据的基本方法。read方法的格式如下:int read();read方法从输入流中顺序读取单个字节的数据。该方法返回字节值(0255之间的一个整数),读取位置到达文件末尾,则返回-1。,read方法还有其它一些形式。
43、这些形式能使程序把多个字节读到一个字节数组中:int read(byte b );int read(byte b , int off, int len);其中,off参数指定read方法把数据存放在字节数组b中的什么地方样,len参数指定该方法将读取的最大字节数。上面所示的这两个read方法都返回实际读取的字节个数,如果它们到达输入流的末尾,则返回-1。,2FileOutputStream类为了创建FileOutputStream类的对象,可以使用下列构造方法:FileOutputStream(String name)FileOutputStream(File file)输出流通过使用writ
44、e()方法把数据写入输出流到达目的地。,write的用法如下:public void write(byte b) 写b.length个字节到输出流。public void.write(byte b,int off,int len) 从给定字节数组中起始于偏移量off处写len个字节到输出流,参数b是存放了数据的字节数组。,字符流,Java语言中提供的用于字符流处理的类都基于java.io包中的Reader和Writer类。 Reader和Writer类都是抽象类,不能生成这两个类的实例,只能通过使用由他们派生出来的子类对象来处理字符流。 Reader和Writer类用于字符流处理的接口:,文件
45、字符流,1FileReader类使用下列构造方法:FileReader(String name)FileReader (File file)FileReader 对象。,int read() 输入流调用该方法从源中读取一个字符,该方法返回一个整数(065535之间的一个整数,Unicode字符值),如果未读出字符就返回-1。int read(char b ) 输入流调用该方法从源中读取b.length个字符到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。int read(char b , int off, int len) 输入流调用该方法从源中读取len个字符并存放到
46、字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。其中,off参数指定read方法从符数组b中的什么地方存放数据,2FileWriter类使用下列构造方法:FileWriter(String name)FileWriter (File file)创建FileWriter对象。输出流通过使用write()方法把字符数据写入输出流到达目的地。,write的用法如下:public void write(char b) 写b.length个字符到输出流。public void.write(char b,int off,int len) 从给定字符数组中起始于偏移量off处写len个
47、字符到输出流,参数b是存放了数据的字符数组。void write(String str) 把字符串中的全部字符写入到输出流。void write(String str,int off,int len) 从字符串str中起始于偏移量off处写len个字符到输出流。,Java包中用于处理字符流的最基本的类是InputStreamReader和OutputStreamWriter类,用来在字节流和字符流之间作中介。 InputStreamReader类是Reader的子类。 OutputStreamWriter类是Writer的子类。 使用InputStreamReader和OutputStream
48、Writer类时,利用构造方法把以字节方式表示的流转换成特定平台上的字符表示。,两个类中的主要方法: public InputStreamReader(InputStream in)使用当前平台的缺省编码规范,基于字节流in构造一个输入字符流 Public InputStreamReader(InputStream in, String enc) throws UnsupportedEncodingException /使用指定的编码规范,基于字节流in构造一个输入字符流。若使用了非法编码规范,将产生UnsupportedEncodingExcption。,Public OutputStreamWriter(OutputStream out)使用当前平台的缺省编码规范,基于字节流out构造一个输出字符流 Public OutputStreamWriter(OutputStream out, String enc) throws UnsupportedEncodingException /使用指定的编码规范,基于字节流out构造一个输入字符流。若使用了非法编码规范,将产生UnsupportedEncodingExcption。,