আমি জাভাতে কোনও ফাইলের ফাইল এক্সটেনশন কীভাবে পেতে পারি?


484

কেবল পরিষ্কার করার জন্য, আমি মাইমির ধরণটি খুঁজছি না।

ধরা যাক আমার কাছে নিম্নলিখিত ইনপুট রয়েছে: /path/to/file/foo.txt

আমি বিশেষভাবে .txtএক্সটেনশনের জন্য এই ইনপুটটি ভাঙ্গার একটি উপায় চাই । জাভাতে এটি করার মতো কোনও বিল্ট রয়েছে? আমি নিজের পার্সার লেখা এড়াতে চাই।


12
আপনি কখনই জানেন না যে কোনও নতুন প্ল্যাটফর্ম কখন বয়ে যেতে চলেছে যা এক্সটেনশানগুলিকে কমা দ্বারা পৃথক করা হিসাবে সংজ্ঞায়িত করে। এখন আপনার প্ল্যাটফর্ম নির্ভর কোড লিখতে হবে। জাভা ফ্রেমওয়ার্কগুলি আরও এগিয়ে যাওয়ার চিন্তাভাবনা করা উচিত এবং এক্সটেনশন পাওয়ার জন্য এপিআইগুলি থাকতে হবে যেখানে তারা প্ল্যাটফর্ম নির্ভর কোডটি লেখেন এবং আপনি, এপিআইর ব্যবহারকারী হিসাবে, কেবল এক্সটেনশনটি পান বলে নিন।
আর্টঅফ ওয়ারফেয়ার

@ আর্টঅফ ওয়ারফেয়ার: ওএমজি। এর অনেক হাজার হাজার শ্রেণীর সঙ্গে একটি 100MB JRE তৈরি করা যাক কিন্তু দয়া করে নিশ্চিত কোনো পদ্ধতি যা আয় বাস্তবায়ন হতে "txt"থেকে "filename.txt"কারণ কিছু প্ল্যাটফর্ম কোথাও চাইতে পারেন ব্যবহার করতে "filename,txt"
এরিক ডুমিনিল

@ এরিকডুমিনিল "" ফাইল নাম.টেক্সট "" থেকে "টেক্সট" ফেরত এমন কোনও পদ্ধতি কার্যকর না করার ব্যাপারে নিশ্চিত হন ??? চেষ্টা করুন path.substring(path.lastIndexOf("."));..... এবং হ্যাঁ .. তারা নিশ্চিত যে কোনও
কিছুর

@ ভেলোসিটিপুলস ঠিক এটাই আমাকে বিরক্ত করে। যেহেতু ফাইল এক্সটেনশান পাওয়ার কোনও স্ট্যান্ডার্ড উপায় নেই, তাই আপনি কয়েক ডজন অর্ধ-ভুল উত্তর এবং কিছুটা পৃথক বাস্তবায়ন পান। আপনার কোডটি 2 টি পদ্ধতি ব্যবহার করে (আমি একটি একক, সুস্পষ্ট পদ্ধতিটি পছন্দ করতে চাই ) এটি ".txt"থেকে ফিরে আসে "filename.txt", এটি পছন্দসই ফলাফল নাও হতে পারে এবং সবচেয়ে বড় কথা, StringIndexOutOfBoundsExceptionকোনও এক্সটেনশন না থাকলে খালি স্ট্রিং ফিরিয়ে দেওয়ার পরিবর্তে এটি ব্যর্থ হয় ।
এরিক ডুমিনিল

উত্তর:


649

এই ক্ষেত্রে, অ্যাপাচি কমন্স আইও থেকে ফাইলের নাম ব্যবহার করুন get

এটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ এখানে রয়েছে (আপনি পুরো পথ বা কেবল ফাইলের নাম নির্দিষ্ট করে দিতে পারেন):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

মাভেন নির্ভরতা:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

গ্রেডল গ্রোভী ডিএসএল

implementation 'commons-io:commons-io:2.6'

গ্রেডল কোটলিন ডিএসএল

implementation("commons-io:commons-io:2.6")

অন্যরা https://search.maven.org/artifact/commons-io/commons-io/2.6/jar


