রিসোর্স ফোল্ডার থেকে আমি কীভাবে কোনও ফাইল লোড করব?


240

আমার প্রকল্পের নিম্নলিখিত কাঠামো রয়েছে:

/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/

আমার একটি ফাইল রয়েছে /src/test/resources/test.csvএবং আমি ইউনিট পরীক্ষা থেকে ফাইলটি লোড করতে চাই/src/test/java/MyTest.java

আমার এই কোডটি রয়েছে যা কার্যকর হয়নি। এটি "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" অভিযোগ করে।

BufferedReader br = new BufferedReader (new FileReader(test.csv))

আমিও এই চেষ্টা করেছিলাম

InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))

এটিও কাজ করে না। এটি ফিরে আসে null। আমি আমার প্রকল্পটি তৈরি করতে মাভেনকে ব্যবহার করছি।


কিভাবে কাজ করে না? আপনার ত্রুটি কী?
ড্যানিয়েল কাপলান

17
এটি ব্যবহার করে দেখুনthis.getClass().getResource("/test.csv")
এসআরআই


@ এসআর এটি কাজ করেছেন (কারণ এটি এর বিনিময়ে নিখুঁত পাথ ইউআরএল দেবে) তবে যে মুহুর্তে আমি জার ফাইলটি এটি একটি জারের অভ্যন্তরের হিসাবে কাজ করছে না এবং চূড়ান্ত পথটি অবৈধ হয়ে যায়, আপেক্ষিক পথের সাথে নিজেই খেলার উপায় আছে
শঙ্কপসিবল

উত্তর:


240

পরবর্তী চেষ্টা করুন:

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("test.csv");

যদি উপরের কাজ না করে তবে বিভিন্ন প্রকল্পগুলি নিম্নলিখিত শ্রেণীর সাথে যুক্ত করা হয়েছে: 1 ( এখানে কোড )। 2ClassLoaderUtil

শ্রেণিটি কীভাবে ব্যবহৃত হয় তার কয়েকটি উদাহরণ এখানে রয়েছে:

src \ প্রধান \ জাভা \ কম \ কোম্পানী \ পরীক্ষা \ YourCallingClass.java
src \ প্রধান \ জাভা \ কম \ opensymphony \ xwork2 \ util \ ClassLoaderUtil.java
src \ প্রধান \ সম্পদ \ test.csv
// java.net.URL
URL url = ClassLoaderUtil.getResource("test.csv", YourCallingClass.class);
Path path = Paths.get(url.toURI());
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
// java.io.InputStream
InputStream inputStream = ClassLoaderUtil.getResourceAsStream("test.csv", YourCallingClass.class);
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
    // Process line
}

মন্তব্য

  1. এটি দেখুন মধ্যে Wayback মেশিন
  2. এছাড়াও GitHub

14
উত্তরের জন্য THX, আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন আমাদের এই খুব নির্দিষ্ট লোডারটি ব্যবহার করা উচিত তবে শ্রেণির নয়?
হুই ওয়াং

1
দুর্দান্ত, আমি এতটা বোকা যে আমি ব্যবহার করছি Object.class.getClassLoader();, স্থির প্রেক্ষাপট থেকে যা কাজ করে নি - এই পরামর্শটি করে - প্রায়, এটি এমন %20জায়গাগুলির জন্য ইনজেকশন দেয় যা আমাকে একটি দেয়FileNotFoundException
ycomp

5
@comp কারণ গেটআরসোর্স একটি URL দেয়, কোনও ফাইল দেয় না। Java.net.URL- এর getFile পদ্ধতি কোনও URLকে কোনও ফাইলে রূপান্তর করে না ; এটি কেবল URL এর পথ এবং ক্যোয়ারীর অংশগুলি ফেরত দেয়। এমনকি আপনি এটিকে কোনও ফাইলে রূপান্তর করার চেষ্টাও করবেন না; কেবল ওপেনস্ট্রিমে কল করুন এবং সেখান থেকে পড়ুন।
ভিজিআর

এই প্রকল্পটি দেখুন, রিসোর্স ফোল্ডার স্ক্যানিং সমাধান করে: github.com/fraballi/resources-folder-scanner
ফেলিক্স

