अगर जावा में कोई फ़ाइल मौजूद है, तो मैं कैसे जाँच करूँ?


841

जावा में पढ़ने के लिए ( पर्ल के बराबर -e $filename) खोलने से पहले मैं कैसे जांच सकता हूं कि कोई फ़ाइल मौजूद है या नहीं ?

एसओ पर एकमात्र समान प्रश्न फ़ाइल लिखने के साथ संबंधित है और इस प्रकार इसका उपयोग करके उत्तर दिया गया था FileWriterजो स्पष्ट रूप से यहां लागू नहीं है।

यदि संभव हो तो मैं एक वास्तविक API कॉल को सही / गलत मानकर वापस लौटना पसंद करूंगा, जब किसी फ़ाइल को खोलने के लिए कुछ "कॉल एपीआई" का विरोध किया जाए और जब वह अपवाद को फेंक दे, जिसे आप टेक्स्ट में 'नो फाइल' के लिए जाँचते हैं, लेकिन मैं उसके साथ रह सकता हूँ बाद वाला।


3
इसके अलावा जोड़ने के लिए है कि आप उचित फाइल अनुमति के लिए जाँच करना चाहते हैं हैं: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File तरीकों है canRead, canWriteऔर canExecuteउस के लिए जाँच करने के लिए ।
किर्कलैंड

6
यह ध्यान दिया जाना चाहिए कि यह खतरनाक है। किसी भी समय फाइल सिस्टम बदल सकता है, जिसमें आपके "यह फ़ाइल मौजूद है" विधि रिटर्न के ठीक बाद शामिल है। चूंकि आपको उस मामले को वैसे भी संभालना है, इसलिए ऐसी विधि संदिग्ध उपयोगिता की है। यदि आप फ़ाइल को खोलने जा रहे हैं, तो ऐसा करने का सही तरीका फ़ाइल को खोलना है और संबंधित अपवाद को संभालना है।
केविन

1
@kevin अच्छा बिंदु, लेकिन यह गैर-समवर्ती वातावरण में निर्विवाद उपयोगिता है, जो ऐसा हुआ कि मुझे इसकी आवश्यकता थी;)
DVK

@Dvk: क्या आप प्रीमेच्युरली मल्टीटास्कड OS पर चल रहे हैं? या तो वह, या यह एक विशेष रूप से डिज़ाइन किया गया जावा चिप है । यदि पूर्व, आप समवर्ती वातावरण में हैं। अन्य प्रक्रियाएँ आपके नीचे से फाइल सिस्टम को बदल सकती हैं।
केविन

2
@kevin यह नहीं है कि यह मायने रखता है, लेकिन यह व्यक्तिगत उपयोग के लिए डिज़ाइन किया गया एक सिंगल थ्रेडेड ऐप है। संभावना है कि यह समर्पित फ़ाइल है किसी भी तरह से बनाया जाएगा / इसके तहत बदला गया अविश्वसनीय रूप से कम है।
DVK

जवाबों:


1341

का उपयोग कर java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}

15
कुछ मामले हैं जहां मौजूद हैं () एक गलत परिणाम लौटाएगा। उदाहरण के लिए, NFS फाइल सिस्टम का उपयोग करते समय बासी फ़ाइल हैंडल के साथ एक समस्या होती है: Bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 यह अस्पष्ट है, लेकिन उत्पादन कोड में कुछ निराशाजनक कीड़े का कारण है। इससे पहले।
सीएडब्ल्यू १

22
if(f.isFile())इसके बजाय उपयोग करें ।
लियोन

1
filePathString.trim () का उपयोग करने के सफेद रिक्त स्थान से बचने के लिए याद
असीम

427

मैं isFile()इसके बजाय उपयोग करने की सलाह दूंगा exists()। अधिकांश समय आप यह देखना चाहते हैं कि क्या पथ किसी फ़ाइल के लिए न केवल इंगित करता है कि वह मौजूद है। याद रखें कि exists()अगर आपका रास्ता किसी निर्देशिका की ओर इशारा करता है तो यह सच हो जाएगा।