70
লক্ষ্য করা উচিত যে এটি সংরক্ষণাগার.টি.র.ডিজ নামের একটি ফাইলের জন্য কেবল "জিজেড" প্রদান করে।
জিতরেক্স

106
@ জিট্রােক্স এর কারণ ফাইলটি এক্সটেনশন "জিজেড"।
BrainSlugs83

6
@ BrainSlugs83 সুতরাং "টার" এর অর্থ কী?
টুগোর্ডোবেলো

31
@zhelon .gz GNU জিপ করা ফাইল-ঘোরা, এবং .tar (টি) উল্লুক (শিরোণামে) পেঁয়াজজাতীয় গাছ ঘোরা। সুতরাং .tar.gz একটি gnu জিপ করা ফাইলের ভিতরে থাকা একটি টার ফাইল, যার .gz এক্সটেনশন রয়েছে।
সিরোভ্লাদিমির

5
এই সাধারণ কাজের জন্য অন্য একটি গ্রন্থাগার আনার কোনও কারণ নেই।
মাস্টারওয়াক

311

এর জন্য আপনার কি সত্যিই "পার্সার" দরকার?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

ধরে নিই যে আপনি সাধারণ উইন্ডোজ-এর মতো ফাইল নাম ব্যবহার করছেন, এর মতো কিছু নয় archive.tar.gz

বিটিডব্লিউ, যে ক্ষেত্রে ডিরেক্টরিতে '।' থাকতে পারে তবে ফাইলের নামটি নিজে পছন্দ করে না (আপনি পছন্দ /path/to.a/fileকরতে পারেন)

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}

4
ধন্যবাদ! নিশ্চিত যে এর জন্য আপনাকে একটি পার্সার / অবজেক্টের প্রয়োজন হতে পারে, যদি আপনি কেবল এক্সটেনশনের চেয়ে আরও বেশি ম্যানিপুলেশন করতে চান ... আপনি যদি কেবল পথ, পিতামহ ডিরেক্টরি, ফাইলের নাম (বিয়োগ এক্সটেনশন) ইত্যাদি চান তবে বলুন I ' আমি সি # এবং। নেট থেকে আসছি যেখানে আমাদের এটি রয়েছে: এমএসডিএন.মিকাইসফেসও
লিবেরি

10
আপনি যেমনটি বলেছিলেন, কেবলমাত্র নিখুঁত সর্বশেষ ইনডেক্সঅফ ("।") ব্যবহার করার বাইরেও অনেকগুলি বিষয় চিন্তা করতে হবে। আমি অনুমান করব যে এপাচি কমন্স এর জন্য একটি পদ্ধতি রয়েছে যা সামান্য জটিল সম্ভাব্য সমস্যাগুলিকে বিবেচনা করে।
ম্যাট্রিক্সফ্রোগ

12
আমি মনে করি বা i > 0এটিকে পরিবর্তন করা উচিত । এটি ফাইলের মতোগুলির যত্ন নেয় । i >= 0i != -1.htaccess
পাইজুসন

8
কিভাবে সহজ কোনো কোড স্নিপেট হয় নির্বিশেষে ... আপনি এখনও এটা আপডেট করার জন্য / এটি বজায় রাখা / সেটি পরীক্ষা করার / এটি একটি সুবিধাজনক নির্ভরতা হিসাবে উপলব্ধ করা ... অনেক সহজ যদি ইতিমধ্যে ছিল একটি liberal এর সংক্ষিপ্ত রূপ যে সকল করছেন
ডন জন্য Cheadle

2
ফাইলের একটি বিন্দু দিয়ে শেষ হলে আরও গোটচা হয়। একটি lib মধ্যে ভাল। যদি (i> p&& i <(fileName.length () - 1)) {এক্সটেনশন = fileName.substring (i + 1);
tgkprog

97
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}

13
লক্ষ করা উচিত যে এটি '' প্রদান করে। পাশাপাশি, সুতরাং আপনার ফাইলের সম্প্রসারণটি 'টেক্সট' এর বিপরীতে অন্য কয়েকটি
উত্তরে

