一、File类获取文件后缀名
在Java中,最常见的获取文件后缀名的方法是使用File类提供的方法,具体步骤如下:
File file = new File("C:/test/file.txt");
String fileName = file.getName();
int dotIndex = fileName.lastIndexOf(".");
String suffix = fileName.substring(dotIndex);
System.out.println("文件后缀名为:"+suffix);
以上代码首先创建一个File对象,然后使用getName()方法获取文件名称,接着使用lastIndexOf()方法获取最后一个"."出现的位置,再使用substring()方法获取文件后缀名并打印出来。
但是需要注意的是,如果文件没有后缀名或者在文件名中有多个".",这种方法获取的结果可能不是我们想要的。因此,我们可以对代码进行改进:
String suffix = "";
if(dotIndex > 0){
suffix = fileName.substring(dotIndex + 1);
}
这里通过判断dotIndex大于0,即文件名中存在".",来防止在文件名最前方出现"."的情况。如果为true,就用substring()方法获取文件后缀名。
二、FilenameUtils类获取文件后缀名
除了使用File类,还可以使用Apache Commons IO库中的FilenameUtils类提供的方法来获取文件后缀名。具体实现如下:
String suffix = FilenameUtils.getExtension("C:/test/file.txt");
System.out.println("文件后缀名为:"+suffix);
这里直接调用FilenameUtils.getExtension()方法获取文件后缀名,并打印出来。
此方法可以处理文件没有后缀名的情况,返回的结果为一个空字符串。
三、Path类获取文件后缀名
在Java 7中,引入了Path类来简化对文件和目录的操作。Path类的getParent()和getFileName()方法可以分别获取父路径和文件名,并支持获取文件名的后缀名。具体实现如下:
Path path = Paths.get("C:/test/file.txt");
String fileName = path.getFileName().toString();
String suffix = FilenameUtils.getExtension(fileName);
System.out.println("文件后缀名为:"+suffix);
首先通过Paths.get()方法获取路径,接着使用getFileName()方法获取文件名,再使用FilenameUtils.getExtension()方法获取文件后缀名,并打印出来。
这里的getFileName()方法返回的是Path对象类型,因此需要使用toString()方法转换为字符串类型以供后续的方法调用。
四、InputStream获取文件后缀名
在Java中,InputStream可以读取文件内容,同时也可以获取文件的后缀名。具体步骤如下:
File file = new File("C:/test/file.txt");
InputStream inputStream = new FileInputStream(file);
String suffix = "";
if(inputStream.markSupported()){
inputStream.mark(Integer.MAX_VALUE);
byte[] bytes = new byte[10];
int read = inputStream.read(bytes);
if(read > 0){
suffix = getSuffix(new String(bytes));
}
inputStream.reset();
}
inputStream.close();
System.out.println("文件后缀名为:"+suffix);
// 获取文件后缀名的方法
public static String getSuffix(String fileHeader){
if(fileHeader.startsWith("BM")){
return ".bmp";
}else if(fileHeader.startsWith("47 49 46")){
return ".gif";
}else if(fileHeader.startsWith("FF D8 FF")){
return ".jpg";
}else if(fileHeader.startsWith("89 50 4E 47 0D 0A 1A 0A")){
return ".png";
}else{
return "";
}
}
代码中首先使用FileInputStream类创建输入流对象,再用markSupported()方法判断是否支持mark()和reset()方法,如果支持就使用mark()方法标记一下,以后可以使用reset()回到标记的位置继续读取;读取前十个字节,将其转化为字符串,然后根据其头部信息判断文件类型并返回对应的后缀名。
值得注意的是,该方法并不能处理所有类型的文件,需要根据所需调整代码中的判断条件。
五、通过正则表达式获取文件后缀名
在Java中,也可以使用正则表达式来获取文件后缀名。具体实现如下:
String fileName = "file.txt";
Pattern r = Pattern.compile("\\.(\\w+)$");
Matcher m = r.matcher(fileName);
if(m.find()){
String suffix = m.group(1);
System.out.println("文件后缀名为:"+suffix);
}
这里首先定义一个正则表达式,使用compile()方法编译,其中\\w+表示一个或多个字母、数字或下划线,$表示在文件名末尾;然后使用matcher()方法创建匹配器对象m,传入文件名fileName作为参数;最后使用find()方法进行匹配,如果匹配到了就使用group()方法获取匹配到的第一个括号内的内容,即文件后缀名,并打印出来。
虽然使用正则表达式可以方便地处理一些复杂的文件名,但是在性能方面可能存在一些问题。
六、总结
本文从Java获取文件后缀名的多个方面进行了详细的阐述。其中包括使用File类、FilenameUtils类、Path类、InputStream、正则表达式等不同的方式。开发者可以根据自己的需求选择合适的方法来获取文件后缀名。