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)运行结果

Java 设置密码 JAVA设置密码只有三次机会_Java 设置密码

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)运行结果

Java 设置密码 JAVA设置密码只有三次机会_System_02

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)运行结果

Java 设置密码 JAVA设置密码只有三次机会_Java 设置密码_03

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)运行结果

Java 设置密码 JAVA设置密码只有三次机会_Java 设置密码_04

UML图

Java 设置密码 JAVA设置密码只有三次机会_Java 设置密码_05

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)运行结果

Java 设置密码 JAVA设置密码只有三次机会_客户端_06

四、实验小结
本次实验我理解流的概念,掌握字符串常用操作方法,掌握流的构造;掌握文件流和对象的串行化,掌握套接字在编程中的应用。