首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:如何从文本文件中只读取int数据来执行计算?

Java:如何从文本文件中只读取int数据来执行计算?
EN

Stack Overflow用户
提问于 2016-11-21 08:41:03
回答 2查看 253关注 0票数 1

我使用一个按钮将用户输入保存到文本文件中,现在我想检索它来进行计算。将更新文本文件并添加新值。下面是文本文件外观的示例:

  1. 星期一:1星期二:2星期三:3

...etc

当有一个新的输入时,它将被添加,因此更新的文本文件如下所示:

  1. 星期一:1星期二:2星期三:3
  2. 星期一:4日星期二:1星期三:3
  3. 星期一:6日星期二:5星期三:6
  4. 星期一:7星期二:6星期三:5

基本上,我想比较新的输入和前面的输入。如何仅从最新和最后的输入中检索所有整数?

还是我应该使用excel?

这是我的代码:

代码语言:javascript
复制
try (
    InputStream fs = new FileInputStream("data.txt");
    // not sure how to use the Charset.forname
    InputStreamReader isr = new InputStreamReader(fs, Charset.forName("UTF-8"));
    BufferedReader br = new BufferedReader(isr)) {
    for (String line1 = br.readLine(); line1 != null; line = br.readLine()) {
        comp = line1 - line2; //line1 being current line(4) and line2 being the previous(3)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-21 09:34:06

简单地说:

  1. 只保留2最后一行来读取您的文件,
  2. 然后使用正则表达式提取整数。

相应的代码:

代码语言:javascript
复制
try (
    InputStream fs = new FileInputStream("data.txt");
    InputStreamReader isr = new InputStreamReader(fs, StandardCharsets.UTF_8);
    BufferedReader br = new BufferedReader(isr)) {
    // Previous line
    String prev = null;
    // Last line
    String last = null;
    String line;
    while ((line = br.readLine()) != null) {
        prev = last;
        last = line;
    }
    // Pattern used to extract the integers
    Pattern pattern = Pattern.compile("\\d+");
    // Matcher for the previous line
    Matcher matcher1 = pattern.matcher(prev);
    // Matcher for the last line
    Matcher matcher2 = pattern.matcher(last);
    // Iterate as long as we have a match in both lines
    while (matcher1.find() && matcher2.find()) {
        // Value of previous line
        int val1 = Integer.valueOf(matcher1.group());
        // Value of last line
        int val2 = Integer.valueOf(matcher2.group());
        // Do something here
    }
}

NB:假设两行的整数数完全相同,否则可以比较不相关的值。

另一种方法是使用Java 8,您可以使用非整数作为分隔符,然后依赖splitAsStream(CharSequence input)将所有整数提取为List

代码语言:javascript
复制
...
// Non integers as a separators
Pattern pattern = Pattern.compile("\\D+");
// List of extracted integers in previous line
List<Integer> previous = pattern.splitAsStream(prev)
    .filter(s -> !s.isEmpty())
    .map(Integer::valueOf)
    .collect(Collectors.toList());
// List of extracted integers in last line
List<Integer> current = pattern.splitAsStream(last)
    .filter(s -> !s.isEmpty())
    .map(Integer::valueOf)
    .collect(Collectors.toList());
// Do something here
票数 1
EN

Stack Overflow用户

发布于 2016-11-21 12:06:05

  1. 对于插入/提取代码需要更清楚一点,它是由同一个进程/线程完成的吗?如果答案是肯定的,我将把请求的数据存储在一个变量中,这样可以节省一些访问文件和操作文件数据的时间。
  2. 如果插入是由另一个进程/线程完成的,您应该小心,因为存在读/写争用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40715885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档