60

চেষ্টা করুন:

InputStream is = MyTest.class.getResourceAsStream("/test.csv");

IIRC getResourceAsStream() ডিফল্টরূপে শ্রেণীর প্যাকেজের সাথে সম্পর্কিত।

@ তেরান যেমন উল্লেখ করেছেন, /ফাইলের নামের শুরুতে এটি যুক্ত করতে ভুলবেন না


3
অসম্পূর্ণতা অনুসন্ধানকারীদের জন্য, এই পোস্টটি আপনাকে String স্ট্যাকওভারফ্লো.com
ট্রেভর

12
"/" কী।
তেরান

33

পেয়ারা ব্যবহারের সাথে এখানে একটি দ্রুত সমাধান দেওয়া হয়েছে :

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

public String readResource(final String fileName, Charset charset) throws IOException {
        return Resources.toString(Resources.getResource(fileName), charset);
}

ব্যবহার:

String fixture = this.readResource("filename.txt", Charsets.UTF_8)

28

স্প্রিং প্রকল্পে প্রবাহিত কোডগুলি চেষ্টা করুন

ClassPathResource resource = new ClassPathResource("fileName");
InputStream inputStream = resource.getInputStream();

বা নন স্প্রিং প্রকল্পে

 ClassLoader classLoader = getClass().getClassLoader();
 File file = new File(classLoader.getResource("fileName").getFile());
 InputStream inputStream = new FileInputStream(file);

ইনপুটস্ট্রিমটি বন্ধ করা উচিত নয়?
030

7

অ বসন্ত প্রকল্প:

String filePath = Objects.requireNonNull(MyClass.class.getClassLoader().getResource("any.json")).getPath();

Stream<String> lines = Files.lines(Paths.get(filePath));

বসন্ত প্রকল্পগুলির জন্য, আপনি সংস্থান ফোল্ডারের অধীনে কোনও ফাইল পেতে একটি লাইন কোডও ব্যবহার করতে পারেন:

File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "any.json");

String content = new String(Files.readAllBytes(file.toPath()));

5

এখন আমি মাভেন তৈরি রিসোর্স ডিরেক্টরি থেকে একটি ফন্ট পড়ার উত্স কোডটি চিত্রিত করছি,

SCR / প্রধান / সম্পদ / calibril.ttf

এখানে চিত্র বর্ণনা লিখুন

Font getCalibriLightFont(int fontSize){
    Font font = null;
    try{
        URL fontURL = OneMethod.class.getResource("/calibril.ttf");
        InputStream fontStream = fontURL.openStream();
        font = new Font(Font.createFont(Font.TRUETYPE_FONT, fontStream).getFamily(), Font.PLAIN, fontSize);
        fontStream.close();
    }catch(IOException | FontFormatException ief){
        font = new Font("Arial", Font.PLAIN, fontSize);
        ief.printStackTrace();
    }   
    return font;
}

এটি আমার পক্ষে কাজ করেছে এবং আশা করি পুরো উত্স কোডটি আপনাকে সহায়তা করবে, উপভোগ করুন!


5

জাভা জন্য 1.7 পরে

 List<String> lines = Files.readAllLines(Paths.get(getClass().getResource("test.csv").toURI()));

আমার অবশ্যই "/test.csv" ব্যবহার করতে হবে (স্ল্যাশটি নোট করুন)।
লিওন

4
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("test.csv");

যদি আপনি কোনও উত্স সন্ধানের জন্য প্রাসঙ্গিক ClassLoader ব্যবহার করেন তবে অবশ্যই এটি প্রয়োগের কার্যকারিতা ব্যয় করবে।


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

6
@ মারভো: প্রোগ্রামারগণ অবশ্যই সর্বদা গুণমান, ক্ষমতা এবং রক্ষণাবেক্ষণের স্বাচ্ছন্দ্য সম্পর্কে উদ্বিগ্ন থাকতে হবে, কার্য সম্পাদন সারিতে রয়েছে।
ইগোর রদ্রিগেজ

2

নিম্নলিখিতটি আমদানি করুন:

import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.ArrayList;

নিম্নলিখিত পদ্ধতিটি স্ট্রিংগুলির একটি অ্যারেলিস্টে একটি ফাইল দেয়:

