怀德学院
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)运行结果
四、实验小结
本次实验我理解流的概念,掌握字符串常用操作方法,掌握流的构造;掌握文件流和对象的串行化,掌握套接字在编程中的应用。