Android(Java)内部存储文件追加写入、读取及日期差值计算问题
Android 内部存储实现日期追加存储与读取方案
一、追加写入日期到内部存储
要实现多次追加数据,核心是使用Context.MODE_APPEND模式打开文件输出流,同时建议每个日期单独占一行,方便后续逐行读取。这样每次写入新日期时,会自动追加到文件末尾,不会覆盖原有内容。
代码示例:
// 保存日期到内部存储 private void saveDate(String dateStr) { // 先检查现有日期数量,最多存200个 List<String> existingDates = readAllDates(); if (existingDates.size() >= 200) { // 超过上限,停止写入 return; } try (FileOutputStream fos = openFileOutput("dates.txt", Context.MODE_APPEND); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw)) { // 写入日期+换行符,确保每行一个日期 bw.write(dateStr); bw.newLine(); } catch (IOException e) { e.printStackTrace(); } }
二、逐个读取存储的日期
通过BufferedReader逐行读取文件内容,将每个日期字符串存入List,后续可直接用这个列表进行差值计算。
代码示例:
// 读取所有存储的日期 private List<String> readAllDates() { List<String> dateList = new ArrayList<>(); try (FileInputStream fis = openFileInput("dates.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr)) { String line; // 逐行读取,直到文件末尾 while ((line = br.readLine()) != null) { if (!line.trim().isEmpty()) { // 跳过空行 dateList.add(line.trim()); } } } catch (IOException e) { // 文件不存在时初始化空列表即可 e.printStackTrace(); } return dateList; }
三、日期差值计算示例
推荐使用Java 8引入的java.time包(Android API 26+支持,低版本可通过Desugar兼容),解析日期字符串后直接计算天数差。
代码示例:
// 计算两个日期的天数差 private long calculateDateDiff(String dateStr1, String dateStr2) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { LocalDate date1 = LocalDate.parse(dateStr1, formatter); LocalDate date2 = LocalDate.parse(dateStr2, formatter); // 返回两个日期的天数差(绝对值) return Math.abs(ChronoUnit.DAYS.between(date1, date2)); } catch (DateTimeParseException e) { e.printStackTrace(); return -1; // 解析失败返回错误标识 } }
关键注意事项
- 统一日期格式:DatePicker获取日期后,务必转换为固定格式(如
yyyy-MM-dd)再存储,避免解析时出错。 - 上限控制:写入前先读取现有日期数量,确保不超过200个的限制。
- 异常处理:文件操作可能抛出IO异常,需做好捕获和处理,避免崩溃。
内容的提问来源于stack exchange,提问作者Chig Bungus
相关产品推荐
相关产品推荐