public ArrayList<String> loadFile(String filename){

  ArrayList<String> lines = new ArrayList<String>();

  try{

    ClassLoader classloader = Thread.currentThread().getContextClassLoader();
    InputStream inputStream = classloader.getResourceAsStream(filename);
    InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
    BufferedReader reader = new BufferedReader(streamReader);
    for (String line; (line = reader.readLine()) != null;) {
      lines.add(line);
    }

  }catch(FileNotFoundException fnfe){
    // process errors
  }catch(IOException ioe){
    // process errors
  }
  return lines;
}

2

আমি একই সমস্যা সম্মুখীন ।

ফাইলটি কোনও শ্রেণি লোডার দ্বারা পাওয়া যায় নি, যার অর্থ এটি আর্টেফ্যাক্ট (জারে) এ প্যাক করা হয়নি। আপনাকে প্রকল্পটি তৈরি করতে হবে । উদাহরণস্বরূপ, মেভেন সহ:

mvn clean install

সুতরাং আপনি যে ফাইলগুলি সংস্থান ফোল্ডারে যুক্ত করেছেন সেগুলি ম্যাভেন বিল্ডে প্রবেশ করবে এবং অ্যাপ্লিকেশনে উপলব্ধ হবে।

আমি আমার উত্তরটি রাখতে চাই: এটি কোনও ফাইল কীভাবে পড়তে হবে তা ব্যাখ্যা করে না (অন্যান্য উত্তরগুলি এটি ব্যাখ্যা করে), এটি কেন InputStream বা নালresource ছিল তার উত্তর দেয় । অনুরূপ উত্তর এখানে


1
ধন্যবাদ, আমি আমার মন হারাতে ভেবে আমাকে বাঁচালাম!
StuPointerException

1

getResource () src/main/resourcesকেবলমাত্র স্থাপন করা সংস্থান ফাইলগুলির সাথে সূক্ষ্মভাবে কাজ করছিল । এমন কোনও ফাইল পাওয়ার জন্য যা src/main/resourcesবলার অপেক্ষা রাখে না যে src/test/javaআপনি এটি পরিষ্কারভাবে তৈরি করতে হবে।

নিম্নলিখিত উদাহরণ আপনাকে সাহায্য করতে পারে

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

public class Main {
    public static void main(String[] args) throws URISyntaxException, IOException {
        URL location = Main.class.getProtectionDomain().getCodeSource().getLocation();
        BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/java/youfilename.txt")));
    }
}

0

মাভেন-বিল্ড জারটি চালাচ্ছেন না, উদাহরণস্বরূপ আপনার আইডিই থেকে চলাকালীন কোড কি কাজ করে? যদি তা হয় তবে নিশ্চিত হয়ে নিন যে ফাইলটি আসলে জারে অন্তর্ভুক্ত রয়েছে। সম্পদ ফোল্ডারে পম ফাইলে অন্তর্ভুক্ত করা উচিত, <build><resources>


গ্রহন এবং আইডিই থেকে চলমান কোডটি ব্যবহার করার সময়। বিশেষত ইউনিট পরীক্ষায় জাভা কোডের "/ src / টেস্ট / সংস্থানসমূহ" এ থাকা সংস্থানগুলি আমরা কীভাবে লোড করতে পারি। একটি স্ট্যান্ডার্ড মাভেন প্রকল্প কাঠামো বিবেচনা করুন।
ভবেশ

0

নিম্নলিখিত ক্লাসটি একটি resourceথেকে লোড করতে classpathএবং প্রদত্ত সমস্যাটিতে যদি কোনও সমস্যা ত্রুটি বার্তা প্রাপ্ত করতে ব্যবহৃত হয় filePath

import java.io.InputStream;
import java.nio.file.NoSuchFileException;

public class ResourceLoader
{
    private String filePath;

    public ResourceLoader(String filePath)
    {
        this.filePath = filePath;

        if(filePath.startsWith("/"))
        {
            throw new IllegalArgumentException("Relative paths may not have a leading slash!");
        }
    }

