实验内容
1、创建类TimerAlarm,让它继承Thread并实现一个秒表的功能,不要使用内置的Timer类,先按照时:分:秒打印时间,然后换一行打印总的秒数。
2、使用输入输出流,将文件words.txt 文件内容读出,然后以倒序的方式重新保存在新的文件newwords.txt里面,并为每个单词编号。如果在保存的时候newwords文件已经存在,应该产生FileFundException,并将其捕获处理。
程序源码
1
import java.util.Scanner;
public class TimerAlarm {
public static void main(String[] args) {
Timer t1 = new Timer(); //新建子线程
t1.start(); //启动线程
}
}
class Timer extends Thread{
Object lock = new Object();
int min=0,sec=0,hou=0;
int n; //用于返回秒数
boolean pause = false; //阻塞标志
void pauseThread() { //将阻塞信号开启
this.pause = true;
}
void show() { //打印总秒数
System.out.println(hou+":"+""+min+":"+sec);
int n=(hou*3600+min*60+sec);
System.out.print(" "+n+'\n');
}
void OnPause() { //阻塞方法
synchronized (lock) {
try {
lock.wait(); //阻塞线程方法
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run() {
super.run();
while (true) {
if (pause) {
OnPause();
}
try {
sec++;
show(); //每加一秒打印一次
if(sec==60) {sec=0;min++;} //60秒后,分钟加1,秒数清零
if(min==60){min=0;sec=0;hou++;}
//60分钟后,小时加1, 秒和分钟清零
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class InOut {
private static final String NUll = null;
//将null强制转换为String类,不抛出异常
public static void main(String[] args) throws IOException {
//throws是方法可能抛出异常的声明
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader("words.txt"));
bw = new BufferedWriter(new FileWriter("newwords.txt"));
ArrayList<String> list = new ArrayList<>(); //创建动态数组对象
String line;
while((line = br.readLine()) != NUll){
list.add(line); //向集合列表中添加对象
}
int j=1;
for(int i=list.size()-1 ;i>= 0 ;i--){
bw.write(j+"."); //写入每个单词的序号
bw.write(list.get(i)); //将单词以倒序的方式写入文件
bw.newLine(); //换行
j++;
}
bw.flush(); //刷新缓冲流
br.close(); //关闭文件
bw.close();
} catch (FileNotFoundException e) {
System.out.println("找不到指定文件!");
}catch (IOException e) {
e.printStackTrace(); //在命令行打印异常信息
}
}
}
程序运行结果
1
2
总结
第一问提到了线程阻塞。线程阻塞通常是指⼀个线程在执⾏过程中暂停,以等待某个条件的触发,可以不用占用CPU资源。
第二问没有太大难度,只要掌握对文件基本读写的方法和步骤就可以。还有就是一定要掌握文件处理过程中异常处理的方法,因为程序运行中可能出现各种意外情况,异常处理可以提高程序运行效率。