জাভাতে এক্সটেনশন ছাড়াই কীভাবে ফাইলের নাম পাবেন?


266

কেউ কি আমাকে বলতে পারেন কীভাবে এক্সটেনশন ছাড়াই ফাইলের নাম পাবেন? উদাহরণ:

fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";

উত্তর:


429

আপনি, আমার মত, বরং এমন কি হয় যদি আপনি মধ্যে পাস কিছু গ্রন্থাগার কোড যেখানে তারা সম্ভবত সব বিশেষ ক্ষেত্রে চিন্তা আছে, ব্যবহার করেন তাহলে নাল পাথ কিন্তু ফাইলের নাম নেই বা বিন্দু, আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);

61
আপনি পথের স্ট্রিং থেকে কোনও ফাইল-নাম ছাড়াই এক্সটেনশনে যেতে ফাইলের নাম ব্যবহার করতে পারেন ফাইলটি ব্যবহার করতে পারেন get
আয়ান ডুরকান

2
সবচেয়ে সহজ অবশ্যই চলমান ম্যাভেন :-) অন্যথায় দেখুন: commons.apache.org/io
উল্ফ লিন্ডব্যাক

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

3
পেয়ারা এবং কমন্স-আই একটি সামান্য অতিরিক্ত প্রস্তাব দিতে পারে সময় আপনি কত সুবিধা পদ্ধতি ইতিমধ্যে অবাক হবো অন্তর্ভুক্ত JDK 7 সঙ্গে java.nio.file.Filesএবং Path- যেমন সমাধানে বেস ডিরেক্টরি, এক লাইন কপি / চলন্ত ফাইল, শুধুমাত্র ফাইলের নাম পেয়ে যেমন ইত্যাদি
ডন চ্যাডেল

3
@ ল্যান ডুরকান বর্তমানে ফাইলের নামUtils.getBase নাম রাজধানী এন সহ
হ্যারি হ্যারি

153

সবচেয়ে সহজ উপায় হ'ল নিয়মিত এক্সপ্রেশন ব্যবহার করা।

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

উপরের এক্সপ্রেশনটি এক বা একাধিক অক্ষর দ্বারা অনুসরণ করা শেষ বিন্দুটি সরিয়ে ফেলবে। এখানে একটি বেসিক ইউনিট পরীক্ষা।

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}

11
রেজেক্স উপরের লাইব্রেরির সমাধান হিসাবে ব্যবহার করা সহজ নয়। এটি কাজ করে, তবে কোডটি দেখে (REGEX ব্যাখ্যা না করে) এটি কী করে তা সুস্পষ্ট নয়।
গুস্তাভো লিটোভস্কি 21

5
@GustavoLitovsky Android এর সঙ্গে bundled আসা নেই org.apache.commons। আমি যতদূর সচেতন, এটি অ্যান্ড্রয়েডে করার একমাত্র উপায়।
লিয়াম জর্জ বেটসওয়ার্থ

1
/ * নিম্নলিখিত রেজেক্স পথটিও সরিয়ে দেয় * / "/the/path/name.existance".replaceAll(".* \\\\/\\\\/\\\\/ ;
ড্যাজেট


53

নিম্নলিখিত পরীক্ষা প্রোগ্রাম দেখুন:

public class javatemp {
    static String stripExtension (String str) {
        // Handle null case specially.

        if (str == null) return null;

        // Get position of last '.'.

        int pos = str.lastIndexOf(".");

        // If there wasn't any '.' just return the string as is.

        if (pos == -1) return str;

        // Otherwise return the string, up to the dot.

        return str.substring(0, pos);
    }

    public static void main(String[] args) {
        System.out.println ("test.xml   -> " + stripExtension ("test.xml"));
        System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
        System.out.println ("test       -> " + stripExtension ("test"));
        System.out.println ("test.      -> " + stripExtension ("test."));
    }
}

কোন ফলাফল:

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test

এর এক্সটেনশন কী foo.tar.gz? আপনি দেখতে চাইলে কেন .tar.gzহবে তা আমি দেখতে পাচ্ছি ।
tchrist

5
@ ট্রিস্ট, এটির foo.tar.gzএকটি গিজিপড সংস্করণ foo.tarতাই আপনি এটি যুক্তিও দিতে পারেন যে gzএটি এক্সটেনশন ছিল। এটি কীভাবে আপনি এক্সটেনশানটি সংজ্ঞায়িত করেন তা নেমে আসে ।
প্যাক্সিডিয়াবল্লো

2
ফাইল মত কি করতে হবে .gitignore?
মাইকেল ম্যানেজার নেস্টেরেনকো

আপনি জানেন যে জাভাতে ক্লাসের নামটি কখনই ছোট চিঠি দিয়ে শুরু করা উচিত নয়!
অনুজকু

7
যদি এটি একটি নিয়ম হত, ভাষা এটি প্রয়োগ করে। যেহেতু এটি না, এটি একটি গাইডলাইন তবে দৃ strongly়ভাবে এটির পরামর্শ দেওয়া হয়েছে। যাই হোক না কেন, এটি প্রশ্নোত্তর থেকে সম্পূর্ণ অপ্রাসঙ্গিক।
paxdiablo

47

এখানে আমার পছন্দ অনুসারে একীভূত তালিকার অর্ডার দেওয়া আছে।

অ্যাপাচি কমন্স ব্যবহার করা

import org.apache.commons.io.FilenameUtils;

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);

                           OR

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

