从流开始的IO世界生活(三)

一、集合到文件

将ArrayList集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据

集合到文件(改进版)

需求:把ArrayList集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据

格式:学号,姓名,年龄,居住地

二、文件到集合

需求:把文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素

文件到集合(改进版)

需求:把文本文件的数据读取到集合中,并遍历集合

要求:文件中每一行数据是一个学生对象的成员变量值

三、案例

①随机点名

需求:有一文件里存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随机点名器

思路:

  1. 创建字符缓冲输入流对象
  2. 创建ArrayList集合对象
  3. 调用字符缓冲输入流对象的方法读取数据
  4. 将读取的字符串数据存在集合中
  5. 释放资源
  6. 使用Random昌盛一个随机数范围在[0,集合.size())
  7. 将随机数作为索引到集合中获取值
  8. 将数据输出

②集合到文件(数据排序改进)

需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求:按照成绩总分从高到低写入文本文件

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
58
59
60
61
package tree_;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.security.KeyStore.Builder;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

public class demo {
public static void main(String[] args) throws IOException{
TreeSet<Student> tree=new TreeSet<Student>(new Comparator<Student>() {

@Override
public int compare(Student s1, Student s2) {
//主要条件
int num=s2.Sum()-s1.Sum();
//次要条件
int num2=num==0?s2.getChinese_Score()-s1.getChinese_Score():num;
int num3=num2==0?s2.getMath_Score()-s1.getMath_Score():num2;
int num4=num3==0?s2.getName().compareTo(s1.getName()):num3;//当成绩完全一样时判断姓名
return num4;
}
});
boolean flag=true;
while(flag){
Scanner sc=new Scanner(System.in);
Student s=new Student();

System.out.println("请按照格式输入学生姓名与成绩:“姓名 ,语文成绩,数学成绩,英语成绩”");
String str=sc.nextLine();
String[] str_=str.split(",");
s.setName(str_[0]);
s.setChinese_Score(Integer.parseInt(str_[1]));
s.setMath_Score(Integer.parseInt(str_[2]));
s.setEnglish_Score(Integer.parseInt(str_[3]));
tree.add(s);
System.out.println("输入指令是否继续录入学生信息?");
System.out.println("1.继续输入");
System.out.println("2.停止输入");
int zhiling=sc.nextInt();
if(zhiling==1){
flag=true;
}else if(zhiling==2){
flag=false;
}else{
System.out.println("输入有误");
}
}
BufferedWriter bw=new BufferedWriter(new FileWriter("stu.txt"));
for(Student stu:tree){
StringBuilder sb=new StringBuilder();
sb.append(stu.getName()).append("语文:").append(stu.getChinese_Score()).append(",数学:")
.append(stu.getMath_Score()).append(",英语:").append(stu.getEnglish_Score()).append(",总分:").append(stu.Sum());
bw.write(sb.toString());
bw.newLine();
}
bw.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package copy;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class demo1 {
public static void main(String[] args) throws IOException{
File f=new File("D:/IO/复制单级文件夹");
//获取数据源目录file对象的名称("复制单级文件夹")
String srcname=f.getName();
//获取目的地目录对象("D:/IO/my")
File myf=new File("D:/IO/my");
//判断文件夹是否存在
if(!myf.exists()){
System.out.println(myf.mkdir());
}

//获取数据源目录下所有file数组
File[] filearr=f.listFiles();
for(File file:filearr){
//获取数据源文件对象名称(mn.jpg)
String srcFilename=file.getName();
//创建目的地文件对象("D:/IO/my/mn.jpg")
File destFile=new File(myf,srcFilename);
//复制文件
copyFile(file,destFile);
}
}
public static void copyFile(File file,File destFile) throws IOException{
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));
int len;
byte[] by=new byte[1024];
while((len=bis.read(by))!=-1){
bos.write(by,0,len);
}
bis.close();
bos.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
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
58
59
60
package copy;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class demo2 {
public static void main(String[] args) throws IOException {
File originFileTemp=new File("D:/IO/复制多级文件夹");
//复制多级文件夹
String originFileName=originFileTemp.getName();
File goalFileName=new File("D:/IO/florence");
if(!goalFileName.exists()){
goalFileName.mkdir();
}
FilePath(goalFileName,originFileTemp);


}
//复制文件夹
private static void FilePath(File goalFileName,File originFileTemp) throws IOException {
File[] f=originFileTemp.listFiles();
for(File file:f){//访问所有父目录下的内容
System.out.println(file);
String ziFileTempName=file.getName();
//D:/IO/florence/mn.jpg或yolin
File ziTemp=new File(goalFileName, ziFileTempName);
if(file.isDirectory()){//如果是文件夹
if(!ziTemp.exists()){//目录不存在
ziTemp.mkdir();
}
FilePath(ziTemp,file);//递归
}else{
//如果是文件调用copy方法
copy(ziTemp,file);
}
}
}
//字节缓冲流复制文件
public static void copy(File ziTemp,File f) throws IOException{
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(f));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(ziTemp));
byte[] by=new byte[1024];
int len;
while((len=bis.read(by))!=-1){
bos.write(by);
}
bis.close();
bos.close();

}

}

请我喝杯咖啡吧~

支付宝
微信