B08输入输出及数据库操作.ppt_第1页
B08输入输出及数据库操作.ppt_第2页
B08输入输出及数据库操作.ppt_第3页
B08输入输出及数据库操作.ppt_第4页
B08输入输出及数据库操作.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 输入输出及数据库操作,8.1 输入和输出 8.2 数据库操作,8.1 输入和输出,8.1.1 流的含义 8.1.2 流的层次结构 8.1.3 标准输入输出 8.1.4 File类 8.1.5 FileInputStream类和FileOutputStream类 8.1.6 DataInputStream类和DataOutputStream类 8.1.7 随机访问文件 8.1.8 Reader类和Writer类 8.1.9 IOException类的几个子类,8.1.1 流的含义,流 是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或

2、是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图7-1:,图7-1 流,8.1.1 流的含义,数据流是指一组有顺序的、有起点的和终点的字节集合 Java将读取数据的对象称为输入流;能向其写入数据的对象称为输出流。 字节流,被称作输入流(Input stream)或输出流(Output stream),基于数据的I/O是二进制(比如说表示图像的位图) 字符流,被称作Reader或Writer,基于文本的I/O都是一些人们能够阅读的字符(比如说程序的源代码,字符流,8.1.1 流的含义,InputStream,Outp

3、utStream,Reader,Writer是四个抽象类。Java中其他多种多样变化的流均是由它们派生出来的。在这四个抽象类中,InputStream和Reader定义了完全相同的接口: int read() int read(char cbuf) int read(char cbuf, int offset, int length) 而OutputStream和Writer也是如此: int write(int c) int write(char cbuf) int write(char cbuf, int offset, int length),8.1.2 流的层次结构,InputStre

4、am和OutputStream流层次结构如图7-2和图7-3所示 Reader和Writer流层次结构如图7-4和图7-5所示,图7-2 InputStream输入流层次结构,图7-3 OutputStream输出流层次结构,图7-4 Reader流层次结构,Reader,图7-5 Writer流层次结构,Writer,8.1.3 标准输入输出,标准输入输出都是System类中定义的类成员变量,包括: System.in:代表标准输入流,默认状态对应于键盘输入。 System.out:代表标准输出流,默认状态对应于屏幕输出。 System.err:代表标准错误输出流,默认状态对应于屏幕输出。,

5、【实例8-1】 import java.io.*; class stdIOExample1 public static void main(String args) throws IOException int ch; int count = 0; System.out.println(请输入字符(当输入0时退出!)); while (char)(ch = System.in.read() != 0) /输入字符 count+; System.out.print(char)ch); /输出字符 System.out.println(); System.err.println(counted +

6、 count + total bytes.); 说明:在本实例中,利用System.in.read()不断从键盘输入字符,并在显示屏输出,count用于累计输入字符个数,当输入字符为0时,输入终止。,8.1.4 File类,含义: File类与InputStream / OutputStream类同属于一个包,它不允许访问文件内容。File类主要用于命名文件、查询文件属性和处理文件目录。 1File类的构造方法 public File(String name):指定与File对象关联的文件或目录的名称,name可以包含路径信息及文件或目录名。 例如: File myFile; MyFile=

7、new File(“D:WUabc.txt”),8.1.4 File类,1File类的构造方法 public File(String pathName,String name):使用参数pathName(绝对路径或相对路径)来定位参数name所指定的文件或目录。 例如: File myFile; MyFile= new File(“D:WU”,“abc.txt”);,8.1.4 File类,1File类的构造方法 public File(File directory,String name):使用现有的File对象directory(绝对路径或相对路径)来定位参数name所指定的文件或目录。

8、例如: File myDir=new File(“D:WU”); MyFile= new File(myDir,“abc.txt”); public File(URI rui):使用给定的同一资源定位符来定位文件。,8.1.4 File类,2File类常见方法 String getName();得到一个文件的名称(不包括路径) String getPath();得到一个文件的路径名 String getAbsolutePath();得到一个文件的绝对路径名 String getParent();得到一个文件的上一级目录名 String renameTo(FilenewName);将当前文件名更

9、名为给定文件的完整路径 booleanexists();测试当前File对象所指示的文件是否存在 booleancanWrite();测试当前文件是否可写 booleancanRead();测试当前文件是否可读,8.1.4 File类,2File类常见方法 boolean isFile();测试当前文件是否是文件(不是目录) boolean isDirectory();测试当前文件是否是目录 longlastModified();得到文件最近一次修改的时间 longlength();得到文件的长度,以字节为单位 booleandelete();删除当前文件 booleanmkdir();根据当