new File("path/to/file.txt").isFile();

new File("C:/").exists() सच हो जाएगा, लेकिन आपको फ़ाइल के रूप में इसे खोलने और पढ़ने की अनुमति नहीं देगा।


1
@ ylun.ca उदाहरण में उपनिर्देशिकाएँ शामिल हैं? यदि आप यह पूछना चाहते हैं कि क्या वर्तमान निर्देशिका को देखते हुए /path, सही पूर्ण पथ होने पर new File("file.txt").exists()वापस आ जाएगा , तो उत्तर एक बड़ी संख्या है (जब तक कि कोई अन्य फ़ाइल मौजूद नहीं है)। true/path/to/file.txt/path/file.txt
मैथ्यू पढ़ें

149

जावा SE 7 में nio का उपयोग करके,

import java.nio.file.*;

Path path = Paths.get(filePathString);

if (Files.exists(path)) {
  // file exist
}

if (Files.notExists(path)) {
  // file is not exist
}

यदि दोनों existsऔर notExistsगलत हैं, तो फ़ाइल के अस्तित्व को सत्यापित नहीं किया जा सकता है। (शायद इस मार्ग पर कोई अधिकार नहीं है)

यदि pathकोई निर्देशिका या नियमित फ़ाइल है, तो आप देख सकते हैं ।

if (Files.isDirectory(path)) {
  // path is directory
}

if (Files.isRegularFile(path)) {
  // path is regular file
}

कृपया इस जावा एसई 7 ट्यूटोरियल की जांच करें ।


2
नई फ़ाइल (पथ) .exists () की तुलना में क्या सलाह है? एक पालिन में मौजूद चेक के लिए
रघु के नायर

2
@RaghuKNair java.nio.file.Files.exists()है एक बहुत तेजी से java.io.File.exists()(: विंडोज सर्वर 2012 जावा 1.7.0_45 x64 चल ही कंप्यूटर पर मेरे छोटे बेंचमार्क से मैं परीक्षण किया)।
मैथ्यू

1
मैं सिर्फ यह अपने आप की कोशिश की और java.nio.file.Files.exists()5 गुना था धीमी की तुलना में java.io.File.exists। (विन 7 जावा 1.7.0_79 - x86)
पार्करहेलो

यह भी नुकसान है कि अगर स्ट्रिंग वैध नहीं है, तो पाथ्सगेट एक अपवाद फेंकता है
रिचर्ड

46

जावा 8 का उपयोग करना:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}

2
Files.exists()दो तर्क देता है। आमतौर पर, आप कुछ ऐसा चाहते हैं Files.exists(path, LinkOption.NOFOLLOW_LINKS )
माइक सी

1
@ मायके मुझे आश्चर्य है कि किस विधि को दूसरे तर्क के बिना कहा जाता है। दस्तावेज़ उस बारे में कोई जानकारी भी नहीं दिखाता है।
पावरफ्लॉवर

1
@ पॉवरफ्लावर: केवल एक फाइल है। नेट () विधि। दूसरे तर्क को पारित किए बिना, यह अभी भी उसी विधि को कहता है। दूसरा तर्क varargs variable है और 0 या अधिक LinkOptions पास कर सकते हैं।
TK8

27
File f = new File(filePathString); 

यह एक भौतिक फ़ाइल नहीं बनाएगा। केवल क्लास फ़ाइल का एक ऑब्जेक्ट बनाएगा। किसी फ़ाइल को भौतिक रूप से बनाने के लिए आपको उसे स्पष्ट रूप से बनाना होगा:

f.createNewFile();

तो f.exists()यह जांचने के लिए इस्तेमाल किया जा सकता है कि ऐसी फाइल मौजूद है या नहीं।



