Java: txt文件的读写以及相对日期的计算

txt文件的读写以及相对日期的计算

题目描述

前几天字节面试时碰到了一道算法题。其中在数据预处理部分,需要从一个日志文件(txt文件)中把关键信息读进来,同时需要对其中的日期部分作进一步的特殊处理。

举例来讲,就是要把text.txt转换成dest.txt中的格式(三列分别代表日期、用户名、在线状态)。即要把日期映射成从0开始的整数(第一个日期为0),便于后续的算法实现。

//text.txt
2019-01-02 user1 0
2019-01-03 user1 1
2019-01-04 user1 1
2019-01-05 user1 1
// dest.txt
0 user1 0
1 user1 1
2 user1 1
3 user1 1

解决方法

当然现场写一个求相对日期的代码是比较困难的。幸好,java中的SimpleDateFormat工具类能将字符串格式化的日期转换成Date类,之后就能利用Date里的getTime()方法计算与起始日期的相对时间。
另外,txt文件的读和写可以利用BufferedReader和BufferedWriter来实现

Java源代码
为了演示代码看起来更简洁一点,代码中可能会抛出的各种异常统一用Exception来表示。
另外,代码中的文件路径是本人电脑上的全路径。

import java.io.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class FileReaderTest {
    public static void show_text(String path) throws Exception {
        //创建一个二维数组来保存text.txt文件中的内容
        ArrayList<List<String>> arrs = new ArrayList<List<String>>();

		//逐行读取text文件中的内容并保存到arrs中
		File file = new File(path);
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String s;
        while ((s = bufferedReader.readLine()) != null) {
            //System.out.println(s);
            //将当前行的字符串按照 空格 分隔,并将得到的tmp数组转成list类型 存入arrs中
            String[] tmp = s.split(" "); 
            arrs.add(Arrays.asList(tmp));
        }
        //关闭流
        bufferedReader.close();

		//开始计算相对日期 
        String start_time = arrs.get(0).get(0); //起始时间
        //yyyy代表年份 MM(两个数字表示的月份)代表月份 dd(两个数字表示的几号)代表几号 横杠"-"就是text.txt中的"-"
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date d = df.parse(start_time);
        
		//用来存放解析后的内容
        ArrayList<String> content = new ArrayList<String>();
        for (List<String> arr: arrs) {
            String time = arr.get(0);
            Date d1 = df.parse(time) ;
            long diff = d1.getTime() - d.getTime(); //ms
            int logIn = Integer.parseInt(arr.get(2));
            // diff的单位是毫秒ms 为了得到天数 需要除以1000 再除以(24 * 3600),最终得到的就是相差的天数
            //将三列的内容进行拼接,末尾的"\n"为了能在dest.txt文件中实现 换行 的效果
            String line = String.valueOf(diff / (1000 * 24 * 3600)) + " " + arr.get(1) + " " + logIn + "\n";
            content.add(line);
        }

		//将content中的内容逐行读入到dest.txt文件中
        File file1 = new File("D:\\IdeaProjects\\design-pattern\\src\\main\\resources\\dest.txt");
        BufferedWriter bfw = new BufferedWriter(new FileWriter(file1));
        for (String line: content) {
            bfw.write(line);
            bfw.flush();
        }
        bfw.close();
    }
    
    public static void main(String[] args) throws Exception {
        show_text("D:\\IdeaProjects\\design-pattern\\src\\main\\resources\\text.txt");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值