Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何从文本文件中只读取int数据来执行计算?_Java_File_Text_Bufferedreader_Stringreader - Fatal编程技术网

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

Java:如何从文本文件中只读取int数据来执行计算?,java,file,text,bufferedreader,stringreader,Java,File,Text,Bufferedreader,Stringreader,我使用一个按钮将用户输入保存到一个文本文件中,现在我想检索它来进行计算。 将更新文本文件并添加新值。 以下是文本文件外观的示例: 星期一:1星期二:2星期三:3 …等等 当有新的输入时,它将被添加,所以 更新后的文本文件如下所示: 星期一:1星期二:2星期三:3 星期一:4星期二:1星期三:3 星期一:6星期二:5星期三:6 星期一:7星期二:6星期三:5 基本上我想比较新的输入和以前的输入。 如何仅从最新和最后一次输入中检索所有整数 还是我应该使用excel 这是我的密码: try (

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

  • 星期一:1星期二:2星期三:3
  • …等等

    当有新的输入时,它将被添加,所以 更新后的文本文件如下所示:

  • 星期一:1星期二:2星期三:3
  • 星期一:4星期二:1星期三:3
  • 星期一:6星期二:5星期三:6
  • 星期一:7星期二:6星期三:5
  • 基本上我想比较新的输入和以前的输入。 如何仅从最新和最后一次输入中检索所有整数

    还是我应该使用excel

    这是我的密码:

    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)
        }
    }
    
    简单地说:

  • 只保留最后两行来读取文件
  • 然后使用正则表达式提取整数
  • 相应的代码:

    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:假设两行中的整数数完全相同,否则可以比较不相关的值


    另一种方法是,如果使用Java8,则可以使用非整数作为分隔符,然后依靠将所有整数提取为
    列表

    ...
    // 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
    
    。。。
    //作为分隔符的非整数
    Pattern=Pattern.compile(\\D+);
    //前一行中提取的整数列表
    List previous=模式.分割流(prev)
    .filter(s->!s.isEmpty())
    .map(整数::valueOf)
    .collect(Collectors.toList());
    //最后一行中提取的整数列表
    List current=pattern.splitAsStream(最后一个)
    .filter(s->!s.isEmpty())
    .map(整数::valueOf)
    .collect(Collectors.toList());
    //在这里做点什么
    
  • 关于插入/提取代码需要更清楚一点,它是由相同的进程/线程完成的。如果答案是肯定的,我会将请求的数据存储在一个变量中,这样可以节省一些访问文件和处理其数据的时间

  • 如果插入是由另一个进程/线程完成的,您应该更加小心,因为存在读/写竞争


  • 你确定你粘贴的代码是正确的吗?最新的标准是什么?@TimothyTruckle最新的是第4行,最后一行是第3行,但是任何程序在读取文件时怎么知道这一点?