গুগল পেয়ারা ব্যবহার করা (আপনি যদি ইতিমধ্যে এটি ব্যবহার করেন)

import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);

বা কোর জাভা ব্যবহার করে

1)

String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character.
    fileName = fileName.substring(0, pos);
}

2)

if (fileName.indexOf(".") > 0) {
   return fileName.substring(0, fileName.lastIndexOf("."));
} else {
   return fileName;
}

3)

private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");

public static String getFileNameWithoutExtension(File file) {
    return ext.matcher(file.getName()).replaceAll("");
}

লাইফ্রেয় এপিআই

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName());

42

যদি আপনার প্রকল্পে পেয়ারা (14.0 বা আরও নতুন) ব্যবহার হয় তবে আপনি যেতে পারেন Files.getNameWithoutExtension()

(মূলত FilenameUtils.removeExtension()অ্যাপাচি কমন্স আইও-র মত একইরকম , যেমন সর্বাধিক ভোটের জবাব দেয়, কেবল পেয়ারা এটিও করতে চেয়েছিলেন Pers ব্যক্তিগতভাবে আমি কমন্সে নির্ভরতা যুক্ত করতে চাইনি I যা আমি মনে করি এটি কিছুটা অবলম্বন — শুধু এই কারণে।)


2
আসলে এটি আরও বেশিFilenameUtils.getBaseName()
অ্যাঞ্জেলো.হান্নেস

আসলে পেয়ারা এমন একটি অস্থির lib যে আমি যেখানেই পারি সেখানে এটি ব্যবহার করা এড়াতে চাই। গুগলের দ্বারা পরীক্ষাগুলির চেয়ে স্থিতিশীল প্রতীক পছন্দ করুন
স্লাভা

8

নীচে https://android.googlesource.com/platfor/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java থেকে রেফারেন্স দেওয়া আছে

/**
 * Gets the base name, without extension, of given file name.
 * <p/>
 * e.g. getBaseName("file.txt") will return "file"
 *
 * @param fileName
 * @return the base name
 */
public static String getBaseName(String fileName) {
    int index = fileName.lastIndexOf('.');
    if (index == -1) {
        return fileName;
    } else {
        return fileName.substring(0, index);
    }
}

1
সুন্দর তথ্য, তবে ব্যবহারকারীরা ".htaccess" এর মতো ক্ষেত্রে সচেতন হন, যেখানে এই পদ্ধতিটি "" ফিরে আসবে।
মার্কাস শুল্টে

6

আপনি যদি পুরো অ্যাপাচি.কমগুলি আমদানি করতে পছন্দ না করেন তবে আমি একই কার্যকারিতাটি বের করেছি:

public class StringUtils {
    public static String getBaseName(String filename) {
        return removeExtension(getName(filename));
    }

    public static int indexOfLastSeparator(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int lastUnixPos = filename.lastIndexOf(47);
            int lastWindowsPos = filename.lastIndexOf(92);
            return Math.max(lastUnixPos, lastWindowsPos);
        }
    }

    public static String getName(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfLastSeparator(filename);
            return filename.substring(index + 1);
        }
    }

    public static String removeExtension(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfExtension(filename);
            return index == -1?filename:filename.substring(0, index);
        }
    }

    public static int indexOfExtension(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int extensionPos = filename.lastIndexOf(46);
            int lastSeparator = indexOfLastSeparator(filename);
            return lastSeparator > extensionPos?-1:extensionPos;
        }
    }
}

4

আমি যখন গ্রন্থাগার পুনরায় ব্যবহার করার ক্ষেত্রে বড় বিশ্বাসী তখনই org.apache.commons.io JAR 174KB, যা একটি মোবাইল অ্যাপ্লিকেশনের জন্য উল্লেখযোগ্যভাবে বড়।

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

তবে আপনি যদি ইউনিক্স স্টাইলের পাথ ("/" বিভাজক সহ) ব্যবহারের জন্য কেবল কয়েকটি স্ট্যাটিক ইউটিলিটি পদ্ধতি চান তবে নীচের কোডটি দরকারী হিসাবে পেতে পারেন।

removeExtensionপদ্ধতি ফাইলের নাম সহ পাথ বাকি অপরিবর্তিত। এছাড়াও একটি অনুরূপ আছে getExtension

/**
 * Remove the file extension from a filename, that may include a path.
 * 
 * e.g. /path/to/myfile.jpg -> /path/to/myfile 
 */
public static String removeExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(0, index);
    }
}