2
আরও ভাল উত্তর এবং @ নিকএন্টিন আরও ভাল মন্তব্য। পিরিয়ড অপসারণ করতে "।" ফাইলের সম্প্রসারণ থেকে, ইন ইস্ট লাস্ট ইন্ডেক্সওফ = নাম.lastIndexOf ("।") + 1 হিসাবে কোড করা যায়;
হানজাল্লাহ আফগান

11
সেই পদ্ধতির কোনও ক্ষেত্রে কাজ নাও করা যেতে পারে যেমন /usr/bin/foo.bar/httpconf
ইমান আকবরী

8
@ lukasz1985 ১. শত শত লিনাক্স প্যাকেজগুলি "init.d" এর মতো নামের সাথে ডিরেক্টরি তৈরি করে, তদতিরিক্ত, এটি বিন্দুগুলির সাথে ডিরেক্টরি না থাকার পথে নির্ভর করা নিরাপদ নয়, যেহেতু এটি অবৈধ নয় I আমি অ্যান্ড্রয়েডের জন্য কোডিং করছিলাম তাই আমি কিছু এসডিকে ব্যবহার করেছি পদ্ধতিটি আমার মনে নেই তবে আমি অনুমান করি স্ট্যাকওভারফ্লো.com/a/3571239/2546146 এর এই ত্রুটি নেই
ইমান আকবারি

6
@ ইমান আকবারি: getName () কেবলমাত্র ফাইলের নামটি ফেরত দেয় যা আপনার উদাহরণে "httpconf" হবে।
ড্রিমস্পেসের রাষ্ট্রপতি

85

আপনি যদি পেয়ারা লাইব্রেরি ব্যবহার করেন তবে আপনি Filesইউটিলিটি ক্লাস অবলম্বন করতে পারেন । এটি একটি নির্দিষ্ট পদ্ধতি আছে getFileExtension(),। এই ক্ষেত্রে:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

এছাড়াও আপনি অনুরূপ ফাংশন সহ ফাইলের নামও পেতে পারেন, নাম উইথআউটআউট এক্সটেনশন () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo

4
সত্যি? এটি একটি দুর্দান্ত গ্রন্থাগার, ইউটিলিটিতে পূর্ণ। তাদের বেশিরভাগই দুর্দান্ত পেয়ারা ফাংশনের মতো জাভা 8 এর অংশ হবে ।
JeanValjean

দুর্ভাগ্যক্রমে কোন লাইব্রেরি ব্যবহার করা উচিত তা সমস্ত লোক সিদ্ধান্ত নিতে পারে না। কমপক্ষে আমাদের কাছে অ্যাপাচি কমন্স রয়েছে, যদিও এটি পুরানো।
লুয়ুইস মার্টিনেজ

1
যদি আপনি getFileExtensionপ্রকৃতপক্ষে উত্স কোডটি দেখতে পান তবে এটি ঠিক int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)এত বড় বিষয় নয়। এছাড়াও নোট করুন যে Filesকোনও কারণে "অস্থির" হিসাবে চিহ্নিত হয়েছে।
আল-মোতাফার

@ আল-মোতাহাফার অনেক ক্লাসকে অস্থির হিসাবে চিহ্নিত করেছেন (মাল্টিম্যাপ নির্মাতারা দেখুন), আমিও বুঝতে পারছি না কেন: বেশ কয়েকটি মুক্তি পেয়েছে, কিন্তু সেখানে কিছুই পরিবর্তন করা হয়নি।
JeanValjean

27

যদি অ্যান্ড্রয়েডে থাকে তবে আপনি এটি ব্যবহার করতে পারেন:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());

মনে রাখবেন স্ট্রিংটি এনকোড না করা থাকলে এটি কাজ করবে না (উদাহরণস্বরূপ কোনও স্থান বা একটি চীনা চরিত্র রয়েছে), দেখুন: স্ট্যাকওভারফ্লো.com
ফল

14

বিন্দুর আগে অক্ষরবিহীন ফাইলের নামগুলি গ্রহণ করতে, আপনাকে গ্রহণযোগ্য উত্তরের সেই সামান্য প্রকরণটি ব্যবহার করতে হবে:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"

সম্ভবত "foo" এর বিরুদ্ধে নিজেকে রক্ষা করা উচিত। ইনপুট.
ক্রিসিনমটাউন

