主函数段
public class sort {
public static void main(String[] args) {
sortFileByNumber("排序前的文件路径", "排序后的文件路径");
}
}
解析:
public class sort
:定义一个公共类sort
。public static void main(String[] args)
:这是Java程序的入口点,程序从main
方法开始执行。sortFileByNumber("day01-collection\\src\\SeatNumber", "day01-collection\\src\\SeatNumberSorted")
:调用sortFileByNumber
方法,传入源文件路径和目标文件路径,执行文件排序操作。
文件排序方法段
private static void sortFileByNumber(String source, String destination) {
ArrayList<String> list = new ArrayList<>();
try (BufferedWriter bw = new BufferedWriter(new FileWriter(destination));
BufferedReader br = new BufferedReader(new FileReader(source))) {
String line;
while ((line = br.readLine()) != null) {
list.add(line);
}
list.stream()
.sorted(Comparator.comparingInt(sort::extractNumber))
.forEach(string -> {
try {
bw.write(string);
bw.newLine();
} catch (IOException e) {
throw new CompletionException(e);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
解析:
ArrayList<String> list = new ArrayList<>()
:创建一个ArrayList
用于存储文件中的所有行。BufferedReader br = new BufferedReader(new FileReader(source))
和BufferedWriter bw = new BufferedWriter(new FileWriter(destination))
:创建BufferedReader
和BufferedWriter
对象,分别用于读取和写入文件。while ((line = br.readLine()) != null)
:循环读取源文件中的每一行,直到文件结束。list.add(line)
:将读取的每一行添加到ArrayList
中。list.stream().sorted(Comparator.comparingInt(sort::extractNumber))
:使用流对ArrayList
中的元素进行排序,排序依据是extractNumber
方法返回的数字。- forEach方法内使用匿名内部类重写了Consumer方法,在写入数据时,我们通过抛出
CompletionException
来处理可能的IOException
,这使得我们可以使用Lambda表达式。 bw.write(string)
和bw.newLine()
:将排序后的每一行写入到目标文件,并在每一行后添加一个换行符。- 异常处理:使用
try-with-resources
确保BufferedReader
和BufferedWriter
在使用完毕后能够正确关闭。如果在读取或写入过程中发生IOException
,则捕获并打印异常。
提取数字方法段
private static int extractNumber(String line) {
Pattern pattern = Pattern.compile("^[0-9]+");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
return Integer.parseInt(matcher.group());
} else {
return 0;
}
}
解析:
Pattern.compile("^[0-9]+")
:使用正则表达式"^[0-9]+"
创建一个Pattern
对象,该表达式用于匹配字符串开头的数字。Matcher matcher = pattern.matcher(line)
:使用Pattern
对象创建一个Matcher
对象,用于匹配输入的字符串。if (matcher.find())
:如果Matcher
在字符串中找到匹配项,则执行if
语句。return Integer.parseInt(matcher.group())
:返回匹配到的数字,通过matcher.group()
获取匹配的子串,然后使用Integer.parseInt()
将其转换为整数类型。return 0
:如果字符串开头没有数字,则返回0
作为默认值。
结语
通过上述代码,我们实现了基于文件的数字排序功能,这不仅提高了文件处理的效率,也为后续的文件分析和数据处理提供了便利。希望本文能够帮助你理解和掌握Java中文件操作和数据排序的相关知识,为你的项目开发提供帮助