16

इसे प्राप्त करने के कई तरीके हैं।

  1. सिर्फ अस्तित्व के मामले में। यह फ़ाइल या निर्देशिका हो सकती है।

    new File("/path/to/file").exists();
  2. फ़ाइल के लिए जाँच करें

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
    
  3. निर्देशिका के लिए जाँच करें।

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isDirectory()) {}
    
  4. जावा 7 रास्ता।

    Path path = Paths.get("/path/to/file");
    Files.exists(path)  // Existence 
    Files.isDirectory(path)  // is Directory
    Files.isRegularFile(path)  // Regular file 
    Files.isSymbolicLink(path)  // Symbolic Link
    


14

Google पर "जावा फ़ाइल मौजूद है" के लिए पहला हिट:

import java.io.*;

public class FileTest {
    public static void main(String args[]) {
        File f = new File(args[0]);
        System.out.println(f + (f.exists()? " is found " : " is missing "));
    }
}

1
F.exists चेक करने से पहले f =! Null चेक करने की कोई आवश्यकता नहीं है, यदि नया कीवर्ड विफल रहता है तो यह एक अपवाद उत्पन्न करेगा।
सीन एओ हारनी

अगर f = null है तो कोई जांच नहीं है। f + (...) java.io.File.toString का उपयोग करता है
बस किसी ने

String.valueOf()
अन्याय

12

मत करो। बस पकड़ें FileNotFoundException.फ़ाइल सिस्टम को परीक्षण करना है कि क्या फ़ाइल वैसे भी मौजूद है। ऐसा दो बार करने का कोई मतलब नहीं है, और कई कारणों से नहीं, जैसे:

  • कोड को डबल करें
  • जब आप परीक्षण करते हैं तो फ़ाइल की विंडो की समस्या मौजूद हो सकती है, लेकिन जब आप खोलते हैं, या इसके विपरीत, और
  • तथ्य यह है कि, जैसा कि इस प्रश्न के अस्तित्व से पता चलता है, आप गलत परीक्षण कर सकते हैं और गलत उत्तर प्राप्त कर सकते हैं।

सिस्टम के दूसरे अनुमान लगाने की कोशिश न करें। यह जानता है। और भविष्य की भविष्यवाणी करने की कोशिश मत करो। सामान्य तौर पर यह जांचने का सबसे अच्छा तरीका है कि कोई संसाधन उपलब्ध है या नहीं , बस इसका उपयोग करने की कोशिश करें।


क्या होगा अगर मैं यह देखने के लिए हर घंटे की जांच करना चाहता हूं कि क्या किसी फ़ाइल को सीधे स्थान पर जमा किया गया है। मेरे पास एक वेबमैथोड्स प्रोजेक्ट है जिसे यह देखने के लिए जांचना होगा कि क्या किसी विशिष्ट फ़ाइल को किसी विशिष्ट ड्राइव पर अपलोड किया गया है। यह कैसे किया जाएगा। मान लीजिए कि मैं यह देखने के लिए हर घंटे की जांच करना चाहता हूं कि क्या फ़ाइल है। मैं एक वर्ग को लिखने के लिए जावा का उपयोग कर सकता हूं जो संभवतः किसी प्रकार के टाइमर के साथ ऐसा करता है।
डग Hauf

2
एक अपवाद को पकड़ना अधिक महंगा है। मेरे परीक्षण में, नई फ़ाइल () मौजूद है (फ़ाइल मौजूद है) फ़ाइलनोटफ़ाउंड एक्ससेप्शन को पकड़ने की तुलना में 10 गुना अधिक तेज़ है। इसलिए, यदि आपके पास एक ऐसा परिदृश्य है जहाँ फाइलें गायब होने की उम्मीद है (जैसे कि डिस्क कैश), तो अपवाद गलत है। इसके अलावा, दूसरी-अनुमान प्रणाली शांत है।
निक फ्रेलोव