14

এটি একটি পরীক্ষিত পদ্ধতি

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

এবং পরীক্ষার কেস:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}

10

আমার নোংরা এবং স্ট্রিং.রেপসএল ব্যবহার করে অতি ক্ষুদ্রতম হতে পারে :

.replaceAll("^.*\\.(.*)$", "$1")

মনে রাখবেন যে প্রথমটি *লোভী তাই এটি যতটা সম্ভব অক্ষরগুলি ধরে ফেলবে এবং তারপরে কেবল শেষ বিন্দু এবং ফাইলের এক্সটেনশানটি রেখে যাবে।


ফাইলটির কোনও এক্সটেনশন না থাকলে এটি ব্যর্থ হয়।
জ্যাক

হ্যাঁ, দুর্ভাগ্যক্রমে, তবুও তাত্ক্ষণিকভাবে ফাইল ফাইল টাইপ সনাক্তকরণের মতো সাধারণ পরিস্থিতির জন্য ব্যবহার করা যেতে পারে এবং যেমন কোনও ভুল এক্সটেনশন থাকা না থাকা থেকে খুব আলাদা নয়, অথবা ইনপুট সহ সমান প্রতিস্থাপনের ফলাফলের পরে যদি কেউ একটি শর্ত রাখতে পারে।
ইব্রাহিম বায়াগোভি

1
বা আরও খাটো.replaceAll(".*\\.", "")
ইব্রাহিম বায়াগোভি

10
String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

প্রত্যাবর্তন ".txt"

আপনি যদি কেবল "txt" চান তবে তৈরি করুন path.lastIndexOf(".") + 1


9

অন্য সমস্ত উত্তর থেকে সুস্পষ্টভাবে বোঝা যাচ্ছে, পর্যাপ্ত "বিল্ট-ইন" ফাংশন নেই। এটি একটি নিরাপদ এবং সহজ পদ্ধতি।

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}


6

আপনি Apache Commons-IO ব্যবহার করার এবং মাত্র ফাইলের এক্সটেনশন চেক করতে চান এবং তারপর কিছু অপারেশন না চান, আপনি ব্যবহার করতে পারেন এই , এখানে স্নিপেট হল:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}

মনে রাখবেন যে এই চেকটি ডক্স অনুসারে কেস সংবেদনশীল।
বাবকেন বর্ধনিয়ান

6

জাভা 8 এর জন্য এখানে আরও একটি ওয়ান-লাইনার রয়েছে।

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

এটি নিম্নলিখিত হিসাবে কাজ করে:

  1. "" ব্যবহার করে স্ট্রিংকে একটি অ্যারেতে বিভক্ত করুন।
  2. অ্যারেটিকে একটি স্ট্রিমে রূপান্তর করুন
  3. স্ট্রিমের শেষ উপাদানটি, অর্থাৎ ফাইল এক্সটেনশন পেতে হ্রাস ব্যবহার করুন

4

জেফাইলচুসার সম্পর্কে কীভাবে? এটি সরল নয় কারণ আপনার চূড়ান্ত ফলাফলটি পার্স করার প্রয়োজন হবে ...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

যা মাইম টাইপ ...

ঠিক আছে ... আমি ভুলে গেছি যে আপনি এর মাইম টাইমটি জানতে চান না।

নিম্নলিখিত লিঙ্কে আকর্ষণীয় কোড: http://download.oracle.com

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

সম্পর্কিত প্রশ্ন: আমি জাভাতে কোনও স্ট্রিং থেকে ফাইল এক্সটেনশানটি কীভাবে ছাঁটাই করব?


4

এখানে একটি পদ্ধতি যা .tar.gzসঠিকভাবে পরিচালনা করে , এমনকি ডিরেক্টরি নামের বিন্দু সহ একটি পথে:

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlashafterLastBackslashদ্রুত সন্ধানের জন্য তৈরি করা হয়েছে কারণ এতে কিছু স্ল্যাশ থাকলে এটির পুরো স্ট্রিংটি অনুসন্ধান করতে হবে না।

