Java-文件操作与多线程编程基础

Java 文件操作与多线程编程基础

文件操作部分题目

1.实现一个程序,该程序的输人是一个目录字符串和一个文件扩展名字符串,程序递归地搜索该目录及其各级子目录,在这些目录中查找所有扩展名与指定扩展名相同的文件,将这些文件的相对路径名记录下来并向控制台输出。
2.实现两个程序,第一个程序读入一个文件plain.txt将读入的每个字节的数值加5,然后输出到另一个文件cipher.ixt中,第二个程序从cipher.txt中读取每个字节,将每个字节的数值减5.再输出到文件decrypt.txt中。比较plain.txt与decrypt.txt的内容。

多线程操作部分题目

1.在很多系统中,需要日志管理功能,该功能通常可由一个类实现,在系统生命周期中,日志管理类仅存在一一个对象实例,实现将各个功能线程的日志写入日志文件的功能。
要求:
(1)实现日志管理类Loger, 实现向唯一的日志文件写人日志的功能,并使用Singeleton设计模式实现在系统生命周期中仅存在该类的唯一对象实例。
(2)实现多个功能线程,各个线程排他性地使用日志管理对象的日志写入功能,每隔一段随机的时间就执行写入日志动作。 系统终止时观察被写入的日志文件。


文件操作部分题目代码

题目一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.File;
public class homework8_2{
public static void filedata(File f,String s,int len){
if(f.isFile())//判断是否是目录
{
System.out.println(f+"is a file");
}
else{
File[] files=f.listFiles();
for(File file:files){
if(file.isFile()){
String fileName = file.getName();
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);//截取文件后缀
if(suffix.equals(s)){
System.out.println(fileName + " : .\\" +file.getPath().substring(len+1));//获取相对路径
}
}
else{
filedata(file,s,len);
}
}
}
}
public static void main(String[] args) {
File file = new File(args[0]);//此处需要输入第一个命令行参数,需要输入需要查找的目录
String s = args[1];//此处需要输入第一个命令行参数,需要输入想要查找的文件后缀
int len = file.getPath().length();
filedata(file,s,len);
}
}

运行结果

1
2
3
4
5
6
7
8
测试文件的目录树为:
C:.
└─test1
└─test2
代码运行结果为:
1.txt : .\1.txt
2.txt : .\test1\2.txt
3.txt : .\test1\test2\3.txt

题目二

程序一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.*;
public class homework8_7_1{
public static void filedata(FileInputStream plain) throws IOException{
FileOutputStream cipher0 = new FileOutputStream("cipher.txt");
int c;
while((c = plain.read()) != -1){
cipher0.write(c+5);
}
cipher0.close();
}
public static void main(String[] args) throws IOException{
FileInputStream plain = new FileInputStream(args[0]);//程序需要输入一个命令行参数,代表储存明文文件的绝对路径或者相对路径
filedata(plain);
System.out.println("Success! ");
plain.close();
}
}

程序二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.*;
public class homework8_7_2{
public static void filedata(FileInputStream plain) throws IOException{
FileInputStream cipher1 = new FileInputStream("cipher.txt");
FileOutputStream decrypt = new FileOutputStream("decrypt.txt");
int c;
String str0 = "";
String str1 = "";
while((c = plain.read()) != -1){
str0 += c;
}
while((c = cipher1.read()) != -1){
decrypt.write(c-5);
str1 += (c-5);
}
if (str0.equals(str1))//把两文件内容读入一个字符串,使用字符串比较来实现,遇到大文件可能速率较慢,可以采用md5
System.out.println("plain.txt is equal to decrypt.txt");
cipher1.close();
decrypt.close();
}
public static void main(String[] args) throws IOException{
FileInputStream plain = new FileInputStream(args[0]);//程序需要输入一个命令行参数,代表储存明文文件的绝对路径或者相对路径
filedata(plain);
System.out.println("Success! ");
plain.close();
}
}

运行结果

1
2
3
4
5
程序一运行结果:
Success!
程序二运行结果:
plain.txt is equal to decrypt.txt
Success!


多线程编程部分

题目一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.io.*;
import java.lang.*;
import java.util.Random;
public class homework10_6{
static final Logger log;
static final Random rand;
static String file;
static{
log = new Logger();
rand = new Random(System.currentTimeMillis());
}
public static void main(String[] args) {
file = args[0];//此处需要一个命令行参数,代表那个日志的绝对路径或者相对路径
for(int i=1;i<=10;i++)//启动十个线程
{
new Thread(new thread()).start();
}
}
}
class Logger {
public void writeinformation(int a,String s) throws IOException{
FileOutputStream file = new FileOutputStream(homework10_6.file,true);//启用追加模式
String e = System.currentTimeMillis()+" by thread "+ s +" and this thread delayed " + thread.intArray[a] + " s\n";
for(int i = 0;i < e.length();i++)//遍历字符写入
{
int c = (int)e.charAt(i);
file.write(c);
}
file.close();
}
}
class thread implements Runnable{
private static int idcnt = 1;
private final int threadid = idcnt++;
static int[] intArray = new int[10];//保存每个线程时延时间
public void run(){
System.out.println("Thread "+ threadid +" create successfully");
try{
int time = homework10_6.rand.nextInt(3);//生成[0,3)的随机数
intArray[threadid-1] = time;
Thread.sleep(time*1000);//sleep
}catch(Exception e){
e.printStackTrace();
}
synchronized(homework10_6.log)//给日志对象加对象锁
{
String p = threadid+"";
int i = threadid-1;
try{
homework10_6.log.writeinformation(i,p);
}
catch (IOException e){
e.printStackTrace();
}
}
}
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Thread 1 create successfully
Thread 6 create successfully
Thread 5 create successfully
Thread 2 create successfully
Thread 4 create successfully
Thread 3 create successfully
Thread 10 create successfully
Thread 7 create successfully
Thread 8 create successfully
Thread 9 create successfully
日志文件里为:
1573572136785 by thread 1 and this thread delayed 0 s
1573572136796 by thread 10 and this thread delayed 0 s
1573572136797 by thread 7 and this thread delayed 0 s
1573572136803 by thread 9 and this thread delayed 0 s
1573572137790 by thread 2 and this thread delayed 1 s
1573572137794 by thread 3 and this thread delayed 1 s
1573572137798 by thread 8 and this thread delayed 1 s
1573572138789 by thread 5 and this thread delayed 2 s
1573572138791 by thread 6 and this thread delayed 2 s
1573572138792 by thread 4 and this thread delayed 2 s

文章目录
  1. 1. Java 文件操作与多线程编程基础
    1. 1.1. 文件操作部分题目
    2. 1.2. 多线程操作部分题目
    3. 1.3. 文件操作部分题目代码
      1. 1.3.1. 题目一
      2. 1.3.2. 题目二
    4. 1.4. 多线程编程部分
      1. 1.4.1. 题目一
,