收藏 分享(赏)

java课程设计参考资料.doc

上传人:scg750829 文档编号:8098723 上传时间:2019-06-08 格式:DOC 页数:28 大小:199KB
下载 相关 举报
java课程设计参考资料.doc_第1页
第1页 / 共28页
java课程设计参考资料.doc_第2页
第2页 / 共28页
java课程设计参考资料.doc_第3页
第3页 / 共28页
java课程设计参考资料.doc_第4页
第4页 / 共28页
java课程设计参考资料.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、Java 语言课程设计指导课程设计预备知识7.1 输入输出流和文件处理 7.1.1 Java 的常用输入、输出流 常用的输入输出流都继承自 4 个抽象类,分别是基于字节的 InputStream,OutputStream类和基于字符的 Reader 和 Writer 类。InputStream 和 OutputStream 类及其子类以字节为单位读写数据,所以称为字节流,而 Reader 和 Write 类及其子类以字符为单位读写数据,称为字符流。 7.1.2 字节流字节流包括以下几种类型,如表 7-1 所示。表 7-1 常见的字节流子类及功能字节流的类名 功能FileOutputStream

2、 写入文件的输出流FileInputStream 从文件读入的输入流DataOutputStream 包含了写 Java 标准数据类型的输出流DataInputStream 包含了读取 Java 标准数据类型的输入流BufferedInputStream 缓冲输入流BufferedOutputStream 缓冲输出流ByteArrayInputStream 从字节数组读取的输入流ByteArrayOutputStream 写入字节数组的输出流PrintStream 包含最常见的 Print()和 Println()的输出流7.1.2.1 InputStream 的常用方法InputStream

3、 是所有字节输入流的父类,其常用方法如表 7-2 所示。表 7-2 InputStream 类的常用方法方法名 功能int read( ) 读取一个字节,返回值为所读的字节int read( byte b ) 读取多个字节,放置到字节数组 b 中int read( byte b , int off, int len )读取 len 个字节,放置到以下标 off 开始字节数组 b中int available( ) 返回值为流中尚未读取的字节的数量long skip( long n ) 读指针跳过 n 个字节不读,返回值为实际跳过的字节数量close( ) 关闭输入流7.1.2.2 OutputS

4、tream 的常用方法OutputStream 是所有字节输出流的父类,其常用方法如表 7-3 所示。表 7-3 OutputStream 类的常用方法方法名 功能void write( byte b ) 往输出流中写一个字节 bvoid write( byte b ) 往输出流中写一个字节数组 bvoid write( byte b , int off, int len )把字节数组 b 中从下标 off 开始、长度为 len 的字节写入流中flush( ) 刷空输出流,并输出所有被缓存的字节close( ) 关闭输出流7.1.3 字符流 字符流包括以下几种类型,如表 7-4 所示。表 7-

5、4 常见的字符流子类及功能字符流的类名 功能InputStreamReader 将字节转换为字符的输入流OutputStreamWriter 将字节转换为字符的输出流FileReader 从文件读入的输入流FileWriter 写入文件的输出流CharArrayReader 从字符数组读取的输入流CharArrayWriter 写入字符数组的输出流StringReader 从字符串读取的输入流StringWriter 写入字符串的输出流BufferedReader 针对字符的缓冲输入流BufferedWriter 针对字符的缓冲输出流7.1.3.1 Reader 的常用方法Reader 是所有

6、字符输入流的父类,其常用方法如表 7-5 所示。表 7-5 Reader 类的常用方法方法名 功能int read( ) 读取单个字符,返回作为整数读取的字符int read( char cbuf ) 将字符读入数组,返回读取的字符数int read( char cbuf, int off, int len )读取 len 个字符的数据存放到数组 cbuf 中。long skip( long n ) 跳过 n 个字符不读,返回值为实际跳过的字符数close( ) 关闭输入流7.1.3.2 Writer 的常用方法Writer 是所有字符输出流的父类,其常用方法如表 7-6 所示。表 7-6 W

