《Java程序设计语言.ppt》由会员分享,可在线阅读,更多相关《Java程序设计语言.ppt(107页珍藏版)》请在三一办公上搜索。
1、Java程序设计语言,昨天重点内容回顾,线程进程多线程编程线程的同步与互斥网络编程SocketTCP/UDP,内容安排,Java的文件(读写)输入输出(本地文件读写、管道输入输出、随机文件读写、标准输入输出流等)、实例讲解等;Java 数据库编程技术(JDBC)、实例讲解等机动内容(Java Application与Applet编程实例),输入/输出处理,输入/输出处理,描述java.io包的主要特性 流,输入流,输出流 文件流的相关操作 对象的串化,输入/输出处理,流 程序对于信息的读取是个流动的过程。file,memory,a socket。,输入/输出处理,程序对于信息的处理也是个流动的
2、过程,输入/输出处理-java.io包,字节流 stream从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。字符流 reader&writer从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。,控制台I/O,System.out允许向标准输出上输出数据PrintStreamSystem.inInputStreamSystem.errPrintStream,向标准输出上写,println()方法print()方法println()和println()函数的重载boolean,cha
3、r,int,long,float,doublechar,Object,Stringprint(Object)和println(Object)自动调用toString()方法实例讲解KeyboardInput.java,文件和文件I/O,创建文件,类中的一些函数,文件流I/O,文件输入使用FileReader类来读取字符使用BufferedReader类的readLine()方法文件输出使用FileWriter类来写字符使用PrintWriter类的print()和println()方法实例ReadFile.java和WriteFile.java的讲解,基本流类,Node Streams,字节流
4、,InputStream、OutputStream(处理一系列的字节对象)FileInputStream、FileOutputStreamPipedInputStream、PipedOutputStreamByteArrayInputStream、ByteArrayOutputStreamFilterInputStream、FilterOutputStreamDataInputStream、DataOutputStreamBufferedInputStream、BufferedOutputStreamObjectInputStream、ObjectOutputStream,字符流,Reader
5、、Writer(专门处理双字节的Unicode字符)InputStreamReader、OutputStreamWriterFileReader、FileWriterCharArrayReader、CharArrayWriterPipedReader、PipedWriterFilterReader、FilterWriterBufferedReader、BufferedWriterStringReader、StringWriter,I/O流链,Processing Streams,其它,文件处理File、RandomAccessFile;接口DataInput、DataOutput、Object
6、Input、ObjectOutput;,InputStream,从流中读取数据int read();int read(byte b);int read(byte b,int off,int len);int available();long skip(long n);,InputStream,关闭流close();使用输入流中的标记void mark(int readlimit);void reset();boolean markSuppont();,InputStream类的层次结构,OutputStream,输出数据void write(int b);void write(byte b);
7、void write(byte b,int off,int len);flush()刷空输出流,并输出所有被缓存的字节。关闭流close();,OutputStream类的层次结构,文件处理,File、FileInputStream、FileOutputStream、RandomAccessFile,文件描述,类File提供了一种与机器无关的方式来描述一个文件对象的属性。文件的生成public File(String path);public File(String path,String name);public File(File dir,String name);,File myFile
8、;myFile=new File(myfile.txt);myFile=new File(MyDocs,myfile.txt);File myDir=new File(MyDocs);myFile=new File(myDir,myfile.txt);,文件描述,文件名的处理String getName();/得到一个文件的名称(不包括路径)String getPath();/得到一个文件的路径名String getAbsolutePath();/得到一个文件的绝对路径名String getParent();/得到一个文件的上一级目录名String renameTo(File newName)
9、;/将当前文件名更名为给定文件的完整路径,文件描述,文件属性测试boolean exists();/测试当前File对象所指示的文件是否存在boolean canWrite();/测试当前文件是否可写boolean canRead();/测试当前文件是否可读boolean isFile();/测试当前文件是否是文件(不是目录)boolean isDirectory();/测试当前文件是否是目录,文件描述,普通文件信息和工具long lastModified();/得到文件最近一次修改的时间long length();/得到文件的长度,以字节为单位boolean delete();/删除当前文件
10、目录操作boolean mkdir();/根据当前对象生成一个由该对象指定的路径String list();/列出当前目录下的文件,文件的顺序处理,类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。,FileInputStream fis;try fis=new FileInputStream(text);System.out.print(content of text is:);int b;while(b=fis.read()!=-1)System.out.print(char)b);ca
11、tch(FileNotFoundException e)(e);catch(IOException e)(e);,实例讲解,TestNodeStream.javaTestBufferedStream.java,随机存取文件,public class RandomAccessFileextends Objectimplements DataInput,DataOutput接口DataInput中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean()、readInt()、readLine()、readFully()等。接口DataOutp
12、ut中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar()、writeDouble()、write()等。,随机存取文件,构造方法:RandomAccessFile(String name,String mode);RandomAccessFile(File file,String mode);文件指针的操作long getFilePointer();void seek(long pos);int skipBytes(int n);实例TestRandomAccessFile.java讲解,过滤流,过滤流在读/写数据的同时可以对数据进行处理,它提供了
13、同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。,过滤流,为了使用一个过滤流,必须首先把过滤流连接到某个输入/出流上,通常通过在构造方法的参数中指定所要连接的输入/出流来实现。例如:FilterInputStream(InputStream in);FilterOutputStream(OutputStream out);,过滤流,BufferedInputStream和BufferedOutputStream缓
14、冲流,用于提高输入/输出处理的效率。|,过滤流,DataInputStream 和 DataOutputStream可以以与机器无关的格式读取各种类型的数据。public class DataInputStream extends FilterInputStream implements DataInput,过滤流,DataInputStreambytereadByte()longreadLong()doublereadDouble()DataOutputStreamvoidwriteByte(byte)voidwriteLong(long)voidwriteDouble(double),过滤
15、流,LineNumberInputStream除了提供对输入处理的支持外,LineNumberInputStream可以记录当前的行号。PushbackInputStream提供了一个方法可以把刚读过的字节退回到输入流中。PrintStream打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流。,I/O例外,进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:FileNotFoundException,EOFException,IOException,流结束的判断,read()返回-1。readXXX()readInt()、readByte()、r
16、eadLong()、readDouble()等;产生EOFException。readLine()返回null。,字符流,java.io包中提供了专门用于字符流处理的类(以Reader和Writer为基础派生出的一系列类)。Reader和Writer这两个类是抽象类,只是提供了一系列用于字符流处理的接口,不能生成这两个类的实例,只能通过使用由它们派生出来的子类对象来处理字符流。,Reader,Reader类是处理所有字符流输入类的父类。读取字符public int read()throws IOException;public int read(char cbuf)throws IOExcep
17、tion;public abstract int read(char cbuf,int off,int len)throws IOException;,Reader,标记流public boolean markSupported();public void mark(int readAheadLimit)throws IOException;public void reset()throws IOException;关闭流public abstract void close()throws IOException;,Reader类的层次结构,Writer,Writer类是处理所有字符流输出类的
18、父类。向输出流写入字符public void write(int c)throws IOException;public void write(char cbuf)throws IOException;public abstract void write(char cbuf,int off,int len)throws IOException;public void write(String str)throws IOException;public void write(String str,int off,int len)throws IOException;,Writer,flush()
19、刷空输出流,并输出所有被缓存的字节。关闭流public abstract void close()throws IOException;,Writer类的层次结构,InputStreamReader和OutputStreamWriter,java.io包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介。,InputStreamReader和OutputStreamWriter,生成流对象public InputStreamReader(InputStream in);public InputStreamReader(InputStream in,String enc)throws
20、 UnsupportedEncodingException;public OutputStreamWriter(OutputStream out);public OutputStreamWriter(OutputStream out,String enc)throws UnsupportedEncodingException;,InputStreamReader和OutputStreamWriter,读入和写出字符基本同Reader和Writer。获取当前编码方式public String getEncoding();关闭流public void close()throws IOExcepti
21、on;,BufferedReader和BufferedWriter,生成流对象public BufferedReader(Reader in);public BufferedReader(Reader in,int sz);public BufferedWriter(Writer out);public BufferedWriter(Writer out,int sz);,BufferedReader和BufferedWriter,读入/写出字符除了Reader和Writer中提供的基本的读写方法外,增加对整行字符的处理。public String readLine()throws IOExc
22、eption;public void newLine()throws IOException;,import java.io.*;public class CharInput public static void main(String args)throws FileNotFoundException,IOException String s;FileInputStream is;InputStreamReader ir;BufferedReader in;is=new FileInputStream(“test.txt”);ir=new InputStreamReader(is);in=n
23、ew BufferedReader(ir);while(s=in.readLine()!=null)System.out.println(Read:+s);,运行结果如下:Read:java is a platform independentRead:programming languageRead:it is aRead:object oriented language.,从键盘接收输入的数据,InputStreamReader ir;BufferedReader in;ir=new InputStreamReader(System.in);in=new BufferedReader(ir)
24、;String s=in.readLine();System.out.println(“Input value is:”+s);int i=Integer.parseInt(s);/转换成int型i*=2;System.out.println(“Input value changed after doubled:”+i);,注意:在读取字符流时,如果不是来自于本地的,比如说来自于网络上某处的与本地编码方式不同的机器,那么我们在构造输入流时就不能简单地使用本地缺省的编码方式,否则读出的字符就不正确;为了正确地读出异种机上的字符,我们应该使用下述方式构造输入流对象:ir=new InputStre
25、amReader(is,encode);采用”encode”所指示的编码方式来构造输入字符流,编码方式有很多种,如:“ISO8859-1”,”GB2312”等。,对象的串行化(Serialization),对象记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。,串行化方法,在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。,定义一个可串行化对象,public class Studen
26、t implements Serializableint id;/学号String name;/姓名int age;/年龄String department/系别public Student(int id,String name,int age,String department)this.id=id;this.name=name;this.age=age;this.department=department;,构造对象的输入输出流,java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。在ObjectInputStrea
27、m中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。,保存对象状态,Student stu=new Student(981036,”Liu Ming”,18,“CSD”);FileOutputStream fo=new FileOutputStream(data.ser);ObjectOutputStream so=new ObjectOutputStream(fo);try so.writeObject(stu);so.close();catch(IOExceptione)System.o
28、ut.println(e);,恢复对象状态,FileInputStream fi=new FileInputStream(data.ser);ObjectInputStream si=new ObjectInputStream(fi);trystu=(Student)si.readObject();si.close();catch(IOExceptione)System.out.println(e);,串行化的注意事项,串行化能保存的元素只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。,串行化的注意事项,tr
29、ansient关键字对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明。,串行化实例讲解,SerializeDate.javaUnSerializeDate.java,Java 数据库编程技术(JDBC),JDBC API介绍,JavaSoft DBMS Java 数据库连接应用程序编程接口(JDBC API)JDBC提供了访问数据库的标准接口。JDBC的模型对开放数据库连接(ODBC)进行了改进,它包含一套发出SQL语句、更新表和调用存储过程的类和方法。,J
30、DBC Drivers,Type 1Two-tier:JDBC-ODBC bridgeType 2Two-tier:Java/DB vendor hybridsType 3Multitier:JDBC-to-network,pure-JavaType 4Two-tier:Java-only proprietary drivers,Type 1 Driver,Type 1Two-tier:JDBC-ODBC bridgeComes with JDKRequires ODBC binary on each client computerNot thread-safe,JavaApplication
31、,JDBC-ODBCBridge(JNI),Existing ODBC Driver,Native API(C/C+e.g.Oracle OCI),DBMS,DataBaseProtocol,Type 2 Driver,Type 2Two-tier:Java/database vendor hybridsAvoids bridge calls/protocol,but still requires vendor-specific libraries on each client computerjdbcKona/OraclejdbcKona/SybasejdbcKona/MSSQLServer
32、,JavaApplication,JDBCLayer(JNI),Native API(C/C+e.g.,Oracle OCI),DBMS,DataBaseProtocol,Type 3 Driver,Type 3Multitier:JDBC-to-network,pure-JavaClient has stubs for JDBC APIStubs translates JDBC calls into a DBMS-independent network protocol that is further translated to a DBMS protocol by a middleware
33、 serverPure-Java on client computers,JavaApplet orApplication,JavaJDBCDriver,JDBC,NativeAPI(e.g.OCI),DBMS,DriverProtocol,DataBaseProtocol,Type 4 Driver,Type 4Two-tier:Java-only Proprietary driversUses a Java-only API to communicate with the database server in a proprietary network protocol(a“nothing
34、-but-net”approach)Requires vendor-specific Java class librariesThink of it as Oracle OCI written in Java instead of CjdbcKona/MSSQLServer4 jdbcKona/Informix4,JavaApplet orApplication,JDBCDriver,DBMS,DataBaseProtocol,JDBC介绍,JDBC是Java的开发者Sun的Javasoft公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各
35、种常用数据库提供无缝联接的技术。JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。ODBC(OpenData Base Connectivity),称为开放式数据库互联技术,是由Microsoft公司倡导并得到业界普遍响应的一门数据库连接技术,JDBC与ODBC很类似。,JDBC的工作机制,JDBC定义了Java语言同SQL数据之间的程序设计接口。JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下四个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。,JDBC介绍,JavaS
36、oft公司开发了JDBC API,JDBC API是一个标准统一的SQL数据存取接口。JDBC在Internet中的作用与ODBC在Windows系列中的作用类似。它为Java程序提供了一个统一缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性,而且在Internet上确实无法预料你的用户想访问什么类型的数据库。只要系统上安装了正确的驱动器组,JDBC应用程序就可以访问其相关的数据库。,JDBC访问数据库记录的步骤,1、通过驱动器管理器获取连接接口。2、获得Statement或它的子类。3、限制Statement中的参数。4、执行Sta
37、tement。5、查看返回的行数是否超出范围。6、关闭Statement。7、处理其它的Statement8、关闭连接接口。,JDBC,JDBC不是Mincrosoft的ODBC(开放式数据库连接)规范派生的,JDBC完全是用Java编写的,而ODBC是个C接口。但是,JDBC和ODBC都是基于X/开放SQL命令层接口(CLI),相同的概念性基础使API工作进展更快,使API的接受更加容易。JavaSoft提供了将JDBC变成ODBC的JDBC-ODBC桥。这个用本地方法完成的版本很小很有效。,JDBC的优点和缺点,JDBC API用于连接Java应用程序与各种关系数据库。这使得人们在建立客户
38、/服务器应用程序时,通常把Java作为编程语言,把任何一种浏览器作为应用程序的友好界面,把Internet或Intranet作为网络主干,把有关的数据库作为数据库后端。,JDBC的优点,JDBC API与ODBC十分相似,有利于用户理解。JDBC使得编程人员从复杂的驱动器调用命令和函数中解脱出来,可以致力于应用程序中的关键地方。JDBC支持不同的关系数据库,使得程序的可移植性大大加强。用户可以使用JDBC-ODBC桥驱动器将JDBC函数调用转换为ODBC。JDBC API是面向对象的,可以让用户把常用的方法封装为一个类,备后用。,JDBC的缺点,使用JDBC,访问数据记录的速度会受到一定程度的
39、影响。JDBC结构中包含了不同厂家的产品,这就给更改数据源带来了很大的麻烦。,JDBC的三件事,与数据库建立连接,发送 SQL 语句,处理结果。,Connection con=DriverManager.getConnection(jdbc:odbc:wombat,login,password);Statement stmt=con.createStatement();ResultSet rs=stmt.executeQuery(SELECT a,b,c FROM Table1);while(rs.next()int x=rs.getInt(a);String s=rs.getString(b
40、);float f=rs.getFloat(c);,为什么需要 JDBC,ODBC 不适合直接在 Java 中使用,因为它使用 C 语言接口。从 Java 调用本地 C 代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。从 ODBC C API 到 Java API 的字面翻译是不可取的。例如,Java 没有指针,而 ODBC 却对指针用得很广泛(包括很容易出错的指针 void*)。您可以将 JDBC 想象成被转换为面向对象接口的 ODBC,而面向对象的接口对 Java 程序员来说较易于接收。,JDBC产品,jdbc JavaSoft 提供三种 JDBC 产品组件,它们是 Java
41、 开发工具包(JDK)的组成部份:JDBC 驱动程序管理器,JDBC 驱动程序测试工具包JDBC-ODBC 桥。,JavaSoftJDBC,JDBC 驱动程序管理器是 JDBC 体系结构的支柱。它实际上很小,也很简单;其主要作用是把 Java 应用程序连接到正确的JDBC 驱动程序上,然后即退出。JDBC 驱动程序测试工具包为使 JDBC 驱动程序运行您的程序提供一定的可信度。只有通过 JDBC 驱动程序测试包的驱动程序才被认为是符合 JDBC 标准TM 的。JDBC-ODBC 桥使 ODBC 驱动程序可被用作 JDBC 驱动程序。它的实现为 JDBC 的快速发展提供了一条途径,其长远目标提供
42、一种访问某些不常见的 DBMS(如果对这些不常见的 DBMS 未实现 JDBC)的方法。,与数据库建立连接,类加载驱动程序设置Java属性中的sql.driver来指定驱动程序列表Class.forName显式加载一个驱动程序Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);类,建立连接,DriverManager类的getConnection方法用于建立与某个数据源的连接String url=“jdbc:odbc:component”;Connection con=DriverManager.getConnection(url);getConnect
43、ion()函数的重载getConnection(Stringurl,Stringuser,Stringpassword),了解数据库信息,获取数据源的相关信息通过接口DatabaseMetaData的对象,该对象是在Connection对象之上获得的。创建DatabaseMetaData对象DatabaseMeatData dbma=con.getMetaData();,数据库的基本信息,getURL()数据库的URLgetUserName()返回此连接使用的数据库的用户名isReadOnly()返回一个boolean值,指示数据库是否只允许读操作getDatabaseProductName(
44、)返回数据库的产品名称getDriverName()返回驱动程序的名称getDriverVersion()返回驱动程序的版本号,获取数据库中各个表,public ResultSet getTables(Stringcatalog,StringschemaPattern,StringtableNamePattern,Stringtypes)throws SQLException getTables方法返回一个ResultSet对象,每一行是对一个表的描述。只有那些符合参数要求的表才被返回,获取表中各列的信息,public ResultSet getColumns(Stringcatalog,St
45、ringschemaPattern,StringtableNamePattern,StringcolumnNamePattern)throws SQLException getColumns返回一个ResultSet类的对象,其中每一行是对一列的描述,只有符合参数要求的列才被返回。,获取索引信息,public ResultSet getIndexInfo(Stringcatalog,Stringschema,Stringtable,booleanunique,booleanapproximate)throws SQLException,查询数据库,在已建立的连接的基础上执行查询语句JDBC中查
46、询语句的执行方法可以分为三类,分别对应Statement,PreparedStatement和CallableStatement对象,Statement,主要用于一般查询语句的执行创建Statement对象Statement stmt=con.createStatement();执行查询语句ResultSet rs=stmt.execQuery(“SELECT*FROM Customer”);关闭Statementstmt.close();,PreparedStatement,在多次执行同一语句时,使用PreparedStatement对象,PreparedStatement类是Stateme
47、nt类的子类创建PreparedStatement对象PreparedStatement pstmt=con.prepareSatement(“Select*from Customer”);执行查询语句ResultSet rs=pstmt.execQuery();关闭PreparedStatementPstmt.close();,CallableStatement,用于执行数据库中的存储过程CallableStatement类是PreparedStatement类的子类创建CallableStatement对象CallableStatement cstmt=con.prepareCall(“c
48、all Query1()”);执行存储过程ResultSet rs=cstmt.executeQuery();关闭CallableStatement,检索结果集,ResultSet的处理方法关于ResultSet对象维持的指向当前行的指针Statement stmt=con.createStatement();ResultSet rs=stmt.executeQuery(“Select a,b,c from table”);While(rs.next()int i=rs.getInt(1);String s=rs.getString(“name”);byte b=rs.getBytes(3);
49、System.out.println(i+“”+s+b0);,数据转换,ResultSet接口的getXXX方法试图将结果集中的SQL数据类型转换为它所返回的Java数据类型,获取结果集的信息,可以使用ResultSet类的getMetaData方法来获取结果集的信息ResultSetMetaData rsmd=rs.getMetaData();使用ResultSetMetaData类中的方法,可以得到许多关于结果集的信息getColumnCount()getColumnLabel(int column)getColumnName(int column)getColumnType(int column)getColumnTypeName(int column)isReadOnly(int column)isNullable(int column),更新数据库,对表中的记录进行操作stmt.execUpdate(“SQL语句”);返回的是操作所影响的记录的行数表中的记录的修改(Update)、插入(insert)、删除(delete)创建(Create Table)和删除(Drop Table)表增加和删除表中的列使用PreparedStatement对象更新数据库,数据库实例讲解,MakeDB.javaQueryDB.javaViewDB.java,总复习,课程总结,