char[]মূল ভিতরে Stringপুনঃব্যবহৃত করা হয়, কোন আবর্জনা যুক্ত করা এবং জেভিএম সম্ভবত যে বিজ্ঞপ্তি হবে afterLastSlash, যাতে অবিলম্বে আবর্জনা হয় গাদা পরিবর্তে স্ট্যাক এটা করা


এই পদ্ধতিটি পেয়ারা উত্স কোড থেকে অনুলিপি করা হয়েছে আপনার অবশ্যই এটি উল্লেখ করতে হবে।
হামাজ করা হয়েছে

1
আমি এটি অনুলিপি করিনি। যদি এটি পেয়ারা উত্স কোডে থাকে তবে তারা এখান থেকে এটি অনুলিপি করে। সম্ভবত তাদের অবহিত।
Olathe

এটির জন্য দুঃখিত এটি বিটিডব্লিউ নয়, সুতরাং আপনার এবং পেয়ারা দেবের একই ধারণা থাকতে পারে same
হামাজ করা হয়েছে

2
সত্যই "gz" হ'ল ফিরে আসার সঠিক এক্সটেনশন। যদি কলিং কোডটি "টার" কেও পরিচালনা করতে পারে তবে এটি অতিরিক্তভাবে কোনও getExtensionফাংশনের বাহ্যিক পরীক্ষা করা উচিত । যদি ব্যবহারকারীর ফাইলের নাম হয় "my zip. don't touch.tar.gz"তবে এই পদ্ধতিটি ভুল এক্সটেনশনটি ফিরিয়ে দেবে।
ইন্ট্রিপিডিস

2
// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

চালানোর সময় এতে এক্সটেনশনের ".txt" থাকা উচিত।


13
নামের এক্সটেনশন না থাকলে ক্রাশ হবে।
ইবোমাইক

2

এখানে রিটার্ন মান হিসাবে alচ্ছিক সহ সংস্করণটি রয়েছে (কারণ আপনি ফাইলটির কোনও এক্সটেনশান হয়েছে তা নিশ্চিত হতে পারবেন না) ... এছাড়াও স্যানিটি পরীক্ষা করে ...

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}

2

আরজিইএক্স সংস্করণ সম্পর্কে কীভাবে :

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

বা নাল এক্সটেনশন সমর্থিত সহ:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

* নিক্সের জন্য ফলাফল:
পথ: / মূল / ডক্স /
নাম: রিডমে
এক্সটেনশন: txt

উইন্ডোজ, পার্সপথের জন্য ("সি: \ উইন্ডোজ me রিডমে। টেক্সট"):
পথ: সি: \ উইন্ডোজ \
নাম: রিডমি
এক্সটেনশন: txt



1

এখানে আমি একটি ছোট পদ্ধতি তৈরি করেছি (তবে এটি নিরাপদ নয় এবং অনেকগুলি ত্রুটির জন্য এটি পরীক্ষা করে না) তবে এটি যদি আপনি কেবল একটি সাধারণ জাভা-প্রোগ্রাম প্রোগ্রামিং করে থাকেন তবে ফাইল টাইপটি খুঁজে পাওয়ার জন্য এটি যথেষ্ট পরিমাণে বেশি। এটি জটিল ফাইল টাইপের জন্য কাজ করছে না, তবে এগুলি সাধারণত তেমন ব্যবহার হয় না।

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}

ওপি অন্তর্নির্মিত পদ্ধতিটির সন্ধান করছে
প্যান্থার

(1) আপনার lastIndexOfযেমন ফাইলের নামগুলি john.smith.report.docযথাযথভাবে আচরণ করা উচিত তেমন ব্যবহার করা উচিত । (২) কোনও এক্সটেনশন না থাকলে আপনার কেসগুলি সঠিকভাবে পরিচালনা করা উচিত। এই পদ্ধতিটি এমন কোনও ABC/XYZপথে ফিরে আসে abc/xyzযা কোনও অর্থ দেয় না। এটি ফিরে আসার আরও অর্থ তৈরি করবে ""বা null। (3) ফাইল বিভাজক সর্বদা হয় না /
রেডিওডেফ

1