7、riter 类的常用方法方法名 功能void write( int c ) 往流中写入单个字符 cvoid write(char cbuf ) 往流中写入字符数组 cbufvoid write( char cbuf, int off, int len )将字符数组 cbuf 的一部分写入输出流void write(String str) 写入字符串void write(String str,int off,int len) 写字符串的某一部分void flush() 刷新该流的缓冲,将缓冲的数据全部写到目的地close( ) 关闭输出流7.1.4 文件的处理和随机访问7.1.4.1 Java

8、程序的文件与目录管理Java.io 包中的 File 类用来管理磁盘文件和目录。每个 File 类的对象表示一个磁盘文件或目录,对象属性中包含名称、长度、所含文件个数等信息。1. 创建 File 类对象的三种方法(1)File(String path)(2)File(String path, String name)(3)File(File dir, String name)2. 获取文件或目录信息获取文件或目录信息的常用方法如表 7-7 所示。表 7-7 获取文件或目录信息的方法方法名 含义boolean exists( ) 若文件或目录存在则返回 trueboolean isFile( )

9、 若对象代表有效文件则返回 trueboolean isDirectory( ) 若对象代表有效目录则返回 trueString getName( ) 返回文件名或目录名String getPath( ) 返回文件或目录的路径long length( ) 返回文件的字节数boolean canRead( ) 若文件为可读文件则返回 trueboolean canWrite( ) 若文件为可写文件则返回 trueboolean equals(File f ) 若两个文件对象相同则返回 trueString list( ) 将目录中所有文件名存在数组中返回3.文件或目录的操作对文件或目录进行操作的

10、相应方法如表 7-8 所示。表 7-8 文件或目录操作的方法方法名 含义boolean renameTo(File newFile) 将文件重命名void delete( ) 将当前文件删除boolean mkdir( ) 创建当前目录的子目录7.1.4.2 写文本文件的方法以下仅通过示例,说明写文本文件的方法。例 7-1:设文本文件名为 my.txt,先用 FileOutputStream 打开文件,然后用PrintStream 对象的 println 方法将字符串写入该文件中。代码如下:import java.io.*;public class testfile public static

11、 void main(String args) tryFileOutputStream fout=new FileOutputStream(“my.txt“);PrintStream p=new PrintStream(fout);p.println(“网络 082 唐广昌 男 江苏“);p.println(“网络 083 李仁杰 男 河北“);p.close(); catch(IOException ex) 例 7-2:用 FileWriter 打开文本文件,再创建 PrintWriter 对象,用其 print(或println)方法将字符串写入文件中。代码如下:import java.i

12、o.*;public class testfw public static void main(String args) tryFileWriter fw= new FileWriter(“myf.txt“);PrintWriter out=new PrintWriter(fw);out.println(“网络 082 唐广昌 男 江苏“);out.println(“网络 083 李仁杰 男 河北“);out.close(); fw.close(); catch(IOException ex) 7.1.4.3 读文本文件的方法例 7-3:用 FileReader 打开文本文件,然后用 Buff

13、eredReader 类的对象作为文件流,用其 readline 方法读取文件中的字符串。代码如下:import java.io.*;public class testfr public static void main(String args) tryFileReader fr= new FileReader (“myf.txt“);BufferedReader br=new BufferedReader(fr);String record=new String( );int recCount=0;while (record=br.readLine()!=null)recCount+;Sys

14、tem.out.println(recCount+“:“+ record); br.close(); fr.close(); catch(IOException ex) 7.1.4.4 文件的随机访问用 RandomAccessFile 类可以实现对文件的随机读写操作,即可以在文件的任意位置执行数据读写。其常用方法如表 7-9 所示。表 7-9 RandomAccessFile 类的常用方法方法名 作用public long getFilePointer( ) 获得当前文件位置指针从文件头算起的绝对位置public void seek( long pos ) 将文件读写指针移动到 pos 指定

