• 1. java文件操作 和数据库连接计算机学院通信软件工程中心 张艳梅 ymzhang@bupt.edu.cn1
  • 2. 本章主要内容:1、读写文件数据 文件与数据流概念 流类与文件类File 典型的文件程序 2、JDBC,java数据库连接机制 数据库连接配置 数据库查询程序2
  • 3. 1、文件的概念对程序设计者来说,设计令人满意的I/O是件艰巨的任务。 文件是指存放在外部存储介质上的数据集合。 外部存储介质有:硬盘、光盘、U盘、软盘、磁带等。 数据以二进制形式存储。 文件命名规则需遵循操作系统的约定:主文件名[.扩展名] 文件分类:程序文件和数据文件;文本文件和二进制文件;顺序存取文件和随机存取文件。 在计算机系统中,文件被解释为一组有特定名称的关联字符流!3
  • 4. 1、文件数据的层次001 Sally 34002 Judy 29003 Rose 30002 Judy 29Judy字段(field)01001010字节(Byte) 1位(bit)数据库(database):按特定方式组织在一起的相关文件集合。 数据库技术产生于 60 年代末70 年代初期,其主要目的是为了有效地管理和存取大量的数据资源。数据变量数据类型对象变量文件数据数据 库文件1文件2文件34
  • 5. 冯.诺依曼机:编程的基础(外)存储器(内)存储器中央处理器(CPU)控制器输入 设备输出 设备数据流 地 址 控制流运算器5
  • 6. 1、文件与流流是文件和程序之间通讯的通道。当打开一个文件时,该文件就和某个流关联起来了,当关闭文件时,将会取消流和文件的连接。 读写文件三步骤:连接输入输出流到文件;读写数据;关闭文件。 缓冲流:使用缓冲器在I/O流中暂存数据,解决相对慢的I/O设备对程序效率影响。 Java.io包中定义了多种执行I/O操作的流 程序文件流6
  • 7. 1、java的流层次Objectjava.ioInputStreamRandomAccessFileOutputStreamReaderWriterFileDataInputStreamDataOutputStreamBufferedReaderBufferedWriterInputStream和OutputStream是字节流抽象类,Reader和Writer是字符流(与Unicode相容)抽象类,我们通常使用它们的子类。 我们通常使用多个流类组合产生设计所需的流对象BufferedInputStreamBufferedOutputStream7
  • 8. 1、文件类FileFile类是java.io类库提供,协助你处理文件和目录相关事务的类。 File对象可以表示一个特定名称的文件,也可以表示某个目录中的一组文件。 isDirectory() isFile() :boolean getName() getpath() getAbsolutePath() :String exists() canRead() canWrite() :boolean File对象还可以实现文件改名、删除、察看属性、建立新文件目录等功能。 renameToFile(in f:File):File delete() mkdirs() :boolean length() lastModified() :long8
  • 9. 1、文件是否可读判断 private boolean isReadableFile(String fileName) { try { //警戒区 File file = new File(fileName); if (!file.exists()) throw new FileNotFoundException(“No such file:”+fileName); if (!file.canRead()) throw new IOException(“File not readable:”+filename); return true; }catch(FileNotFoundException e) { //文件找不到异常 System.err.println(“IOERROR:File not found!”+fileName); return false; }catch(IOException e) { //文件不可读异常 System.err.println(“IOERROR:”+e.getMessage()); return false; }//isReadableFile()9
  • 10. 1、文件是否可写判断 private boolean isWriteableFile(String fileName) { try { //警戒区 File file = new File(filename); if (fileName.length() ==0) throw new IOException(“Invalid file name:”+fileName); if (file.exists() && !file.canWrite()) throw new IOException(“File not writeable:” +filename); return true; } catch(IOException e) { System.err.println(“IOERROR:”+e.getMessage()); return false; }//isWriteableFile()10
  • 11. 1、文本文件输入程序public class IOStreamDemo { public static void main(String args []) throws IOException { //文本文件读取,带缓冲功能 String f1=“textin.java”; if ( isReadableFile(f1) ) //判断文件是否可读 { BufferedReader in = new BufferedReader( new FileReader(f1)); String s,s2=new String(); while((s= in.readLine())!=null) s2 += s+”\n”; in.close(); }11
  • 12. 1、文本文件输出程序//将读取出来的字符串写入一个文本文件 try{ String f2=“text.out” if ( isWriteableFile(f2) ) //判断文件是否可写 { BufferedReader in2 = new BufferedReader( new StringReader(s2)); PrintWriter out1 = new BufferedWriter( new FileWriter(f2))); while((s= in2.readLine())!=null) out1.println(s); out1.close(); }catch(EOFException e) { System.err.println(End of stream”); }12
  • 13. 1、二进制文件读/写程序//按字节流进行写二进制文件 try{ String f3=“binary.dat” if ( isWriteableFile(f3) ) //判断文件是否可写 { DataOutputStream out2 = new DataOutputStream( new BufferedOutputStream( new FileOutputStream(f3))); out2.writeDouble(3.14159); out2.writeInt(30); out2.writeBytes(“That was pi”); out2.close(); }//end if }catch(EOFException e) { System.err.println(End of stream”); }13
  • 14. 1、二进制文件读/写程序//按字节流进行读二进制文件 String f3=“binary.dat” if ( isReadableFile(f3) ) //判断文件是否可读 DatainputStream in3 = new DataInputStream( new BufferedInputStream( new FileInputStream(f3))); System.out.println(in5.readDouble()); System.out.println(in5.readInt()); while( in3.available()!=0) System.out.print((char)in3.readByte()); in3.close(); }14
  • 15. 1、随机文件读写程序//随机存取的二进制文件写 RandomAccessFile rf= new RandomAccessFile(“rtest.dat”,”rw”); for (int i=0;i<10;i++) rf.writeDouble(i*1.414); rf.close(); //随机存取的二进制文件改写 rf= new RandomAccessFile(“rtest.dat”,”rw”); rf.seek(5*8); rf.writeDouble(47.0001); rf.close(); //随机存取的二进制文件读取 rf= new RandomAccessFile(“rtest.dat”,”r”); for (int i=0;i<10;i++) System.out.println(rf.readDouble()); rf.close();15
  • 16. 1、对象读写程序-1//对象可序列化为字节流,也可将字节流反序列化为对象 public class Student implements Serializable { private String name; private int year; private double gpa; public Student(String nameIn, int yr, double gpaIn){ ...} public void writeToFile(String f) throws IOException{ if ( isWriteableFile(f) ) //判断文件是否可写 { ObjectOutputStream ooStream = new ObjectOutputStream( new FileOutputStream(f)); ooStream.writeObject(this); ooStream.flush(); }//writeToFile()16
  • 17. 1、对象读写程序-2//对象可序列化为字节流,也可将字节流反序列化为对象 public void readFromFile(String f) throws IOException,ClassNotFoundException { if ( isReadableFile(f) ) //判断文件是否可写 { ObjectInputStream oiStream = new ObjectInputStream( new FileInputStream(f)); Student s = (Student)oiStream.readObject(); this.name=s.name; this.year=s.year; this.gpa=s.gpa; }//readFromFile()17
  • 18. 2、JDBC所有软件的发展,有一半和主从架构C/S相关。Java允许你建立平台无关的主从数据库应用程序。 数据库差异:Oracle、Informix、DB2、Sybase 获取数据库数据的逻辑:连接至数据库、建立指令、查询、看结果。 JDBC提供数据库驱动程序管理,帮助你通用的数据库查询程序。18
  • 19. 2、数据库查询程序结构装载jdbc驱动程序Class.forName(装载指令) 指令格式请察看jdbc驱动程序在线文档 产生数据库URL 数据库URL包括:jdbc远端连接+jdbc数据库连接 例:jdbc:rmi://192.168.170.27:1099/jdbc:cloudscape:db 调用DriverManager.getConnection(参数)登陆数据库 参数包括:数据库URL,用户名,密码 创建指令对象Statement s=Connection.creatStatement() 进行查询Statement.executeQuery(查询指令),结果放入ResultSet对象 看结果ResultSet.next(),getString(字段名), getInt(字段名), getFloat(字段名)... 关闭查询Statement.close()19
  • 20. 2、数据库查询示例import java.sql.* public class lookup{ public static void main(String args[]) throw SQLException,ClassNotFoundException{ String dbUrl=“jdbc:odbc:people”; String user=“”; String password=“”; Class.forName(“sun.jdbc.odbc.jdbcodbcDriver”); Connection c=DriverManager.getConnection(dbUrl,user,password); Statement s= c.createStatement();20
  • 21. 2、数据库查询示例 Statement s= c.createStatement(); ResultSet r=s.executeQuery( “SELECT FIRST,LAST,MAIL”+ “FROM people.csv people ”+ “WHERE (LAST=‘Eckel’) AND ”+ “(EMAIL Is Not Null) ORDER BY FIRST”); while (r.next()) { System.out.println(r.getString(“last”)+”,” r.getString(fIRST”)+”:”+ r.getString(“EMAIL”)); }//end while s.close(); }//main()21
  • 22. 作业-7改写你的猜谜程序(GUI界面),使之变为背单词游戏,以文本文件作为游戏的单词库。系统随机提示单词,当用户点击按钮后显示单词的中文解释。 下周上课前交22