How to detect if a file(with any extension) exist in java

19,536

Solution 1

This code will do the trick..

public static void listFiles() {

        File f = new File("C:/"); // use here your file directory path
        String[] allFiles = f.list(new MyFilter ());
        for (String filez:allFiles ) {
            System.out.println(filez);
        }
    }
}
        class MyFilter implements FilenameFilter {
        @Override
        //return true if find a file named "a",change this name according to your file name
        public boolean accept(final File dir, final String name) {
            return ((name.startsWith("a") && name.endsWith(".jpg"))|(name.startsWith("a") && name.endsWith(".txt"))|(name.startsWith("a") && name.endsWith(".mp3")|(name.startsWith("a") && name.endsWith(".mp4"))));

        }
    }

Above code will find list of files which has name a.
I used 4 extensions here to test(.jpg,.mp3,.mp4,.txt).If you need more just add them in boolean accept() method.

EDIT :
Here is the most simplified version of what OP wants.

public static void filelist()
    {
        File folder = new File("C:/");
        File[] listOfFiles = folder.listFiles();

    for (File file : listOfFiles)
    {
        if (file.isFile())
        {
            String[] filename = file.getName().split("\\.(?=[^\\.]+$)"); //split filename from it's extension
            if(filename[0].equalsIgnoreCase("a")) //matching defined filename
                System.out.println("File exist: "+filename[0]+"."+filename[1]); // match occures.Apply any condition what you need
        }
     }
}

Output:

File exist: a.jpg   //These files are in my C drive
File exist: a.png
File exist: a.rtf
File exist: a.txt
File exist: a.mp3
File exist: a.mp4

This code checks all the files of a path.It will split all filenames from their extensions.And last of all when a match occurs with defined filename then it will print that filename.

Solution 2

If you're looking for any file with name "a" regardless of the suffix, the glob that you're looking for is a{,.*}. The glob is the type of regular expression language used by shells and the Java API to match filenames. Since Java 7, Java has support for globs.

This Glob explained

  • {} introduces an alternative. The alternatives are separated with ,. Examples:
    • {foo,bar} matches the filenames foo and bar.
    • foo{1,2,3} matches the filenames foo1, foo2 and foo3.
    • foo{,bar} matches the filenames foo and foobar - an alternative can be empty.
    • foo{,.txt} matches the filenames foo and foo.txt.
  • * stands for any number of characters of any kind, including zero characters. Examples:
    • f* matches the filenames f, fa, faa, fb, fbb, fab, foo.txt - every file that's name starts with f.
  • The combination is possible. a{,.*} is the alternatives a and a.*, so it matches the filename a as well as every filename that starts with a., like a.txt.

A Java program that lists all files in the current directory which have "a" as their name regardless of the suffix looks like this:

import java.io.*;
import java.nio.file.*;
public class FileMatch {
    public static void main(final String... args) throws IOException {
        try (final DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("."), "a{,.*}")) {
            for (final Path entry : stream) {
                System.out.println(entry);
            }
        }
    }
}

or with Java 8:

import java.io.*;
import java.nio.file.*;
public class FileMatch {
    public static void main(final String... args) throws IOException {
        try (final DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("."), "a{,.*}")) {
            stream.forEach(System.out::println);
        }
    }
}

If you have the filename in a variable and you want to see whether it matches the given glob, you can use the FileSystem.getPathMatcher() method to obtain a PathMatcher that matches the glob, like this:

final FileSystem fileSystem = FileSystems.getDefault();
final PathMatcher pathMatcher = fileSystem.getPathMatcher("glob:a{,.*}");
final boolean matches = pathMatcher.matches(new File("a.txt").toPath());
Share:
19,536

Related videos on Youtube

user2511713
Author by

user2511713

Updated on October 17, 2022

Comments

  • user2511713
    user2511713 over 1 year

    I am searching for a sound file in a folder and want to know if the sound file exist may it be .mp3,.mp4,etc.I just want to make sure that the filename(without extension) exists.

    eg.File searching /home/user/desktop/sound/a

    return found if any of a.mp3 or a.mp4 or a.txt etc. exist.

    I tried this:

    File f=new File(fileLocationWithExtension);
    
    if(f.exist())
       return true;
    else return false;
    

    But here I have to pass the extension also otherwise its returning false always

    To anyone who come here,this is the best way I figured out

        public static void main(String[] args) {
        File directory=new File(your directory location);//here /home/user/desktop/sound/
        final String name=yourFileName;  //here a;
                String[] myFiles = directory.list(new FilenameFilter() {
                    public boolean accept(File directory, String fileName) {
                        if(fileName.lastIndexOf(".")==-1) return false;
                        if((fileName.substring(0, fileName.lastIndexOf("."))).equals(name))
                            return true;
                        else return false;
                    }
                });
       if(myFiles.length()>0)
           System.Out.println("the file Exist");
    }
    

    Disadvantage:It will continue on searching even if the file is found which I never intended in my question.Any suggestion is welcome

  • agad
    agad almost 11 years
    Better: java.io.File.list(FilenameFilter); if (listOfFiles.length > 0) {System.out.println("found");}
  • user207421
    user207421 almost 11 years
    Try it why? How does this answer the question?
  • user2572367
    user2572367 almost 11 years
    @ridoy i dont know how it works in java but asterisk would return any name and any extension that can be found in a directory
  • user2511713
    user2511713 almost 11 years
    "a" is actually the file name here.the folder contain many files(around 1000).will it be wise to use this method?
  • user207421
    user207421 almost 11 years
    Not with java.io.File it doesn't. Obviously you haven't tried it. -1
  • user2511713
    user2511713 almost 11 years
    @EJP:It does.I do want to return true if /home/user/desktop/sound/a.* is available where * represents any type.
  • user2511713
    user2511713 almost 11 years
    @agad:FilenameFilter is "/home/user/desktop/sound/a" here?
  • user207421
    user207421 almost 11 years
    @user2511713 Make up your mind. Either it doesn't work or it answers the question. Not both at the same time.
  • Ruchira Gayan Ranaweera
    Ruchira Gayan Ranaweera almost 11 years
    @user2511713 You can do it as this way
  • ridoy
    ridoy almost 11 years
    @bowmore, i changed the code and it works perfectly now,so can you re-consider your downvote?
  • ridoy
    ridoy almost 11 years
    @user2511713, inform me if this is what you want.
  • agad
    agad almost 11 years
    I would slightly modify the accept method to improve the performance: public boolean accept(final File dir, final String name) { if (name.charAt(0) != 'a') { return false; if (name.endsWith(".jpg")||name.endsWith(".txt")||name.endsWith‌​(".mp3")||name.endsW‌​ith(".mp4")) { return true; } return false;}
  • user2511713
    user2511713 almost 11 years
    Your code will now work for .jpg,.mp3,.mp4,.txt .I want it to work with any file extension no matter what.have a look at my answer
  • ridoy
    ridoy almost 11 years
    But you not mentioned that earlier in your question,u mentioned only 3 formats there.So make sure about what you want before asking a question and clearly mention that.