Java: 如何从文本文件中只读取int数据进行计算?
Java: How to read only int data from text file to perform calculation?
我使用按钮将用户输入保存到文本文件,现在我想检索它来进行计算。
更新文本文件并添加新值。
这是文本文件的外观示例:
- 星期一: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)
}
}
简单:
- 通过仅保留 2 最后行、
来读取您的文件
- 然后使用正则表达式提取整数。
对应代码:
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
}
}
注意: 这假设我们在两行中有完全相同数量的整数,否则你可以比较不相关的值。
另一种方法,如果您使用 Java 8,您可以使用 非整数 作为分隔符,然后依赖 splitAsStream(CharSequence input)
将所有整数提取为 List
:
...
// 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
关于 insert/extract 代码需要更清楚一点,它是由相同的 process/thread 完成的吗?如果答案是肯定的,我会将请求的数据存储在一个变量中,这样您可以节省一些访问文件和操作其数据的时间。
如果插入是由另一个 process/thread 完成的,您应该更加小心,因为有一个 read/write 比赛。
我使用按钮将用户输入保存到文本文件,现在我想检索它来进行计算。 更新文本文件并添加新值。 这是文本文件的外观示例:
- 星期一: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)
}
}
简单:
- 通过仅保留 2 最后行、 来读取您的文件
- 然后使用正则表达式提取整数。
对应代码:
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
}
}
注意: 这假设我们在两行中有完全相同数量的整数,否则你可以比较不相关的值。
另一种方法,如果您使用 Java 8,您可以使用 非整数 作为分隔符,然后依赖 splitAsStream(CharSequence input)
将所有整数提取为 List
:
...
// 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
关于 insert/extract 代码需要更清楚一点,它是由相同的 process/thread 完成的吗?如果答案是肯定的,我会将请求的数据存储在一个变量中,这样您可以节省一些访问文件和操作其数据的时间。
如果插入是由另一个 process/thread 完成的,您应该更加小心,因为有一个 read/write 比赛。