ফাইলের নাম থেকে ফাইল এক্সটেনশন পাওয়া

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfExtension(String filename) {
    if (filename == null) {
        return -1;
    }
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
    int lastSeparator = indexOfLastSeparator(filename);
    return (lastSeparator > extensionPos ? -1 : extensionPos);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfLastSeparator(String filename) {
    if (filename == null) {
        return -1;
    }
    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
    return Math.max(lastUnixPos, lastWindowsPos);
}

ক্রেডিট

  1. অ্যাপাচি ফাইলনেম ইউটিলেস ক্লাস থেকে অনুলিপি করা হয়েছে - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils। getExtension% 28java.lang.String% 29

1

কোনও লাইব্রেরি ব্যবহার না করে আপনি স্ট্রিং পদ্ধতির বিভাজনটি নিম্নরূপ ব্যবহার করতে পারেন:

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }

0

কেবলমাত্র একটি নিয়মিত-এক্সপ্রেশন ভিত্তিক বিকল্প। যে দ্রুত না, ভাল না।

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}

0

উপরের সমস্ত উত্তর মিশ্রিত করে আমি এক্সটেনশানটি খুঁজে পাওয়ার আরও ভাল উপায় খুঁজে পেয়েছি

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }

0

আমি দর্শকের উত্তরের সরলতা পছন্দ করি এবং তার মন্তব্যে একটির সাথে লিঙ্ক করা অন্য উত্তরের একটি লিঙ্ক যা ইবোমাইক দ্বারা তৈরি করা , অন্য প্রশ্নের উপরে ফাইল পাথগুলিতে ডটগুলি ঠিক করে

কোনও ধরণের তৃতীয় পক্ষের API প্রয়োগ না করে, আমি পরামর্শ দিই:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

এর মতো কিছু ব্যবহার করতে পারেন, বলুন, ইমেজআইওর যে কোনও writeপদ্ধতিতে ফাইল ফর্ম্যাটটি প্রবেশ করতে হবে।

আপনি ডিআইওয়াই করতে পারলে কেন পুরো তৃতীয় পক্ষের এপিআই ব্যবহার করবেন?


0

এই নির্দিষ্ট প্রশ্নটি আমাকে অনেক ঝামেলা দিয়েছে তবে আমি এই সমস্যার জন্য একটি খুব সহজ সমাধান খুঁজে পেয়েছি যা আমি এখানে পোস্ট করছি।

file.getName().toLowerCase().endsWith(".txt");

এটাই.


3
ওপিকে এক্সটেনশানটি বের করার জন্য একটি পদ্ধতির প্রয়োজন - এটির জন্য পরীক্ষা করা নয়।
প্রেরাগ মনোজলভিক

আসলে আপনি যা কিছু ক্ষেত্রে বিকাশ করছেন তা কেবলমাত্র একটি নির্দিষ্ট ধরণের ফাইলের সাথে মোকাবেলা করা দরকার কেবলমাত্র আপনার সমস্যা যদি এই ক্ষেত্রে আসে তবে এটি আপনাকে সহায়তা করবে।
বিক্রম ভরদ্বাজ

4
যা তার প্রয়োজনীয়তাগুলিকে
সম্বোধন

2
এটি প্রশ্নের উত্তর নয়, তবে এটিই আমি খুঁজছিলাম।
এডিওলট

-1

এটা চেষ্টা কর.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg

-1
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }

-4

Java.nio.file.Files ক্লাসে জাভা এর সাথে কাজ করার একটি অন্তর্নিহিত পদ্ধতি রয়েছে যা আপনার প্রয়োজনের জন্য কাজ করতে পারে:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

নোট করুন যে এই স্থিতিশীল পদ্ধতিটি "সামগ্রীর ধরণ" পুনরুদ্ধার করতে এখানে পাওয়া স্পেসিফিকেশন ব্যবহার করে যা বিভিন্ন রকমের হতে পারে।


28
এটি ভুল। প্রোব কনটেন্টটাইপের জন্য রিটার্ন টাইপ মাইম সামগ্রী প্রকার, ফাইল এক্সটেনশন নয়। এটি সাধারণত এক্সটেনশনের সাথে মেলে না। এটি কোনও ফাইল ব্রাউজারে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধাম পড়ে যায়।
চার্লস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.