精华内容
下载资源
问答
  • 主要介绍了Java获取文件的类型和扩展名的实现方法的相关资料,需要的朋友可以参考下
  • 主要介绍了如何通过java获取文件名和扩展名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本文将讨论3中方式来获取文件扩展名。 本文示例直接返回“.”后面。比如“javais.txt”返回“txt”。 2 获取扩展名 获取扩展名的时候,有两个特殊场景: 当文件名没有扩展名的时候,比如 makefile。 当文件名只有...

    1 介绍

    本文将讨论3中方式来获取文件扩展名。
    本文示例直接返回“.”后面。比如“javais.txt”返回“txt”。

    2 获取扩展名

    获取扩展名的时候,有两个特殊场景:

    • 当文件名没有扩展名的时候,比如 makefile。
    • 当文件名只有扩展名的时候,比如.gitignore或.DS_Store

    2.1 最简单的、基于字符串处理的方法

    public Optional<String> getExtensionByStringHandling(String filename) {
        return Optional.ofNullable(filename)
          .filter(f -> f.contains("."))
          .map(f -> f.substring(filename.lastIndexOf(".") + 1));
    }
    

    上面代码,通过检查“.”在文件名中的位置,把“.”之后的作为扩展名。
    特殊情况:

    • 没有扩展名,返回空;
    • 只有扩展名,返回扩展名之后的,比如“gitignore”

    2.2 Apache Commons IO的FilenameUtils.getExtension

    代码如下:

    public String getExtensionByApacheCommonLib(String filename) {
        return FilenameUtils.getExtension(filename);
    }
    

    上面代码,我们传入的filename是一个完整路径,类似:“C:/baeldung/com/demo.java”。FilenameUtils.getExtension会判断文件是否存在。
    如果不存在,则原样返回filename。否则,返回文件的扩展名。
    此方法调用了FilenameUtils里面的indexOfExtension(String)方法,indexOfExtension又调用了lastIndexOf(char),最终找到最后一个“.”。
    还调用了indexOfLastSeparator(String)来判断最后一个“.”后面有没有目录分隔符。
    特殊情况:

    • 没有扩展名:返回空字符串
    • 只有扩展名:返回“.”之后的字符串,比如“gitignore”。

    2.3 使用Guava库

    基于maven引入Guava:

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>24.1.1-jre</version>
    </dependency>
    

    使用Files.getFileExtension方法:

    public String getExtensionByGuava(String filename) {
        return Files.getFileExtension(filename);
    }
    

    getFileExtension首先会检查给定的文件名是否存在。
    如果非空,会创建一个File实例,并调用File的getName()方法,得到抽象的目录名。
    基于这个返回值,利用String的lastIndexOf(char)获取最后一个“.”的位置。
    特殊情况:

    • 没有扩展名:返回空字符串
    • 只有扩展名:返回“.”之后的字符串,比如“gitignore”。

    3 结论

    Apache Commons和Google Guava各有特点,根据需要选择即可。
    本文代码见github

    编译

    展开全文
  • 前言刚接触 java 的时候很困惑一个事情 File相对...ClassLoader 用于获取class 文件 的 io,我们也可以用于获取文件的 io,以便于我们读取文件内容。本文设计内容File ,ZipFile,JarFile 读取相对路径和绝对路径文...

    前言

    刚接触 java 的时候很困惑一个事情 File相对路径,以哪个目录为参照物。

    随着 io 模型的发展,java 1.7 的 nio,使用 Path、Paths 和 Files 等来方便 io 的操作。

    ClassLoader 用于获取class 文件 的 io,我们也可以用于获取文件的 io,以便于我们读取文件内容。

    本文设计内容

    • File ,ZipFile,JarFile 读取相对路径和绝对路径文件内容。
    • System.getProperty("user.dir”) 是怎么来的。
    • Paths、Path、Files 读取文件内容。
    • 类加载器获取文件内容,Class.getResourceAsStream 和 ClassLoader.getResourceAsStream。
    • 介绍类加载器的双亲委派模型,及在代码中找到对应的加载逻辑。

    代码基于 Mac 10.15.4,JDK 1.8。

    基于 File 获取文件内容

    绝对路径的内容获取比较简单,直接获取文件 io ,然后利用工具类读取文件内容。

    获取绝对路径文件内容

    final File file = new File("/Users/zhangpanqin/github/fly-java/demo.txt");final byte[] bytes = cn.hutool.core.io.FileUtil.readBytes(file);System.out.println(new String(bytes, StandardCharsets.UTF_8));

    获取 JarFile 中的内容

    JarFile 继承 ZipFile 用于获取 jar 包中的内容。比如我想获取 jar 中的某个文件的的内容。

    final File file = new File("/Users/zhangpanqin/github/fly-java/src/main/resources/fastjson-1.2.68.jar");final JarFile jarFile = new JarFile(file);final JarEntry jarEntry = jarFile.getJarEntry("META-INF/LICENSE.txt");final InputStream inputStream = jarFile.getInputStream(jarEntry);// 工具类是 hutoolSystem.out.println(IoUtil.read(inputStream, StandardCharsets.UTF_8));IoUtil.close(inputStream);

    获取相对路径的内容

    File.getAbsolutePath 查看源码可以发现,相对路径其实就是在前面拼接了 System.getProperty("user.dir")。

    class UnixFileSystem extends FileSystem {    public String resolve(File f) {        if (isAbsolute(f)) return f.getPath();        return resolve(System.getProperty("user.dir"), f.getPath());    }}

    只要我们弄清楚 System.getProperty("user.dir"),问题就迎刃而解。Java System Properties 中介绍 user.dir 是用户的工作目录。

    f650b9ec-720f-eb11-8da9-e4434bdf6706.png

    什么是用户工作目录呢?就是执行 java 命令的目录。在那个目录下执行命令,usr.dir 就会被 java 虚拟机赋值为执行命令的路径。我在 /Users/zhangpanqin/github/fly-java/test 目录下运行编译的 class 文件。-cp 指定 classpath 路径。

    f750b9ec-720f-eb11-8da9-e4434bdf6706.png

    nio 读取文件内容

    Path 可以类比 File 理解使用。然后工具类 Paths 可以获得 Path,Files 更是提供了丰富的 api 用于crud 操作文件 Path。

    获取绝对路径内容

    @Testpublic void run33() throws IOException {    final Path path = Paths.get("/Users/zhangpanqin/github/fly-java/demo.txt");    final byte[] bytes = Files.readAllBytes(path);    System.out.println(new String(bytes,StandardCharsets.UTF_8));}

    获取相对路径内容

    Paths 获取相对路径时,路径不以 / 开头。也可以理解成相对于 System.getProperty("user.dir") 路径。

    public static void main(String[] args) {    System.out.println(System.getProperty("user.dir"));    System.out.println(Paths.get("").toAbsolutePath());}
    f950b9ec-720f-eb11-8da9-e4434bdf6706.png

    基于 ClassLoader 获取文件内容

    ClassLoader.getResourceAsStream

    // ClassLoader.getResourceAsStream java 1.8 源码public InputStream getResourceAsStream(String name) {    URL url = getResource(name);    try {        return url != null ? url.openStream() : null;    } catch (IOException e) {        return null;    }}

    从代码可以看到主要逻辑还是集中在 getResource 。

    public URL getResource(String name) {    URL url;    if (parent != null) {        url = parent.getResource(name);    } else {        url = getBootstrapResource(name);    }    if (url == null) {        url = findResource(name);    }    return url;}

    以上代码的逻辑也即是我们常听到的 双亲委派机制。先让 父类加载 去加载资源,找不到再有自己找。类加载器单独讲。

    类加载器读取读取资源,先从自己负责的路径查找。比如应用类加载器 sun.misc.Launcher.AppClassLoader#AppClassLoader 负责 classpath 查找资源。类加载器读取资源相对于 File 和 Path 优势在哪里呢?比如当我想获取一个 jar 中的资源,你用路径就比较麻烦了,ClassLoader 可以从负责的路径下寻找,还可以去 jar 包中寻找。

    final URL resource = Test2.class.getClassLoader().getResource("com/alibaba/fastjson/JSONArray.class");System.out.println(resource);

    上述打印结果

    jar:file:/Users/zhangpanqin/.m2/repository/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.jar!/com/alibaba/fastjson/JSONArray.class

    我们还可以获取一个路径的 inputstream

    @Testpublic void run222(){    final InputStream resourceAsStream = Test2.class.getClassLoader().getResourceAsStream("META-INF/maven/com.alibaba/fastjson/pom.properties");    System.out.println(IoUtil.read(resourceAsStream, StandardCharsets.UTF_8));}

    上述结果为:

    #Generated by Maven#Mon Oct 07 22:09:36 CST 2019version=1.2.62groupId=com.alibabaartifactId=fastjson

    Class.getResourceAsStream

    Class.getResourceAsStream 实际也调用的 ClassLoader 加载资源,但是它会将路径补充到相对于当前类所在包的路径。

    比如

    // com.fly.study.java.classloader.Test2@Testpublic void run555(){    System.out.println(Test2.class.getResource("name"));}

    实际查找的资源为 com.fly.study.java.classloader.name。相对于当前类所在包的资源。

    类加载器

    我们经常会听到类加载器的 双亲委派模型。

    0e51b9ec-720f-eb11-8da9-e4434bdf6706.png

    去哪里可以看到这些类加载呢。

    启动类加载器 不是 java 代码实现的我们看不到源码。

    sun.misc.Launcher 类中有我们知道的 扩展类加载器 sun.misc.Launcher.ExtClassLoader 和 应用类加载器 sun.misc.Launcher.AppClassLoader 。

    java.lang.ClassLoader#getSystemClassLoader 代码看的话,实际返回的应用类加载器。

    public static ClassLoader getSystemClassLoader() {    initSystemClassLoader();    if (scl == null) {        return null;    }    SecurityManager sm = System.getSecurityManager();    if (sm != null) {        checkClassLoaderPermission(scl, Reflection.getCallerClass());    }    return scl;}private static synchronized void initSystemClassLoader() {        if (!sclSet) {            sun.misc.Launcher l = sun.misc.Launcher.getLauncher();            if (l != null) {                Throwable oops = null;                scl = l.getClassLoader();            }        }}

    运行代码测试,返回的是应用类加载器。

    // sun.misc.Launcher$AppClassLoader@18b4aac2@Testpublic void run66(){    System.out.println(ClassLoader.getSystemClassLoader());}

    这三个类加载器负责不同路径下的类加载。

    启动类加载器介绍

    启动类加载器 BootClassLoader 负责System.getProperty("sun.boot.class.path") 的类加载。也即是以下类。

    ${JAVA_HOME}/jre/lib/*.jar 和 ${JAVA_HOME}/jre/classes 类的加载。

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/resources.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/rt.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/sunrsasign.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jsse.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jce.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/charsets.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jfr.jar/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/classes
    @Testpublic void run77() {    final URLClassPath bootstrapClassPath = Launcher.getBootstrapClassPath();    final URL[] urLs = bootstrapClassPath.getURLs();    Stream.of(urLs).forEach(item->{        System.out.println(item.getFile());    });}

    扩展类加载器

    扩展类加载器 sun.misc.Launcher.ExtClassLoader 为加载 System.getProperty("java.ext.dirs") 中的类。

    @Testpublic void run99() {    final String property = System.getProperty("java.ext.dirs");    final String[] split = property.split(":");    Stream.of(split).forEach(item -> {        System.out.println(item);    });}
    /Users/zhangpanqin/Library/Java/Extensions/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/Library/Java/Extensions/Network/Library/Java/Extensions/System/Library/Java/Extensions/usr/lib/java

    应用类加载器

    应用类加载器 sun.misc.Launcher.AppClassLoader 加载 System.getProperty("java.class.path");

    # -cp 指定 classpath 路径,多个路径可以使用 : 分开(linux 下为 :,window 下为 ;),java -cp /Users/zhangpanqin/github/fly-java/target/classes com.fly.study.java.classloader.Test2 

    本文由 张攀钦的博客 http://www.mflyyou.cn/ 创作。 可自由转载、引用,但需署名作者且注明文章出处。

    如转载至微信公众号,请在文末添加作者公众号二维码。微信公众号名称:Mflyyou

    0f51b9ec-720f-eb11-8da9-e4434bdf6706.png
    展开全文
  • 一、获取文件扩展名(该段代码来自博客园网站装男人的博客https://www.cnblogs.com/nanrenzhuang/archive/2013/05/19/6315546.html) publicstaticStringgetExtensionName(Stringfilename){  if((filename!=null)&...

    一、获取文件扩展名(该段代码来自博客园网站装男人的博客https://www.cnblogs.com/nanrenzhuang/archive/2013/05/19/6315546.html)

    public static String getExtensionName(String filename) {     

      if ((filename != null) && (filename.length() > 0)) {     

        int dot = filename.lastIndexOf('.');     

        if ((dot >-1) && (dot < (filename.length() - 1))) {     

          return filename.substring(dot + 1);     

                }     

            }     

      return filename;     

    }     

    二、获取不带扩展名的文件名(该段代码来自博客园网站装男人的博客https://www.cnblogs.com/nanrenzhuang/archive/2013/05/19/6315546.html)

    public static String getFileNameNoEx(String filename) {     

      if ((filename != null) && (filename.length() > 0)) {     

        int dot = filename.lastIndexOf('.');     

        if ((dot >-1) && (dot < (filename.length()))) {     

          return filename.substring(0, dot);     

             }     

          }     

      return filename;     

    }

    三、获取文件大小

    String path = "PATH";  //该处填入文件路径

    File f = new File(path);

    int size = new FileInputStream(f).available() / 1024 / 1024;  //结果以M为单位

    转载于:https://www.cnblogs.com/Briddle-ch/p/8906525.html

    展开全文
  • java获取文件后缀

    千次阅读 2019-06-20 22:02:33
    java的File类是没有提供获取后缀的方法的,通常使用文件名来截取后缀。 方法1: //使用lastIndexOf()结合subString()获取后缀 public String lastName(File file){ if(file==null) return null; String ...

    java的File类是没有提供获取后缀名的方法的,通常使用文件名来截取后缀名。

    方法1:

    //使用lastIndexOf()结合subString()获取后缀名
    public String lastName(File file){
        if(file==null) return null;
        String filename = file.getName();
        if(filename.lastIndexOf(".")==-1){
            return "";//文件没有后缀名的情况
        }
        //此时返回的是带有 . 的后缀名,
        return filename.subString(filename.lastIndexOf("."));
    
        //return filename.subString(filename.lastIndexOf(".")+1);// 这种返回的是没有.的后缀名
        
        // 下面这种如果对于String类型可能有问题,如 以.结尾的字符串,会报错。但是文件没有以点结尾的
    }

    方法2:

    // split截取后缀名
        public String lastName(File file) {
            if (file == null) return null;
            String filename = file.getName();
            // split用的是正则,所以需要用 //. 来做分隔符
            String[] split = filename.split("\\.");
            //注意判断截取后的数组长度,数组最后一个元素是后缀名
            if (split.length > 1) {
                return split[split.length - 1];
            } else {
                return "";
            }
        }

     

    展开全文
  • Java输出某路径下的指定类型文件的文件名及绝对路径 给定一个文件夹的路径,输出该文件夹下所有的pdf(任意类型)文件的绝对路径。 实在没有想到腾讯面试会问这种程序题,措手不及。。。。 直接上代码 import java....
  • 由于IDEA上传的文件静态资源,保存的路径和eclipse有些区别,之前用eclipse是保存在WEB-INF下, 当然我们也可以修改output directory,和eclipse一样放在WEB-INF目录下,操作如下,编辑tomcat 1 23 @...
  • } /** * @description 第三步:根据十六进制字符串判断文件类型格式 * @param filePath 文件路径 * @return 文件类型 */ public static FileType getType(String filePath) throws IOException { String fileHead =...
  • Java获取文件后缀

    万次阅读 2015-09-24 22:51:38
    import java.io.File; public class Test { /** *author: itmyhome */ public static void main(String[] args) { File file = new File("HelloWorld.java"); String fileName = file.getName(); Stri
  • 获取一个文件的绝对路径 以下的这种方式是通用的,即使代码换位置了,这样编写仍然是通用的。 但前提是:文件需要在类路径(在src下的都是类路径,src是类的根路径)下,才能用这种方式。 /* 解释: Thread....
  • import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFileCho...
  • java web项目中 获取resource路径下的文件路径 public GetResource{  String path = GetResource.class.getClassLoader().getResource("xx/xx.txt").getPath(); } ----------扩展 一 相对路径的获得 ...
  • 依赖 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>...public class
  • 今天遇到一个要求,找出某目录下,后缀是xls的文件,在网上查找学习操作,但输入相关问题,答案甚少,不太全,于是输入关键字:FilenameFilter才找到一篇很对此题的答案,建议看一下,献上网址:...
  • 获取文件名及扩展名的正确姿势如何正确使用正则表达式基础方法多个扩展名包含路径正则表达式登场解析没有扩展名的情况结合二者扩展结束 如何正确使用正则表达式 正则表达式非常难,至少我本人是这么想的,逻辑性和...
  • 获取指定目录下所有文件的绝对路径和文件名
  • java实现文件拷贝,以及修改文件扩展名 一、文件拷贝 public File createNewFile(String path, String realPath, String newFileName) { File file = new File(path); // path原文件路径,被复制的文件 File ...
  • java获取上传的文件后缀

    千次阅读 2020-11-11 15:25:52
    〇、前情提要 上传的文件改变其命名为随机15字符而后缀不变。 参考: ...javaweb之文件上传核心类FileItem(获取名字,判断是普通项还是上传项,获取上传文件输入流,解决普通表单项中文乱码的问题) ...
  • 由于平时需要,我们经常会去获取文件扩展名或者buda
  • package xyz.jangle.file.test;...import java.io.File; import org.apache.log4j.Logger; public class FileTest { private static Logger logger = Logger.getLogger(FileTest.class); public static void ma...
  • Java网址下载文件获取后缀

    千次阅读 2017-09-07 10:59:07
    Java网址下载文件获取后缀网址下载时,网址资源URL格式多样,不一定能在链接中直接获取后缀,本文综合了多种获取后缀的方法,供参考: 通过网址后缀直接获取 通过网址响应头中的Content-Disposition(匹配...
  • 目录 1 日志路径带来的痛点 2 log4j.properties文件的配置 3 彻底解决痛点 3.1 单独的Java程序包 (非Java Web项目) 3.2 Web项目 4 附录 - 获取当前项目、类路径的几种方式 ...
  • android 获取文件扩展名和去掉文件扩展名
  • 如一个String类型类型得路径如下 D:ppt\ppp.qws.ppt 如何获得.ppt得类型 D:img\spoe.tjrt\444.jpg 如何获得.jpg得类型 D:mp4\dertr-gfhhfh\dgdfg.mad.dewq.mp4 如何获得.mp4得类型
  • 高分悬赏:Java语言怎么提取一个文件路径里的文件的扩展名的部分,也就是最后一个点后面的部分,没有扩展名返回"" 比如 c:\123\aaa.abc 返回abc c:\123.456\aaa 返回"",而不是456\aaa
  • 从一个标准的Url提取出文件扩展名 function getExt($url){ $arr = parse_url($url); $file = basename($arr['path']);// basename函数返回路径中的文件名部分 $ext = explode('.', $file); return $ext[count...
  • Java获取当前程序的路径

    千次阅读 2018-08-22 15:05:38
    import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; /* java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 ...
  • 本文实例讲述了python获取指定路径下所有指定后缀文件的方法。分享给大家供大家参考。具体实现方法如下: # 获取指定路径下所有指定后缀的文件 # dir 指定路径 # ext 指定后缀,链表&不需要带点 或者不指定。例子:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,239
精华内容 60,495
关键字:

java获取文件路径扩展名

java 订阅