Java课程实验报告实验七——字符串和文本I/O

一、实验目的

1.String类中处理字符串方法的使用
2.从命令行传递参数给main方法的编程及运行
3.文件类及文件输入输出

二、实验内容

1.【检测密码】一些网站设定了一些指定密码的规则。编写一个方法,检测一个字符串是否是合法的密码。假定密码规则如下:
1)密码必须至少有8个字符。
2)密码只能包括数字和字母。
3)密码必须至少有2个数字。
编写一个程序,提示用户输入密码,如果该密码符合规则就显示“Valid Password”,否则显示“Invalid Password”。

2.【统计一个字符中的字符数、单词数和行数】编写程序统计一个文件中的字符数(控制字符\r和\n除外)、单词数以及行数。单词由空格、Tab、回车或换行符分隔。文件名作为命令行参数传递。如下图所示:【注意:此题请同时上交.java和.class文件以便测试】
Java课程实验报告实验七——字符串和文本I/O_第1张图片
3.【读写数据】编写一个程序,如果名为Exercise9_19.txt的文件不存在,则创建该文件。使用文本I/O编写随机产生10个整数给文件。文件中的整数由空格分开。从文件中读回这些数据,然后显示排好序的数据。

三、实验要求:
要求每个学生独立完成实验任务。

四、实验报告
1.实验结果与分析
(1)检测密码

A)实验运行
根据提示输入密码内容
当密码内容小于8字符,里面不只含有字母与数字,数字个数小于2时均返回Invalid Password
Java课程实验报告实验七——字符串和文本I/O_第2张图片
当密码内容正确时返回Valid Password
在这里插入图片描述
B)结果分析与实验思路
本题考查String字符串的使用
首先实现isValid函数,传入String类型的密码文本,定义判断变量jud,首先用s.length() 方法判断字符串长度,若字符串长度小于8则判断为false,设置数字计数器并初始化,然后用for循环搭配charat函数遍历字符串,判断是否是字母或数字,如果是数字的话给数字计数器加一,如果非字符非数字则判断为false,最后判断数字个数,如果小于2判断为false,如果false则输出“Invalid Password”,如果是true则输出“Valid Password”;

for(int i= 0; i <s.length();i++){
	if(!Character.isDigit(s.charAt(i)) && !Character.isLetter(s.charAt(i)))jud = false;
	if(Character.isDigit(s.charAt(i)))count++;
}
if(count < 2)jud = false;
if(jud)System.out.println("Valid Password");
else if(!jud)System.out.println("Invalid Password");

再在main函数中实现输入字符串即可。

(2)统计
A)实验运行
根据题目要求使用命令行
首先调到java文件下
Java课程实验报告实验七——字符串和文本I/O_第3张图片然后使用命令行参数传入文件名称,若文件存在进行统计,若文件不存在跳出提示
Java课程实验报告实验七——字符串和文本I/O_第4张图片
(附根目录截图与文本截图)
Java课程实验报告实验七——字符串和文本I/O_第5张图片
Java课程实验报告实验七——字符串和文本I/O_第6张图片
B)结果分析与实验思路
本题考查File类与文本I//O相关知识点
首先看到题目要求中有命令行参数要求,将传入的参数名改成args[0]即为命令行参数的使用

File file = new File(args[0]);

然后进行main函数实现,首先注意异常的抛出

public static void main(String[] args) throws IOException 

原因是在PrintWriter与Scanner处理文件内容时可能会抛出某种I/O异常,且这种异常属于必检异常,因此要进行抛出或者处理,在这里我们选择抛出。
然后判断是否存在文件:如果存在进行处理,不存在进行提示,这里使用file.exists()函数进行处理,然后在存在情况下设置三个计数器,分别对应字母数,单词数,行数;
下面是重点内容:
首先用scanner.hasNextLine()方法判断是否还存在未扫描文本行,如果有,行计数器加一,同时对这行的内容进行单词扫描,这里使用scanner2.next()方法(注:除了Line方法读取一行外,其余next方法均使用令牌读取法),如果有下面内容则单词计数器加一,再Character.isLetter(c.charAt(i))遍历对单词里面的字母数进行计数,这样就可以实现对这三类文本的计数。

while(scanner.hasNextLine()){
			numOfLine++;
				String c = scanner.nextLine();
				Scanner scanner2 = new Scanner(c);
				while(scanner2.hasNext()){
					String string = scanner2.next();
					numOfWord++;
					for(int i = 0;i < string.length();i++){
						if(Character.isLetter(c.charAt(i))){
							numOfLetter++;
}}}}

