怀德学院
Java程序设计 实验报告
第 3 次实验
实验名称 输入输出处理
专业和班级 计算机184
实验组别 姓名 学号
同实验者 记录
实验时间 2021.5.7
成 绩 审阅教师
一、实验目的
1.理解流的概念;
2.掌握字符串常用操作方法;
3、掌握流的构造;
4、掌握文件流和对象的串行化;
5、掌握套接字在编程中的应用。
二、实验内容
1.编写程序,检查一个字符串是否是合法的密码,密码规则如下:
(1)密码必须至少包含6个字符;
(2)密码是只能包含数字和字母;
(3)密码必须至少两个数字。
2、编写程序统计一个文件中的字符数(控制符‘\r’和‘\n’除外),单词数以及行数。单词由空格,制表符,回车,或者换行符分隔,文件名应该作为命令行参数被传递。
3、编写程序,使用OutputStream对象向output.dat文件中写入10个10到20之间的随机数,然后使用InputStream对象从output.dat文件中读出这10个数并输出。
4、定义一个Circle类表示圆,在其中定义变量radius表示圆的半径,另外定义了4个方法,分别是设置和返回圆的半径、求圆的周长和面积。其中圆周率使用了java.lang.Math.PI常量。画出该类的UML图,并编写一个测试程序,设置圆的半径,调用Circle类的方法求得圆的周长和面积。
5、采用客户机/服务器模式,基于TCP协议编写程序,实现服务器端向客户端发送信息“Hello,world!”,客户端将服务器端发来的信息显示在标准输出上。
三、实验过程
1、编写程序,检查一个字符串是否是合法的密码。
(1)代码设计
package com.cad.task3; import java.util.Scanner; public class Password { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("输入密码: "); Scanner sc = new Scanner(System.in); String s = sc.nextLine(); if (isValidPassword(s)) { System.out.println("有效密码"); } else { System.out.println("无效密码"); } } /** Check if a string is a valid password */ public static boolean isValidPassword(String s) { // Only letters and digits? for (int i = 0; i < s.length(); i++) { if ((!Character.isLetter(s.charAt(i))) && !Character.isDigit(s.charAt(i))) return false; } // Check length if (s.length()< 6) return false; // Count the number of digits int count = 0; for (int i = 0; i < s.length(); i++) { if (Character.isDigit(s.charAt(i))) count++; } if (count >= 2) { return true; }else { return false; } } }
(2)运行结果
2、编写程序统计一个文件中的字符数(控制符‘\r’和‘\n’除外),单词数以及行数。
(1) 代码设计
package com.cad.task3; import java.io.*; public class Count { public static int words= 1; public static int lines = 1; public static int chars = 0; public static void wc(InputStream f)throws IOException { int c = 0; boolean lastNotWhite = false; String whiteSpace = " \n\r" ; while ((c = f.read())!=-1){ chars++; if (c=='\n'){ lines++; } if(whiteSpace.indexOf(c)!=-1){ if (lastNotWhite){ words++; } lastNotWhite = false; }else { lastNotWhite = true; } } } public static void main(String[] args) { InputStream f = null; try { if(args.length ==0) { f= new FileInputStream("dest.test"); wc(f); }else { for(int i =0;i<args.length;i++) { f = new FileInputStream(args[i]); wc(f); } } }catch (Exception e) { // TODO: handle exception } System.out.println(lines+"行,"+words+"个单词,"+chars+"个字符"); } }
(2)运行结果
3、编写程序,使用OutputStream对象向output.dat文件中写入10个10到20之间的随机数,然后使用InputStream对象从output.dat文件中读出这10个数并输出。
(1) 代码设计
package com.cad.task3; import java.io.*; public class NumberRead { public static void main(String[] args) { // TODO Auto-generated method stub FileOutputStream fos; FileInputStream fis; try { fos = new FileOutputStream("out.dat"); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream( bos); for(int i = 0;i < 10; i++){ int num = (int)(Math.random() * 11) + 10; System.out.println(num) ; dos.writeInt(num); } //out.dat文件中读出10个整数并排序 fis = new FileInputStream("out.dat" ); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); int data[] = new int[10]; for(int i= 0;i<10;i++){ data[i] = dis.readInt(); System. out. println(data[i]); } }catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
(2)运行结果
4、定义一个Circle类表示圆,在其中定义变量radius表示圆的半径,另外定义了4个方法,分别是设置和返回圆的半径、求圆的周长和面积。其中圆周率使用了java.lang.Math.PI常量。画出该类的UML图,并编写一个测试程序,设置圆的半径,调用Circle类的方法求得圆的周长和面积。
(1) 代码设计
package com.cad.task3; import java.util.Scanner; public class CircleTest { public static void main(String[] args) { System.out.println("请输入半径:"); Scanner sc = new Scanner(System.in); double radius = sc.nextDouble(); Circle circle = new Circle(radius); System.out.println("圆的周长:"+circle.perimeter()); System.out.println("圆的面积:"+circle.area()); } } class Circle { double radius; public Circle() { // TODO Auto-generated constructor stub } public Circle(double radius) { // TODO Auto-generated constructor stub this.radius =radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public double perimeter(){ return 2*Math.PI*radius; } public double area() { return Math.PI*(radius*radius); } }
(2)运行结果
UML图
5、采用客户机/服务器模式,基于TCP协议编写程序,实现服务器端向客户端发送信息“Hello,world!”,客户端将服务器端发来的信息显示在标准输出上。(在本机进行操作!)
(1) 代码设计
package com.cad.task3; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TCPClient { public static void main(String[] args) { InetAddress serverIP = null; Socket socket = null; OutputStream oStream = null; try { //客户端,获取IP地址 serverIP = InetAddress.getByName("127.0.0.1"); int port = 9999; //创建socket连接 socket = new Socket(serverIP, port); //发送消息IO流 oStream = socket.getOutputStream(); //getBytes()方法是得到一个操作系统默认的编码格式的字节数组。 oStream.write("Hello,world!".getBytes()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(oStream!=null) { try { oStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } package com.cad.task3; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class SeverClient { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; try { //目标地址 serverSocket = new ServerSocket(9999); //等待客户端连接过来 socket = serverSocket.accept(); //读取客户端信息 is = socket.getInputStream(); //管道流 baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while((len=is.read(buffer))!=-1) { baos.write(buffer, 0, len); } System.out.println(baos.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(baos!=null) { try { baos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(is!=null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(socket!=null) { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(serverSocket!=null) { try { serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
(2)运行结果
四、实验小结
本次实验我理解流的概念,掌握字符串常用操作方法,掌握流的构造;掌握文件流和对象的串行化,掌握套接字在编程中的应用。