1
@Gnawer आपने मेरे द्वारा उठाए गए मुद्दों में से किसी को भी संबोधित नहीं किया है; अपवाद केवल तब फेंका जाता है जब फ़ाइल को खोला नहीं जा सकता; और एक घंटे में एक बार होने वाले ऑपरेशन को माइक्रो-ऑप्टिमाइज़ेशन की आवश्यकता नहीं होती है। आपका अंतिम वाक्य बकवास है।
user207421

1
@DougHauf आपके मामले में कोई समस्या नहीं है क्योंकि आप अस्तित्व की जाँच के बाद कुछ भी करने का प्रयास नहीं करते हैं। लेकिन ओपी ने विशेष रूप से खोलने से पहले जांच करने के लिए कहा। इस मामले में फ़ाइल को केवल खोलने की कोशिश करना / पकड़ना बेहतर है।
Dan Passaro

8

मेरे लिए सीन ए ओ हार्नी द्वारा स्वीकार किए गए उत्तर के संयोजन और Cort3z द्वारा परिणामी टिप्पणी सबसे अच्छा समाधान लगती है।

निम्नलिखित स्निपेट का उपयोग किया:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}

आशा है कि यह किसी की मदद कर सकता है।


4

मुझे पता है कि मुझे इस धागे में थोड़ी देर हो गई है। हालांकि, यहाँ मेरा जवाब है, जावा 7 और उसके बाद से मान्य है।

निम्नलिखित स्निपेट

if(Files.isRegularFile(Paths.get(pathToFile))) {
    // do something
}

पूरी तरह से संतृप्त है, क्योंकि यदि फ़ाइल मौजूद नहीं है, तो विधि isRegularFileवापस आती falseहै। इसलिए, अगर जाँच करने के लिए कोई ज़रूरत नहीं है Files.exists(...)

ध्यान दें कि अन्य पैरामीटर यह दर्शाता है कि लिंक को कैसे संभाला जाना चाहिए। डिफ़ॉल्ट रूप से, प्रतीकात्मक लिंक का पालन किया जाता है।

जावा ओरेकल दस्तावेज से


सोनार डॉक्स से: JDK 8 में Files.exists पद्धति का प्रदर्शन बहुत खराब है, और फ़ाइलों की जांच करने के लिए उपयोग किए जाने वाले एप्लिकेशन को काफी धीमा कर सकता है जो वास्तव में मौजूद नहीं हैं। उसी के लिए जाता है Files.notExists, Files.isDirectoryऔर Files.isRegularFile. इसके लिए सबसे अच्छा विकल्प है:path.toFile().exists()
गेनट

4

यह भी अच्छी तरह से कॉमन्स FileUtils से परिचित हो रही लायक है https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html यह फ़ाइलों के प्रबंधन और के लिए अतिरिक्त तरीकों है अक्सर जेडीके से बेहतर।


19
सवाल का जवाब न देने का तरीका। मैं मानता हूं कि कॉमन्स में बहुत सारे उपयोगी सामान हैं, लेकिन शायद हम उस एक कदम को आगे बढ़ा सकते हैं और ओपी द्वारा पूछे गए प्रश्न का उत्तर प्रदान कर सकते हैं।
डेमॉन्गोलम

4
उसने मेरे लिए पर्याप्त जवाब दिया।
बैल

3

उदाहरण के लिए यदि आपके पास एक फ़ाइल निर्देशिका है और आप जाँचना चाहते हैं कि यह मौजूद है या नहीं

File tmpDir = new File("/var/tmp");

boolean exists = tmpDir.exists();

exists यदि फ़ाइल मौजूद नहीं है तो गलत वापस आएगा

स्रोत: https://alvinalexander.com/java/java-file-exists-directory-exists


2