/**
 * Return the file extension from a filename, including the "."
 * 
 * e.g. /path/to/myfile.jpg -> .jpg
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(index);
    }
}

private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';

public static int indexOfExtension(String filename) {

    if (filename == null) {
        return -1;
    }

    // Check that no directory separator appears after the 
    // EXTENSION_SEPARATOR
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);

    int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);

    if (lastDirSeparator > extensionPos) {
        LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
        return -1;
    }

    return extensionPos;
}

1
public static String getFileExtension(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    public static String getBaseFileName(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(0,fileName.lastIndexOf("."));
    }

1

আপেক্ষিক পথ বা পুরো পাথ থেকে নাম পাওয়ার সহজ উপায়টি ব্যবহার করা হচ্ছে

import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)


0

আপনি এটি দ্বারা বিভক্ত করতে পারেন। " এবং সূচীতে 0 টি ফাইলের নাম এবং 1 এ এক্সটেনশন হয় তবে আমি প্রথমে নিবন্ধে উল্লিখিত যেমন apache.commons-io থেকে ফাইলনাম ইউটিলেস দিয়ে সেরা সমাধানের দিকে ঝুঁকতে চাই। এটি অপসারণ করতে হবে না, তবে যথেষ্ট:

String fileName = FilenameUtils.getBaseName("test.xml");


0

অ্যাপাচি কমন্স আইওFilenameUtils.removeExtension থেকে ব্যবহার করুন

উদাহরণ:

আপনি পুরো পথের নাম বা কেবল ফাইলের নাম সরবরাহ করতে পারেন

String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"

আশাকরি এটা সাহায্য করবে ..


এটি ইতিমধ্যে গৃহীত উত্তরে রয়েছে, এই পোস্টটির মূল বক্তব্য কী?
টম

0

সাবলীল উপায়:

public static String fileNameWithOutExt (String fileName) {
    return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
            .map(i-> fileName.substring(0, i)).orElse(fileName);
}

0

এটিকে সহজ করে রাখলে জাভা এর স্ট্রিং.রেপসএল () পদ্ধতিটি নীচে ব্যবহার করুন:

String fileNameWithExt = "test.xml";
String fileNameWithoutExt
   = fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );

ফাইলনেম উইথেক্সট-এ সম্পূর্ণরূপে যোগ্যতাসম্পন্ন পাথ অন্তর্ভুক্ত করার সময় এটিও কাজ করে।


0

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

File filename = new File('test.txt'); File.getName().split("[.]");

সুতরাং split[0]"টেস্ট" এবং বিভক্ত [1] "txt" ফিরে আসবে


-3

নীচের কোড ব্যবহার করে দেখুন। কোর জাভা বেসিক ফাংশন ব্যবহার করে। এটি Stringএক্সটেনশন সহ এবং এক্সটেনশন ছাড়াই ( '.'চরিত্র ব্যতীত) যত্ন নেয় । একাধিকের '.'বিষয়টিও আচ্ছন্ন।

String str = "filename.xml";
if (!str.contains(".")) 
    System.out.println("File Name=" + str); 
else {
    str = str.substring(0, str.lastIndexOf("."));
    // Because extension is always after the last '.'
    System.out.println("File Name=" + str);
}

আপনি এটি nullস্ট্রিং দিয়ে কাজ করতে অভিযোজিত করতে পারেন ।


1
এই ধরণের কার্যকারিতা নিজেই প্রয়োগ করা অত্যন্ত খারাপ অনুশীলন। প্রথম নজরে টাস্কটি অত্যন্ত সুস্পষ্ট বলে মনে হচ্ছে তবে বাস্তবে আপনি অনেকগুলি ব্যতিক্রমী পরিস্থিতির মুখোমুখি হবেন (যেমন .ফাইলের নাম নেই বা ফাইল একটি ব্যাকআপ এবং নামটির মতো রয়েছে document.docx.backupইত্যাদি)। বাহ্যিক গ্রন্থাগারটি ব্যবহার করা এটি আরও নির্ভরযোগ্য যা আপনার জন্য এই সমস্ত ব্যতিক্রমী পরিস্থিতি নিয়ে কাজ করে।
ivstas

1
অন্যদিকে আপনার প্রকল্পে অনেকগুলি গ্রন্থাগার যুক্ত করা এটি আরও বড় করে তুলবে। এর মতো সহজ জিনিস নিজেরাই করা যেতে পারে।
নিকোলাস টাইলার

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

এই কোডটি অমিত মিশ্রের মতো দেখে মনে হচ্ছে, 'যদি (! Str.contains ("।"))'
ব্রোকেন_ওয়াইন্ডো

নিম্নলিখিত ক্ষেত্রে "/someFolder/some.other.folder/someFileWithoutExtention" ব্যর্থ হবে। প্রথম জিনিসটি যা 2 সেকেন্ড পরে মনের মধ্যে পপড .. আমি নিশ্চিত যে আমি অন্যান্য টন বোঝা নিয়ে আসতে পারব।
নিউটোপিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.