    public InputStream getResource() throws NoSuchFileException
    {
        ClassLoader classLoader = this.getClass().getClassLoader();

        InputStream inputStream = classLoader.getResourceAsStream(filePath);

        if(inputStream == null)
        {
            throw new NoSuchFileException("Resource file not found. Note that the current directory is the source folder!");
        }

        return inputStream;
    }
}

0

আমি /scr/main/resourcesআমার ফোল্ডার যুক্ত করে এই সমস্যার সমাধান করেছিJava Build Path

এখানে চিত্র বর্ণনা লিখুন


এটি ব্যবহার করে দেখুন তবে এটি সমাধান নয়
জেসনউ

0

আমি এটি লেখার মাধ্যমে চলমান জারে এবং আইডিই উভয় ক্ষেত্রেই কাজ পেয়েছি

 InputStream schemaStream = ProductUtil.class.getClassLoader().getResourceAsStream(jsonSchemaPath);
            byte[] buffer = new byte[schemaStream.available()];
            schemaStream.read(buffer);

        File tempFile = File.createTempFile("com/package/schema/testSchema", "json");
        tempFile.deleteOnExit();
        FileOutputStream out = new FileOutputStream(tempFile);
        out.write(buffer);

আপনার ফাইলের গঠনটি কেমন দেখাচ্ছে?
ভাগ্যডায়োনাল্ড


0

আপনি ফাইলের ইউআরএল পড়ার জন্য com.google.common.io.Resource.getResource ব্যবহার করতে পারেন এবং তারপরে java.nio.file. ফাইল ব্যবহার করে ফাইলের সামগ্রীটি পড়তে পারেন read

URL urlPath = Resources.getResource("src/main/resource");
List<String> multilineContent= Files.readAllLines(Paths.get(urlPath.toURI()));

-2

আমি "ক্লাস" বা "ক্লাসলোডার" এর কোনও রেফারেন্স ছাড়াই এটি কাজ করতে পারি।

ধরা যাক আমাদের 'উদাহরণ.file' ফাইল এবং আপনার ওয়ার্কিং ডিরেক্টরি (যেখানে আপনার অ্যাপ্লিকেশনটি কার্যকর করে) এর অবস্থান / মায়োডোকিউমেন্টস / প্রোগ্রাম / প্রকল্পগুলি / মাইএপ সহ তিনটি পরিস্থিতি রয়েছে:

ক) ওয়ার্কিং ডিরেক্টরিতে একটি সাব ফোল্ডার বংশধর: মায়াপ / রেজ / ফাইল / উদাহরণ.ফাইল

খ) একটি উপ ফোল্ডার কার্যকারী ডিরেক্টরিতে বংশধর নয়: প্রকল্প / ফাইল / উদাহরণ.file f

খ ২) অন্য একটি সাব ফোল্ডার ওয়ার্কিং ডিরেক্টরিতে বংশধর নয়: প্রোগ্রাম / ফাইল / উদাহরণ.file

গ) একটি মূল ফোল্ডার: হোম / মাইডোকিউমেন্টস / ফাইল / উদাহরণ.file (লিনাক্স; উইন্ডোজে হোম / সি এর সাথে প্রতিস্থাপন :)

1) সঠিক পথ পান: ক) String path = "res/files/example.file"; খ) খ 2 String path = "../projects/files/example.file" )String path = "../../program/files/example.file" গ)String path = "/home/mydocuments/files/example.file"

মূলত, এটি যদি মূল ফোল্ডার হয় তবে একটি শীর্ষস্থানীয় স্ল্যাশ দিয়ে পথের নামটি শুরু করুন। যদি এটি একটি সাব ফোল্ডার হয়, কোনও স্ল্যাশ পাথ নামের আগে হওয়া উচিত। যদি সাব ফোল্ডারটি ওয়ার্কিং ডিরেক্টরিতে বংশধর না হয় তবে আপনাকে "../" ব্যবহার করে এটিতে সিডি করতে হবে। এটি সিস্টেমকে একটি ফোল্ডার উপরে যেতে বলে।

2) সঠিক পথটি অতিক্রম করে একটি ফাইল অবজেক্ট তৈরি করুন:

File file = new File(path);

3) আপনি এখন যেতে ভাল:

BufferedReader br = new BufferedReader(new FileReader(file));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.