15、的位置public long length( ) 返回文件的字节长度例 7-4: 利用 RandomAccessFile 类的方法,在 my.txt 文件后增加一行信息,代码如下所示。import java.io.*;public class testraf public static void main(String args) tryFile f=new File(“my.txt“);RandomAccessFile raf= new RandomAccessFile(f,“rw“);long fileEnd=raf.length();byte stu_info =“网络 081 吴旭婧

16、女 江苏 “.getBytes();raf.seek(fileEnd);raf.write(stu_info);raf.close();catch(IOException ex) 7.2 Java 中的数据结构 在编写程序时经常要和各种数据打交道,为处理这些数据所选用的数据结构对于程序的运行效率是非常重要的。本节介绍几种常见的数据结构的 Java 实现。7.2.1 HashSetHashSet 类是 Set 接口的实现类之一,使用较为广泛,它不保存元素的加入顺序,不能含有重复的元素。该类根据元素的哈希码进行存放,所以取出时也可以根据哈希码快速找到。例 7-5 演示了 HashSet 类的基本用

17、法。例 7-5: HashSet 的基本用法示例,代码如下所示。import java.util.*;class HashSetDemopublic static void main(String args)HashSet hs = new HashSet(); /创建 HashSet 对象并向其中加入对象元素hs.add(“1“);hs.add(“2“);hs.add(“3“);hs.add(“4“);hs.add(“5“);hs.add(“5“);Iterator it=hs.iterator(); /在 HashSet 上创建迭代器while(it.hasNext() /利用迭代器依次访

18、问 HashSet 中的各个元素System.out.println(it.next);hs.remove(“5“);System.out.println(hs); 运行结果如下:352413,2,4,1从运行结果可以看出,HashSet 添加的顺序与迭代显示的结果顺序并不一致,这也验证了 HashSet 不保存元素加入顺序的特征。7.2.2 ArrayList ArrayList 类支持可随需要而增长的动态数组,它以一个原始大小被创建,当超过了它的大小,将自动增大,当其中所包含的对象被删除后,则自动缩小。它对于使用索引取出元素有较高的效率,通过使用索引快速定位对象。但做删除或插入操作则速度较

19、慢。例 7-6 演示了 ArrayList 的基本用法。例 7-6: ArrayList 的基本用法,代码如下所示。import java.util.*;public class ArrayListDemopublic static void main(String args)Collection c1=new ArrayList(); /实例化一个具体的子类对象for(int i=0;i list=null ,具体调用时,要将通用类型转换成指定的类型来使用。泛型为提高大型程序的类型安全和可维护性带来了很大的潜力。泛型语言特性只在 JDK5.0及以后版本中可用。以下程序片段中同时使用泛型和非泛

20、型机制,从中可以感受到泛型所带来的便利。/不用泛型List list=new ArrayList();list.add(jzh”);/取出的元素为 Object 类型,需做强制类型转换String name=(String)list.get(0); System.out.println(“取出的元素为:”+name);/采用泛型List lst=new ArrayList();lst.add(jzh”);/取出的元素为 String 类型,不需做类型转换String rname=lst.get(0); System.out.println(“取出的元素为:”+rname);1.泛型的声明在定义

21、一个泛型类的时候,在“”之间定义形式类型参数,例如,”class TestGen”,其中”K”、 ”V”不代表值,而是表示类型。实例化泛型对象的时候,一定要在类名后面指定类型参数的值,如:List lst=new ArrayList();2.泛型的使用篇幅所限,仅以一个程序示例,让读者对泛型有个初步认识,具体实用时,请参阅相关书籍或网上资源。例 7-13: 泛型程序示例,代码如下所示。import java.util.*;public class TestGenericspublic static void main(String args)List lst=new ArrayList();l

22、st.add(“ABC“);lst.add(“DEF“);/错误操作,试图将 Integer 和 Double 类型的对象放入 List中/lst.add(1);/lst.add(2.0);String str=lst.get(0);/使用泛型后,获得对象时不用进行强制类型转换for(String s:lst)System.out.println(s);Map map=new HashMap();map.put(1,“Shi Jun“);map.put(2,“Ji Zhao-hui“);map.put(3,“Huang Xia“);Set keys=map.keySet();for(Integ

23、er i:keys)String value=map.get(i);System.out.println(i+“-“+value);运行结果如图 7-1 所示。图 7-1 例 7-13 的运行界面7.3 Java 多线程7.3.1 Java 中实现多线程的方法在程序中实现多线程有两种途径:创建 Thread 类的子类或实现 Runnable 接口。无论采用哪种途径,程序员可以控制的关键性操作有两个:(1) 在适当时候建立用户线程实例;(2)定义用户线程的操作,即定义用户线程的 run( )方法。1. 继承 Thread 类,重写方法 run()在创建的 Thread 类的子类中重写 run()

24、,加入线程所要执行的代码即可。例 7-14 和例 7-15 中即采用了这种方法。例 7-14:public class TwoThread extends Thread public void run() for ( int i = 0; i 10; i+ ) System.out.println(“New thread“);public static void main(String args) TwoThread tt = new TwoThread();tt.start();for ( int i = 0; i 10; i+ ) System.out.println(“Main thre

25、ad“);例 7-15:public class mainclass extends Applet C t1=new C(this);public void init() t1.start();public void paint(Graphics g) g.fillOval(20,20,200,200);g.drawRect(20,20,200,200); class C extends Thread mainclass a;C(mainclass b) a=b; public void run() while(true) a.repaint();try sleep(400); catch(I

26、nterruptedException e) 2.实现 Runnable 接口例 7-16:通过实现 Runnable 接口来实现多线程import java.applet.Applet;import java.awt.*;public class TestRunnable extends Applet implements Runnable /Java Applet 主类Label prompt1 = new Label(“第一个子线程“); /标签 1Label prompt2 = new Label(“第二个子线程“); /标签 2TextField threadFirst = new

27、TextField(14); /文本框 1TextField threadSecond = new TextField(14); /文本框 2Thread thread1,thread2; /两个 Thread 的线程对象int count1=0,count2=0; /两个计数器public void init()add(prompt1);add(threadFirst);add(prompt2);add(threadSecond);setFont(new Font(“隶书“,Font.ITALIC,20);public void start() /创建线程对象,具有当前类的 run()方法,

28、并用字符串指定线程对象的名字thread1 = new Thread(this,“FirstThread“);thread2 = new Thread(this,“SecondThread“);thread1.start(); /启动线程对象,进入就绪状态thread2.start();public void run() /实现 Runnable 接口的 run()方法,在该线程启动时自动执行String currentRunning;while(true)/无限循环try/使当前活动线程休眠 0 到 3 秒Thread.sleep(int)(Math.random() * 3000);cat

29、ch(InterruptedException e)currentRunning = Thread.currentThread().getName();if(currentRunning.equals(“FirstThread“) count1+;threadFirst.setText(“线程 1 第“+count1+“次被调度“);else if(currentRunning.equals(“SecondThread“) count2+;threadSecond.setText(“线程 2 第“+count2+“ 次被调度“);/while 循环结束/run()方法结束该程序的运行结果如图

30、7-2 所示。图 7-2 例 7-16 的运行界面7.3.2 线程的同步由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java 语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。1.synchronized 方法:通过在方法声明中加入 synchronized 关键字来声明 synchronized 方法。synchronized 方法控制对类成员变量的访问:每个类实例对应

31、一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞。方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种方法有效避免了类成员变量的访问冲突。2.synchronized 块:通过 synchronized 关键字来声明 synchronized 块。语法如下:synchronized(syncObject) /允许访问控制的代码 synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject 的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指

32、定上锁的对象,故灵活性较高。例 7-17:设有火车票售票系统,共有 3 个售票点共同销售 500 张火车票,请用多线程来摸拟这个售票系统。分析:3 个售票点的活动可用 3 个线程来摸拟,这里的车票为共享数据,为了保证共享数据的安全,可以用 synchronized 来进行方法或代码块的同步。代码如下:public class TicketSellingTestpublic static void main(String args)TicketSelling off=new TicketSelling(); /要多线程运行的售票系统Thread t1=new Thread(off);t1.set

33、Name(“售票点 1“);t1.start();Thread t2=new Thread(off);t2.setName(“售票点 2“);t2.start();Thread t3=new Thread(off);t3.setName(“售票点 3“);t3.start();class TicketSelling implements Runnableprivate int tickets=0; /对车票进行计数的成员变量public void run( ) /线程体boolean flag=true; /是否还有票可卖-局部变量while(flag) flag=sell(); /售票pub

34、lic synchronized boolean sell() /同步售票方法,返回值表示是否还有票可卖boolean flag=true;if(tickets1000)tickets=tickets+1; /更改票数System.out.println(Thread.currentThread().getName()+“:售出第“+tickets+“ 张票“);elseflag=false;tryThread.sleep(15);catch(InterruptedException e)e.printStackTrace();return flag;运行结果为:售票点 1:售出第 1 张票售

35、票点 2:售出第 2 张票售票点 3:售出第 3 张票售票点 1:售出第 4 张票售票点 2:售出第 5 张票售票点 3:售出第 6 张票售票点 1:售出第 997 张票售票点 2:售出第 998 张票售票点 3:售出第 999 张票售票点 1:售出第 1000 张票7.3.3 用 Timer 类调度任务从 JDK1.3 开始,JDK 提供了 java.util.Timer 类来定时执行任务。Java.util.Timer 类代表一个计时器,与每个 Timer 对象相对应的是单个后台进程,用于顺序地执行所有计时器任务。这个计时器执行的任务用 java.util.TimerTask 子类的一个实

36、例来代表。Java.util.TimerTask 类是一个抽象类,要创建一个定时任务时,只需要继承这个类并实现 run()方法,再把要定时执行的任务代码添加到 run()方法体中即可。示例代码如下:class MyTask extends TimerTask /定时任务类 public void run() /实现 run()方法 System.out.println(“大家好”);定义好定时任务类之后,就可以用 Timer 类来定时执行了。Timer 类中用来执行定时任务的常用方法如下:(1)public void schedule(TimerTask task,long delay,lon

37、g period):重复地以固定的延迟时间去执行一个任务。(2)public void scheduleAtFixedRate(TimerTask task,long delay,long period):重复地以固定的频率去执行一个任务。(3)public void cancel():终止此计时器,丢弃所有当前已安排的任务。例 7-18:利用 Timer 类,在屏幕上每隔一秒显示当前的系统时间。import java.util.Timer;import java.util.TimerTask;import javax.swing.*;import java.util.Date;import

38、java.awt.*;import java.text.SimpleDateFormat;public class TimeTest extends JFrameJLabel lbl1=new JLabel(“现在的时间是:“);static JTextField txt=new JTextField(10);TimeTest()super(“显示系统时钟“);setLayout(new FlowLayout();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.getContentPane().add(lbl1);this.getCont

39、entPane().add(txt);public static void main(String args)Timer timer=new Timer();/立即开始执行指定任务,并间隔 1000 毫秒就重复执行一次timer.schedule(new MyTask(),0,1000);TimeTest tt=new TimeTest();tt.setSize(300,100);tt.setVisible(true);class MyTask extends TimerTask /定时任务类public void run() /实现 run()方法 SimpleDateFormat sdf1

40、=new SimpleDateFormat(“HH:mm:ss,E“);TimeTest.txt.setText(sdf1.format(new Date();运行界面如图 7-3 所示,文本框中的系统时间每隔 1 秒刷新显示。图 7-3 例 7-18 运行界面7.4 Java 网络编程Java 最初是作为一种网络编程语言出现的,Java 类库提供了强大的网络功能,使得它能够使用网络上的各种资源和数据,与服务器建立各种传输通道,并将数据传送到网络的各个地方。 7.4.1 Java 网络类和接口 Java 中有关网络方面的功能都定义在 程序包中,它提供的网络功能大致分类如下: 1. URL 和

41、 URLConnection 这是三大类功能中最高级的一种。通过 URL 的网络资源表达方式,很容易确定网络上数据的位置。利用 URL 的表示和建立,Java 程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端。2.Socket Socket 接口是 TCP/IP 网络的 API,Socket 接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP 网络上的应用程序。 3.Datagram 是这些功能中最低级的一种。其他网络数据传送方式,都假想在程序执行时,建立一条安全稳定的通道,但是以 Datagram 的方式传送数据时,只是把数据的目的地记录在数据包中,然后就直接放

42、在网络上进行传输,系统不保证数据一定能够安全送到,也不能确定什么时候可以送到,即 Datagram 不能保证传送质量。 7.4.2 InetAddress 类 .InetAddress 类是 Java 的 IP 地址封装类,它不需要用户了解如何实现地址的细节。该类没有构造方法,要创建该类的实例对象,可以通过该类的静态方法获得该对象。这些静态方法如表 7-10 所示。表 7-10 InetAddress 类的静态方法方法名 说明static InetAddress getLocalHost() 获得本地机的 InetAddress 对象static InetAddress getByName (

43、String host) 在给定主机名的情况下确定主机的 IP 地址static InetAddress getByAddress(String host,byte addr)根据提供的主机名和 IP 地址创建 InetAddressstatic InetAddress getByAddress(byte addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象static InetAddress getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组String getHostName() 返回一

44、个字符串,就是主机名字String toString() 得到主机名和 IP 地址的字符串例 7-19:用 InetAddress 来获取某个主机的名称和 IP 地址等信息。import .*;public class InternetDemopublic static void main(String args)tryInetAddress inetadd=InetAddress.getByName(““);System.out.println(inetadd.toString();System.out.println(inetadd.getHostName();System.out.pri

45、ntln(inetadd.getHostAddress();catch(Exception e)e.printStackTrace();运行界面如图 7-4 所示:图 7-4 例 7-19 运行界面7.4.3 URL 和 URLConnection 类 以 URL 表示 Internet 上各种数据资源的位置,已经成为一种标准的方式。为了处理方便,Java 将 URL 封装成 URL 类来记录完整的 URL 信息。 URL 类的常用构造方法如表 7-11所示。表 7-11 URL 类的常用构造方法方法名 说明URL(String spec) 根据 String 表示形式创建 URL 对象URL

46、(String protocol,String host,int port,String file)用指定的协议、主机名、端口号、文件路径及文件名创建一个 URL 对象URL(String protocol, String host, String file)用指定的协议、主机名、路径及文件名创建 URL 对象URL( URL context, String spec) 用已经存在的 URL 对象对给定的 spec 进行解析创建URLURL 类中一些常用方法如下:(1)public final InputStream openStream():打开到此 URL 的链接并返回一个用于从该连接读入

47、的 InputStream。 (2)public String getFile(): 取得资源的文件名。 (3)public String getHost():取得机器的名称。 (4)public int getPort():取得端口号。 (5)public String getProtocol():取得传输协议。 (6)public String toString():把 URL 转化为字符串。 例 7-20: URL 对象的创建及使用。import java.io.BufferedReader;import java.io.InputStreamReader;import .URL;pub

48、lic class URLReaderpublic static void main(String args)tryURL url=new URL(“http:/“);/获取协议System.out.println(“Protocol:“+url.getProtocol();/获取主机名System.out.println(“Host:“+url.getHost();/获取端口号System.out.println(“Port:“+url.getPort();/获取文件System.out.println(“File:“+url.getFile();/把 URL 转换为字符串System.out.println(“toString:“+url.toString();catch(Exception e)e.printStackTrace();程序运行结果如图 7-5 所示。 图 7-5 例 7-20 运行界面使用 URLConnection 对象的一般方法如下:(1)创建一个 URL 对象。 (2)调用 URL 对象的 openCo

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报