最后进行内容输出即可。

(3)读写数据
A)实验运行
直接回车返回结果:
Java课程实验报告实验七——字符串和文本I/O_第7张图片
B)结果分析与实验思路
本题考查随机数,文本I/O,数组类排序等相关知识点
首先注意异常的抛出

public static void main(String[] args) throws IOException 

然后根据文本创建和写入方法进行设置
先File类实例创建一个文件,然后PrintWriter类实例修改这个文件,遍历十次输入随机数字(调用Random类实例)并使用print方法写入,最后关闭PrintWriter。

File file = new File("Exercise9_19.txt");
PrintWriter printWriter = new PrintWriter(file); 
Random random = new Random();
for(int i = 0 ; i < 10 ; i++){
	printWriter.print(random.nextInt(500) + " ");
}
printWriter.close();

这种文本相关方法是一种套路。
然后创建Scanner实例和数字数组,遍历文件内文本并用scanner.nextInt()方法将数字扫描到数组中;
最后一步使用Arrays.sort(num)方法对数组排序输出即可。

2.心得体会
题目的难度在随着知识点的深入而以可感受到的方式进行增长,这次的实验在几处犯了难:
首先是第二题中对三类文本的计数,对单词计数的同时对字母计数是比较容易实现的,但同时对行计数比较困难,最开始的思路是对回车符进行计数,如果有回车则计数器加一,但调用API查找相关方法后发现这种思路很难实现(至少在我的目前知识体系下很难实现),查找next()与nextLine()方法的异同点后想到了一行行的进行读取判断的方法;在第三题中最开始想用hasNextInt方法进行判断,但因为next相关方法的特点始终只能读取最后一个元素,分析过后发现这道题不像书中的例子一样需要判断,在Scanner的nextInt()方法实现过程中就包含了对数字有无的判断,最终果断舍弃,试验成功。
这次的实验让我对文本I/O的使用有了进一步的提高,在debug的过程中也学到了一些小技巧,总的来说是一次很成功的实验。

【题目一】
import java.util.Scanner;

public class Password {
	public static void isValid(String s){
		boolean jud = true;
		if(s.length() < 8)jud = false;
		int count = 0;
		for(int i= 0; i <s.length();i++){
			if(!Character.isDigit(s.charAt(i)) && !Character.isLetter(s.charAt(i)))jud = false;
			if(Character.isDigit(s.charAt(i)))count++;
		}
		if(count < 2)jud = false;
		if(jud)System.out.println("Valid Password");
		else if(!jud)System.out.println("Invalid Password");
	}
	public static void main(String[] args) {
		String string = new String();
		Scanner input = new Scanner(System.in);
		System.out.println("请输入需要测试的密码: ");
		string = input.nextLine();
		isValid(string);
	}
}
【题目二】
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Count {
	public static void main(String[] args) throws IOException {
		File file = new File(args[0]);
		if(file.exists()){
		Scanner scanner = new Scanner(file);
		int numOfLetter = 0;
		int numOfWord = 0;
		int numOfLine = 0;
		while(scanner.hasNextLine()){
			numOfLine++;
				String c = scanner.nextLine();
				Scanner scanner2 = new Scanner(c);
				while(scanner2.hasNext()){
					String string = scanner2.next();
					numOfWord++;
					for(int i = 0;i < string.length();i++){
						if(Character.isLetter(c.charAt(i))){
							numOfLetter++;
					}
				}
			}
		}
		
		System.out.println("File "+file.getName()+" has");
		System.out.println(numOfLetter + " Characters");
		System.out.println(numOfWord + " Words");
		System.out.println(numOfLine + " Lines");
		}
		else{
			System.out.println("您的请求文件不存在,请重新输入");
		}
	}
}
【题目三】
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Reading {
		public static void main(String[] args) throws IOException {
		File file = new File("Exercise9_19.txt");
		PrintWriter printWriter = new PrintWriter(file); 
		Random random = new Random();
		for(int i = 0 ; i < 10 ; i++){
			printWriter.print(random.nextInt(500) + " ");
		}
		printWriter.close();
		Scanner scanner = new Scanner(file);
		int[] num = new int[10];
		for(int i =0; i < 10;i++){
			num[i] = scanner.nextInt();
		}
		Arrays.sort(num);
		for(int j = 0;j < 10;j++){
			System.out.println(num[j]);
		}
	}
}

你可能感兴趣的:(Java)