अच्छा कोडिंग प्रथाओं और सभी मामलों को कवर करने के साथ सरल उदाहरण:

 private static void fetchIndexSafely(String url) throws FileAlreadyExistsException {
        File f = new File(Constants.RFC_INDEX_LOCAL_NAME);
        if (f.exists()) {
            throw new FileAlreadyExistsException(f.getAbsolutePath());
        } else {
            try {
                URL u = new URL(url);
                FileUtils.copyURLToFile(u, f);
            } catch (MalformedURLException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

संदर्भ और अधिक उदाहरण

https://zgrepcode.com/examples/java/java/nio/file/filealreadyexistsexception-implementations


1

यदि आप Fileकिसी डायरेक्टरी में चेक करना चाहते हैंdir

String directoryPath = dir.getAbsolutePath()
boolean check = new File(new File(directoryPath), aFile.getName()).exists();

और checkपरिणाम की जाँच करें



1

स्ट्रिंग के साथ फ़ाइल कंस्ट्रक्टर का उपयोग न करें।
यह काम नहीं कर सकता है!
इसके बजाय यूआरआई का उपयोग करें:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}

काम क्यों नहीं कर सकते? और एक URI का उपयोग कैसे तय करता है?
user207421

हमारे पास एक मुद्दा था। f.exists () सत्य था और हम फ़ाइल सामग्री भी प्राप्त कर सकते थे। समस्या थी, रास्ता गलत था लेकिन फ़ाइल का नाम ठीक था, यहां तक ​​कि यह एक और फ़ाइल थी। यूआरआई के साथ कंस्ट्रक्टर कॉल को बदलते हुए, समस्या को ठीक किया।
iviorel

1

File.exists()जाँच करने के लिए कि क्या कोई फ़ाइल मौजूद है, यह चेक ऑपरेशन की स्थिति को इंगित करने के लिए बूलियन मान लौटाएगा; यदि फ़ाइल मौजूद है तो सच है; झूठ नहीं तो अस्तित्व नहीं।

File f = new File("c:\\test.txt");

if(f.exists()){
    System.out.println("File existed");
}else{
    System.out.println("File not found!");
}

0

जाँच करने के लिए आप निम्न कोड का उपयोग कर सकते हैं:

import java.io.File;
class Test{
    public static void main(String[] args){
        File f = new File(args[0]); //file name will be entered by user at runtime
        System.out.println(f.exists()); //will print "true" if the file name given by user exists, false otherwise

        if(f.exists())
        {
             //executable code;
        }
    }
}

0

आप इसे इस तरह से बना सकते हैं

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}

अपने उत्तर को श्रेष्ठ प्रदर्शन के साथ तुलना में है को ध्यान में रखना File.is Exist()या Files.isRegularFile()JDK 8 में
क्रिस्टियन चपरो ए

0

इन विधियों को डिजाइन करने का विशिष्ट उद्देश्य है। हम यह नहीं कह सकते कि फ़ाइल मौजूद है या नहीं जाँचने के लिए किसी का उपयोग नहीं किया जा सकता है।

  1. isFile () : टेस्ट कि क्या इस अमूर्त पथनाम द्वारा निरूपित फ़ाइल एक सामान्य फ़ाइल है।
  2. मौजूद है () : इस अमूर्त पथनाम द्वारा निरूपित फ़ाइल या निर्देशिका के परीक्षण मौजूद हैं। docs.oracle.com

-5

यह देखने के लिए कि क्या कोई फ़ाइल मौजूद है, बस java.io. * लाइब्रेरी आयात करें

File f = new File(“C:\\File Path”);

if(f.exists()){
        System.out.println(“Exists”);        //if file exists
}else{
        System.out.println(“Doesn't exist”);         //if file doesn't exist
}

स्रोत: http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/


2
यह कुछ नहीं जोड़ता है। आप जो कहते हैं वह कई उत्तरों में कहा गया है। कृपया शोर उत्पन्न न करें।
klutt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.