Java读写文件

这篇博客是Java新手的学习记录,主要内容是使用IO流和ArrayList读取本地txt文件,将学号进行统一的四位数补零操作,并依据成绩分为三类,将结果写入不同的文件。
摘要由CSDN通过智能技术生成

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、运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sout快乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值