10、前对象生成一个由该对象指定的路径 Stringlist();列出当前目录下的文件,【实例8-3】 import java.io.*; public class fileTest void listAttributes(String fileName) File f=new File(fileName); if( f.exists( ) ) System.out.println(Attributes of +fileName); System.out.println(Exist: +f.exists(); System.out.println(Can read: +f.canRead(); Sy

11、stem.out.println(Can write: +f.canWrite(); System.out.println(Is file: +f.isFile(); System.out.println(Is director: +f.isDirectory(); System.out.println(Is absolute path: +f.isAbsolute(); else System.out.println(fileName+ does not exist!); ,【实例8-3】 public static void main(String args ) if(args.lengt

12、h!=1) System.out.println(Usage: java fileTest ); System.exit(1); fileTest obj=new fileTest ( ); obj.listAttributes(args0); ,编译完毕后,按照如下方式运行: g:java01java fileTest fileTest.java 则得到如下结果: Attributes of fileTest.java Exist: true Can read: true Can write: true Is file: true Is director: false Is absolute

13、 path: false,8.1.5 FileInputStream类和FileOutputStream类,1FileInputStream类 FileInputStream典型地表示一种顺序访问的文本文件,可以访问文件的一个字节、几个字节或整个文件。 基本步骤: 步骤一:利用FileInputStream打开文件。 FileInputStream myFileStream; myFileStream= new FileInputStream(“D:WU”,“abc.txt”) 或者 File myFile; FileInputStream myFileStream; myFile= new

14、File(“D:WUabc.txt”) myFileStream= new FileInputStream(myFile),8.1.5 FileInputStream类和FileOutputStream类,1FileInputStream类 步骤二:使用方法read()读取信息。 int read() int read(byte input) int read(byte input,int offset,int length) 步骤三:读取完毕后要关闭FileInputStream对象。 myFileStream.close(),8.1.5 FileInputStream类和FileOutpu

15、tStream类,1FileInputStream类 FileInputStream类常用方法: public abstract int read( ) public int read(byte b ) public int read(byte b , int off, int len) 。 public int available( ) public long skip(long n) public int close( ),【实例8-4】 import java.io.*; public class FileInputStreamExample public static void mai

16、n(String args) throws IOException String fname=FileInputStreamExample.java; try FileInputStream rf = new FileInputStream(fname); int n=16; byte buffer = new byten; while (rf.read(buffer,0,n)!=-1) ,【实例8-4】 System.out.println(); rf.close(); /关闭输入流 catch (IOException ioe) System.out.println(ioe); catch

17、 (Exception e) System.out.println(e); ,8.1.5 FileInputStream类和FileOutputStream类,2FileOutputStream类 FileOutputStream类用来处理以文件作为数据输出目的数据流 基本步骤包括: 步骤一:利用FileOutputStream打开文件。 FileOutputStream myFileStream; myFileStream= new FileOutputStream(“D:WU”,“abc.txt”) 或者 File myFile; FileOutputStream myFileStream

18、; myFile= new File(“D:WUabc.txt”) myFileStream= new FileOutputStream(myFile),8.1.5 FileInputStream类和FileOutputStream类,2FileOutputStream类 步骤二:使用方法write ()写信息。 public void write(byte b ): public void write(byte b , int off, int len) public abstract void write(int b) 步骤三:读取完毕后要关闭FileOutputStream对象。 myF

19、ileStream.close(),8.1.5 FileInputStream类和FileOutputStream类,FileOutputStream类常用方法: public void write(byte b ) public void write(byte b , int off, int len) public abstract void write(int b) public void flush( ) public void close( ),【实例8-5】 import java.io.*; public class FileOutputStreamExample public

20、static void main(String args) try System.out.print(输入一行字符: ); int count,n=512; byte buffer = new byten; FileOutputStream wf = new FileOutputStream(Output.txt); count = System.in.read(buffer); wf.write(buffer,0,count); /写入输出流 wf.close(); /关闭输出流 System.out.println(输入行字符已保存到Output.txt!); ,【实例8-5】 catch

21、 (IOException ioe) System.out.println(ioe); catch (Exception e) System.out.println(e); ,8.1.6 DataInputStream类和DataOutputStream类,1DataInputStream DataInputStream与FileInputStream差不多,可以直接读取任意一种变量类型。一般来说,对二进制文件使用DataInputStream流。 打开和关闭DataInputStream对象时,其方法与FileInputStream相同。也可以使用read()方法读取文件内容,同时还可以使用

22、其它方法来访问不同类型的数据。,8.1.6 DataInputStream类和DataOutputStream类,1DataInputStream 打开DataInputStream流 DataInputStream myFileStream; myFileStream= new DataInputStream (“D:WU”,“abc.txt”) 读取DataInputStream流 myFileStream.read() 关闭DataInputStream流 myFileStream.close(),8.1.6 DataInputStream类和DataOutputStream类,主要方法

23、 byte readByte()读取byte型数据 int readUnsignedByte()读取unsignedbyte型数据 short readShort()读取short型数据 int readUnsignedShort()读取unsignedshort型数据 char readChar()读取char型数据 int readInt()读取int型数据 long readLong()读取long型数据 float readFloat()读取float型数据 double readDouble()读取double型数据 String readLine()读取line型数据,8.1.6

24、DataInputStream类和DataOutputStream类,2DataOutputStream类 DataOutputStream与FileOutputStream差不多,可以直接写任意一种变量类型。一般来说,对二进制文件使用DataOutputStream流。 打开和关闭DataOutputStream对象时,其方法与FileOutputStream相同。也可以使用write()方法写文件内容,同时还可以使用其它方法来访问不同类型的数据。,8.1.6 DataInputStream类和DataOutputStream类,1DataInputStream 打开DataOutputSt

25、ream流 DataOutputStream myFileStream; myFileStream= new DataOutputStream (“D:WU”,“abc.txt”) 读取DataOutputStream流 myFileStream.write() 关闭DataInputStream流 myFileStream.close(),8.1.6 DataInputStream类和DataOutputStream类,主要方法 void writeByte()写入byte型数据 void writeBoolean()写入boolean型数据 void writeShort()写入short

26、型数据 void writeChar()写入char型数据 void writeInt()写入int型数据 void writeLong()写入long型数据 void writeFloat()写入float型数据 void writeDouble()写入double型数据 void writeBytes()写入bytes型数据 void writeChars()写入chars型数据,8.1.7 随机访问文件,对于很多场合,例如银行系统、实时销售系统,要求能够迅速、直接地访问文件中的特定信息,而无需查找其他的记录。这种类型的即时访问可能要用到随机存取文件和数据库。随机文件的应用程序必须指定文件

27、的格式。最简单的是要求文件中的所有记录均保持相同的固定长度。利用固定长度的记录,程序可以容易地计算出任何一条记录相对于文件头的确切位置。,8.1.7 随机访问文件,Java.io包提供了RandomAccessFile类用于随机文件的创建和访问,实现了DataOutput和DataInput接口,可用来读写各种数据类型。 RandomAccessFile类有个位置指示器,对文件指针显式操作的方法有: int skipBytes(int n):把文件指针向前移动指定的n个字节 void seek(long):移动文件指针到指定的位置。 long getFilePointer():得到当前的文件指

28、针。,8.1.7 随机访问文件,1构造函数: public RandomAccessFile(String name, String mode ) public RandomAccessFile( File file, String mode ) mode 的取值 “r” 只读 “rw” 读写 “rws” 同步读写 “rwd” 数据同步读写,8.1.7 随机访问文件,2主要方法 public RandomAccessFile(File f, String mode) public void setLength(long newLength) public long length() publi

29、c void seek(long pos) public int skipBytes(int n) public int read() public final double readDouble() public final void writeChar(int v) public final void writeInt(int v) public long getFilePointer(),8.1.7 随机访问文件,3应用过程 创建和打开随机文件访问方式 (1)用文件名:myRAFile=new RandomAccessFile(String name,String mode) (2)用文

30、件对象:myRAFile=new RandomAccessFile(File file,String mode) 随机访问读写 利用read()或write()方法进行随机读写,【实例8-6】 import java.io.*; public class rafExample RandomAccessFile fp; public static void main(String args) throws IOException rafExample a=new rafExample(); int MaxValue=100; a.createprime(MaxValue); ,【实例8-6】 p

31、ublic void createprime(int max) throws IOException fp=new RandomAccessFile(primes.bin,rw);/创建文件对象 fp.seek(0); /文件指针为0 fp.writeInt(2); /写入整型 int k=3; while (k=max) if (isPrime(k) fp.writeInt(k); k = k+2; ShowPrimes(max); fp.close(); /关闭文件 ,【实例8-6】 public boolean isPrime(int k) int i=0; boolean yes =

32、false; for (i=2;ik/2) yes=true; return yes; ,【实例8-6】 public void ShowPrimes(int max) throws IOException try fp.seek(0); System.out.println(2.+max+中有 + (fp.length()/4)+ 个素数:); for (int i=0;i(int)(fp.length()/4);i+) fp.seek(i*4); System.out.print(fp.readInt()+ ); if (i+1)%5=0) System.out.println(); ca

33、tch(EOFException e) System.out.println(); ,说明: 在本实例中,对一个二进制整数文件实现访问操作,当以可读写方式“rw”打开一个文件prinmes.bin时,如果文件不存在,将创建一个新文件。先将2100内的素数依次写入文件prinmes.bin。,8.1.8 Reader类和Writer类,同类InputStream和OutputStream一样,Reader和Writer也是抽象类,只提供了一系列用于字符流处理的接口。它们的方法与类InputStream和OutputStream类似,只不过其中的参数换成字符或字符数组。 Reader和Writer

34、是所有读取字符流类的父类抽象类(面向Unicode字符操作) Java使用Unicode码表示字符和字符串。,【实例8-7】 import java.io.*; public class Echo public static void main(String args) BufferedReader in = new BufferedReader( new InputStreamReader(System.in); String s; try while(s = in.readLine().length() != 0) System.out.println(s); / An empty lin

35、e terminates the program catch(IOException e) e.printStackTrace(); ,8.1.8 Reader类和Writer类,Reader类的主要方法 boolean ready() 输入字符流是否可读 int read() 读取一个字符 int read(char cbuf) 读取一串字符(到字符数组cbuf) long skip(long n) 跳过n个字符 mark(int readAheadLimit) 在当前位置做一标记 reset() 将读取位置恢复到标记处 close() 关闭字符流,8.1.8 Reader类和Writer类

36、,Writer类的主要方法 void close() 关闭流 void flush() 强行写入 void write(char cbuf) 写入字符串cbuf void write(char cbuf, int off, int len) 写入字符数组cbuf中自位置off开始的len字符 void write(int c) 写入c void write(String str) 写入字符串str void write(String str, int off, int len) 写入字符串str中自位置off开始的len字符,8.1.9 IOException类的几个子类,1public cl

37、ass EOFException :当碰到输入尾时,抛出这种类型的异常。 2public class FileNotFoundException:当文件找不到时,构造函数抛出这种类型的异常。 3public class InterruptedIOException:当I/O操作被中断时,抛出这种类型的异常。 4 public class UTFDataFormatException:当在读的字符串中有UTF语法格式错误时,由DataInputStream.readUTF( )方法抛出。,8.2 数据库操作,8.2.1 ODBC 8.2.2 JDBC 8.2.3 使用JDBC-ODBC技术访问数

38、据库 8.2.4 基本SQL语句,8.2.1 ODBC,ODBC由应用程序、驱动持续管理器、驱动程序和数据源等组成,如图7-6所示。应用程序通过ODBC接口访问不同数据源中的数据,每个不同的数据源类型由一个驱动程序支持。驱动程序管理器为应用程序装入合适的驱动程序。,图7-6 ODBC层次结构,8.2.2 JDBC,JDBC(Java DataBase Connectivity) 是一种用于执行SQL语句的Java API。JDBC使开发人员既可以用纯Java语言编写完整的数据库应用程序。 JDBC完成三件事: (1)与一个数据库连接; (2)向数据库发送SQL语句; (3)处理数据库返回的结果

39、。图7-7显示了java程序通过JDBC访问数据库的过程。,Java程序通过JDBC访问数据库的关系,java应用程序,JDBC驱动程序,Sun JDBC/ODBC桥 (本地),数据库,ODBC驱动程序 (本地),数据库客户机,纯java解决方案,混合解决方案:java本地代码,图7-7 Java程序通过JDBC访问数据库的示意图,8.2.2 JDBC,JDBC API是一组由Java语言编写的类和接口,包含在java.sql和javax.sql两个包中。java.sql为核心包,包含于J2SE中。javax.sql包扩展了JDBC API的功能,使其从客户端发展为服务器端,成为了J2EE的一

40、个基本组成部分。,8.2.2 JDBC,JDBC API可分为两个层次: 面向底层的JDBC Driver API:主要是针对数据库厂商开发数据库底层驱动程序使用。 面向程序员的JDBC API:应用程序通过JDBC API和底层的JDBC Driver API打交道。,图7-8 应用程序、Driver和数据库之间的关系,纯JDBC 驱动程序,数据库,java应用程序,JDBC驱动器管理器,DBMS提供的本机java API,JDBC-ODBC桥接驱动程序 ODBC和数据库驱动,其他 驱动程序,JDBC API,JDBC Driver API,8.2.2 JDBC,一个基本的JDBC程序开发包

41、含如下步骤: 设置环境,引入相应的JDBC类 选择合适的JDBC驱动程序并加载 分配一个Connection对象 分配一个Statement对象 用该Statement对象进行查询等操作 从返回的ResultSet对象中获取相应的数据 关闭Connection,8.2.2 JDBC,概念: DriverManager:处理驱动的调入并且对产生新的数据库连接提供支持 DataSource:在JDBC 2.0 API中被推荐使用代替DriverManager实现和数据库的连接 Connection:代表对特定数据库的连接 Statement:代表一个特定的容器,容纳并执行一条SQL语句 Resul

42、tSet:控制执行查询语句得到的结果集,8.2.3 使用JDBC-ODBC技术访问数据库,JDBC和数据库建立连接的一种方式是首先建立起一个JDBC-ODBC桥接器 访问步骤: 步骤1:设置数据源 步骤2:建立ODBC-JDBC桥接器 步骤3:连接到数据库 步骤4:向数据库发送SQL语句 步骤5:处理查询结果,8.2.3 使用JDBC-ODBC技术访问数据库,JDBC和数据库建立连接的一种方式是首先建立起一个JDBC-ODBC桥接器 访问步骤: 步骤1:设置数据源 步骤2:建立ODBC-JDBC桥接器 步骤3:连接到数据库 步骤4:向数据库发送SQL语句 步骤5:处理查询结果,8.2.3 使用

43、JDBC-ODBC技术访问数据库,步骤1:设置数据源 开始-设置-控制面版-管理工具-ODBC 附件给出了设置数据源的详细步骤。,8.2.3 使用JDBC-ODBC技术访问数据库,步骤2:建立ODBC-JDBC桥接器 String sDBDriver =sun.jdbc.odbc.JdbcOdbcDriver; Class.forName(sDBDriver); 异常处理 try Class.forName(sDBDriver); catch (java.lang.ClassNotFoundException e ) System.err.println(shop(): + e.getMess

44、age() ); ,8.2.3 使用JDBC-ODBC技术访问数据库,步骤3:连接到数据库 String sConnStr =jdbc:odbc:mydatasource; / mydatasource为数据源名称 conn = DriverManager.getConnection (sConnStr,user1,123); 异常处理方式为: try Connection conn = DriverManager.getConnection (sConnStr,user1,123); catch (SQLException e) ,8.2.3 使用JDBC-ODBC技术访问数据库,步骤4:向

45、数据库发送SQL语句 try Statement Stmt = conn.createStatement(); catch (SQLException e) 步骤5:处理查询结果 ResultSet RS = Stmt.executeQuery(SELECT * FROM table1); String s=RS. getString(“name”)或 String s=RS. getString(2),【实例8-8】 /使用JDBCODBC桥接器访问access数据库 import java.sql.*; import java.io.*; public class ShowAccessFi

46、le public static void main(String args) String tt=null; int count=0; String sDBDriver =sun.jdbc.odbc.JdbcOdbcDriver; String sConnStr =jdbc:odbc:myaccess; Connection conn = null; Statement Stmt=null; ResultSet RS = null; try Class.forName(sDBDriver); ,【实例8-8】 catch (java.lang.ClassNotFoundException e ) System.err.println(shop(): + e.getMessage() ); try conn = DriverManager.getConnection (sConnStr,); Stmt = conn.createStatement(); Stmt.executeUpdate(INSERT INTO table1 VALUES(吴一,男) ); Stmt.executeUpdate(INSERT INTO table1 VALUES(郭妞,女) ); RS = Stmt.executeQuery(SELECT * FROM table1);,【实例8-8】 whi

温馨提示

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

评论

0/150

提交评论