Java新手,不喜勿喷,欢迎斧正!
1、简介:
练习IO流、ArrayList、StringBuffer,相关知识将本地的txt文档读取到内存,进行统一格式补零操作,然后根据txt文档中的内容进行分类,将分类完的内容拼接在新创建的文档中。
2、功能介绍:
将本地的grade文档读取到内存,然后将学号统一改成四位数(前补0),然后根据成绩分为:小于60,60-80,大于80 三类,然后分别写到三个文件里。
3、代码
3.1根据文档的内容创建studnet类
public class Student {
private String name;//学生名
private String studentNo;//学生学号
private String score;//学生获得的分数
public Student() {
super();
}
public Student(String name, String studentNo, String score) {
super();
this.name = name;
this.studentNo = studentNo;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", studentNo=" + studentNo + ", score=" + score + "]";
}
}
3.2、左补零的方法
public class AddZero {
public static void main(String[] args) {
//测试数据,传入一个长度为3的字符串,左补零改为长度为5
System.out.println(AddZeroNumber("123", 5));
}
public static String AddZeroNumber(String str, int len) {
// 获取传入的字符串长度
int strLen = str.length();
// 如果字符串长度和需要的长度相等,直接返回
if (strLen == len)
return str;
// 创建一个可变字符串
StringBuffer sb = new StringBuffer();
if (strLen < len) {
// 定义计数器:循环加零的次数
int count = len - strLen;
while (count > 0) {
sb.append("0");
--count;
}
// 把字符串拼在零的后面
sb.append(str);
}
return sb.toString();
}
}
3.3、主要代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
public class Grade {
public static void main(String[] args) throws IOException {
// 输入到内存的路径
String gradePath = "D:\\Test\\8.grade.txt";
// 从内存输出的路径
String failPath = "D:\\Test\\8.fail.txt";// 该文件保存成绩不及格的名单: <60
String passPath = "D:\\Test\\8.pass.txt";// 该文件保存成绩及格的名单: >=60
String goodPath = "D:\\Test\\8.good.txt";// 该文件保存成绩优秀的名单: >=80
// 定义一个判尾的标识
int flag = 0;
// 提升作用域方便在finally中关闭资源
InputStreamReader inputStreamReader = null;
OutputStreamWriter outputStreamWriterFail = null;
OutputStreamWriter outputStreamWriterPass = null;
OutputStreamWriter outputStreamWriterGood = null;
ArrayList<Student> arr = new ArrayList<Student>();
try {
// 创建对象
inputStreamReader = new InputStreamReader(new FileInputStream(gradePath), "UTF-8");
outputStreamWriterFail = new OutputStreamWriter(new FileOutputStream(failPath), "UTF-8");
outputStreamWriterPass = new OutputStreamWriter(new FileOutputStream(passPath), "UTF-8");
outputStreamWriterGood = new OutputStreamWriter(new FileOutputStream(goodPath), "UTF-8");
// 创建字节数组,提高存取效率
char[] b = new char[1024];
// 循环写入内存
while ((flag = inputStreamReader.read(b)) != -1) {
// 将读取到的字符赋给字符串s
String s = new String(b);
// 将字符串s按照回车分割,得到 以行为单位的 str 字符数组
String[] str = s.split("\r\n");
// 因为第一行标题每个文件都需要,在这里直接把读出来的第一行标题内容分别写到文件
outputStreamWriterFail.write(str[0].toCharArray());
outputStreamWriterFail.append("\n");
outputStreamWriterPass.write(str[0].toCharArray());
outputStreamWriterPass.append("\n");
outputStreamWriterGood.write(str[0].toCharArray());
outputStreamWriterGood.append("\n");
// 循环str数组进行具体操作
for (int i = 0; i < str.length - 1; i++) {
// 创建学生类对象
Student student = new Student();
// 将str数组中的每个元素,按照 , 分割 分割完存入到s1字符数组
String[] s1 = str[i].split(",");
// s1数组的第一个元素就是姓名
String name = s1[0];
// s1数组的第三个元素就是分数
String score = s1[2];
// s1数组的第二个元素就是学号,这里进行判断,第一行标题不用左加0
String studentNo;// 先声明变量,扩大作用域
if (i == 0) {
studentNo = s1[1];
} else {
studentNo = AddZero.AddZeroNumber(s1[1], 4);
}
// 给对象设置属性值
student.setName(name);
student.setStudentNo(studentNo);
student.setScore(score);
// 将添加arrayList动态数组
arr.add(student);
}
// 从内存中输出到文件
for (int i = 1; i < arr.size(); ++i) {
String[] s1 = str[i].split(",");
int numbers = Integer.parseInt(s1[2]);
if (numbers < 60) {
outputStreamWriterFail.write(arr.get(i).getName() + "," + arr.get(i).getStudentNo() + ","
+ arr.get(i).getScore() + "\n");
}
if (numbers >= 60 && numbers < 80) {
outputStreamWriterPass.write(arr.get(i).getName() + "," + arr.get(i).getStudentNo() + ","
+ arr.get(i).getScore() + "\n");
}
if (numbers > 80) {
outputStreamWriterGood.write(arr.get(i).getName() + "," + arr.get(i).getStudentNo() + ","
+ arr.get(i).getScore() + "\n");
}
}
for (Student student : arr) {
System.out.println(student.getName() + "," + student.getStudentNo() + "," + student.getScore());
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStreamReader != null)
inputStreamReader.close();
if (outputStreamWriterFail != null)
outputStreamWriterFail.close();
if (outputStreamWriterPass != null)
outputStreamWriterPass.close();
if (outputStreamWriterGood != null)
outputStreamWriterGood.close();
}
}
}
4、运行结果