java - পরম ফাইল পাথ ধারণকারী একটি স্ট্রিং থেকে আমি ফাইলের নাম কিভাবে পেতে পারি?




file filenames filepath (9)

String ভেরিয়েবলটিতে একটি ফাইল নাম রয়েছে, C:\Hello\AnotherFolder\The File Name.PDFC:\Hello\AnotherFolder\The File Name.PDF । আমি কিভাবে ফাইল নাম The File Name.PDF একটি স্ট্রিং হিসাবে ফাইল নাম পেতে পারি?

আমি স্ট্রিং বিভক্ত পরিকল্পনা, কিন্তু যে সর্বোত্তম সমাধান নয়।


Answers

অন্যান্য উত্তরগুলি আমার নির্দিষ্ট দৃশ্যের জন্য বেশ কিছু কাজ করে নি, যেখানে আমি এমন পাঠগুলি পড়ছি যা আমার বর্তমান এক থেকে ভিন্ন OS থেকে উদ্ভূত হয়েছে। বিস্তারিত জানার জন্য আমি একটি লিনাক্স সার্ভারের উইন্ডোজ প্ল্যাটফর্ম থেকে ইমেল সংযুক্তি সংরক্ষণ করছি। জাভামাইল API থেকে ফিরে আসা ফাইল নামটি 'সি: \ temp \ hello.xls' এর মতো কিছু।

সমাধান আমি শেষ পর্যন্ত:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];

জাভা মাল্টিপ্ল্যাটফ্টের ক্ষেত্রে বিবেচনা করুন:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}

কোন নির্ভরতা ছাড়া একটি পদ্ধতি এবং যত্ন নেয় .. , এবং সদৃশ বিভাজক।

public static String getFileName(String filePath) {
    if( filePath==null || filePath.length()==0 )
        return "";
    filePath = filePath.replaceAll("[/\\\\]+", "/");
    int len = filePath.length(),
        upCount = 0;
    while( len>0 ) {
        //remove trailing separator
        if( filePath.charAt(len-1)=='/' ) {
            len--;
            if( len==0 )
                return "";
        }
        int lastInd = filePath.lastIndexOf('/', len-1);
        String fileName = filePath.substring(lastInd+1, len);
        if( fileName.equals(".") ) {
            len--;
        }
        else if( fileName.equals("..") ) {
            len -= 2;
            upCount++;
        }
        else {
            if( upCount==0 )
                return fileName;
            upCount--;
            len -= fileName.length();
        }
    }
    return "";
}

পরীক্ষা ক্ষেত্রে:

@Test
public void testGetFileName() {
    assertEquals("", getFileName("/"));
    assertEquals("", getFileName("////"));
    assertEquals("", getFileName("//C//.//../"));
    assertEquals("", getFileName("C//.//../"));
    assertEquals("C", getFileName("C"));
    assertEquals("C", getFileName("/C"));
    assertEquals("C", getFileName("/C/"));
    assertEquals("C", getFileName("//C//"));
    assertEquals("C", getFileName("/A/B/C/"));
    assertEquals("C", getFileName("/A/B/C"));
    assertEquals("C", getFileName("/C/./B/../"));
    assertEquals("C", getFileName("//C//./B//..///"));
    assertEquals("user", getFileName("/user/java/.."));
    assertEquals("C:", getFileName("C:"));
    assertEquals("C:", getFileName("/C:"));
    assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
    assertEquals("C.ext", getFileName("/A/B/C.ext"));
    assertEquals("C.ext", getFileName("C.ext"));
}

হয়তো getFileName একটি বিভ্রান্তিকর, কারণ এটি ডিরেক্টরি নাম ফেরত দেয়। এটি একটি পাথের ফাইল বা সর্বশেষ ডিরেক্টরি নাম প্রদান করে।


বিকল্প ব্যবহার করে Path (জাভা 7+):

Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();

মনে রাখবেন যে \\ স্ট্রিংটি বিভক্ত করা হচ্ছে প্ল্যাটফর্মের উপর ভিত্তি করে ফাইল বিভাজক পরিবর্তিত হতে পারে। Path#getName আপনার জন্য সেই সমস্যাটির যত্ন নেয়।


1.7 থেকে

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();

আপনি পাথ = সি ব্যবহার করতে পারেন: \ হ্যালো \ AnotherFolder \ TheFileName.PDF

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());

শুধু File.getName() ব্যবহার করুন

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());

স্ট্রিং পদ্ধতি ব্যবহার করে :

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));

আপনি যে String সম্পর্কে জিজ্ঞাসা করা হয় বিবেচনা

C:\Hello\AnotherFolder\The File Name.PDF

আমরা শেষ বিভাজক, অর্থাত্ সবকিছু পরে নিষ্কাশন করতে হবে। \ । যে আমরা আগ্রহী হয়।

আপনি করতে পারেন

String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);

এটি আপনার String শেষের সূচীটি পুনরুদ্ধার করবে এবং এটির পরে যে সমস্ত fileName আসবে তা বের করবে।

যদি আপনার আলাদা বিভাজকের সাথে String থাকে তবে lastIndexOf ব্যবহার করার জন্য শেষ lastIndexOf সামঞ্জস্য করুন। (একটি overload এমনকি একটি বিভাজক হিসাবে একটি সম্পূর্ণ String গ্রহণ করে।)

আমি উপরের উদাহরণে এটি বাদ দিয়েছি, তবে String কোনটি থেকে আসে বা এটিতে কী হতে পারে সে বিষয়ে আপনি নিশ্চিত না হন তবে আপনি lastIndexOf যাচাই করতে lastIndexOf যে শেষ lastIndexOf একটি অ-নেতিবাচক মান প্রদান করে কারণ lastIndexOf overload এটি ফিরে আসবে

-1 যদি এমন কোন ঘটনা ঘটে না


Guava এমন একটি পদ্ধতি রয়েছে যা কমন্স আইউটিল থেকে পাওয়া যায় যে উইলি আউস রোহর উল্লেখ করেছেন:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

// ...

String text = Files.toString(new File(path), Charsets.UTF_8);

অস্কার Reyes দ্বারা সম্পাদন করুন

এটি উদ্ধৃত লাইব্রেরীতে (সরলীকৃত) অন্তর্নিহিত কোড:

InputStream in = new FileInputStream(file);
byte[] b  = new byte[file.length()];
int len = b.length;
int total = 0;

while (total < len) {
  int result = in.read(b, total, len - total);
  if (result == -1) {
    break;
  }
  total += result;
}

return new String( b , Charsets.UTF_8 );

সম্পাদনা (Jonik দ্বারা): উপরেরটি সাম্প্রতিক গুয়াভা সংস্করণের উত্স কোডের সাথে মেলে না। বর্তমান উৎসের জন্য com.google.common.io প্যাকেজে ক্লাস Files , CharStreams , ByteSource এবং CharSource





java file filenames filepath