मैं संसाधन फ़ोल्डर से फ़ाइल कैसे लोड करूं?


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")
आजमाएँ


@ यह काम किया (कारण यह बदले में पूर्ण पथ url देगा) हालांकि पल मैं जार फ़ाइल बनाते हैं यह एक जार के अंदर के रूप में काम नहीं कर रहा है और निरपेक्ष पथ अमान्य हो जाता है, क्या खुद को सापेक्ष पथ के साथ खेलने का एक तरीका है
ShankPossible

जवाबों:


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. इसे वेकबैक मशीन में देखें
  2. इसके अलावा GitHub में

14
उत्तर के लिए thx, क्या आप बता सकते हैं कि हमें इस विशिष्ट लोडर का उपयोग क्यों करना चाहिए लेकिन कक्षा का नहीं?
हुई वांग

1
महान, मैं बहुत बेवकूफ हूं जो मैं Object.class.getClassLoader();एक स्थिर संदर्भ से उपयोग कर रहा था , जो काम नहीं करता था - यह सुझाव करता है - लगभग अच्छी तरह से, यह %20उन रिक्त स्थान के लिए इंजेक्ट करता है जो मुझे एक देता हैFileNotFoundException
ycomp

5
@ycomp क्योंकि getResource एक URL देता है, एक फ़ाइल नहीं। Java.net.URL की getFile विधि एक URL को एक फ़ाइल में परिवर्तित नहीं करती है ; यह केवल URL का पथ और क्वेरी भाग लौटाता है। आपको इसे किसी फ़ाइल में बदलने की कोशिश भी नहीं करनी चाहिए; बस ओपनस्ट्रीम को कॉल करें और उसी से पढ़ें।
वीजीआर

इस प्रोजेक्ट की जाँच करें, रिसोर्स फ़ोल्डर स्कैनिंग को हल करता है: github.com/fraballi/resources-folder-scanner
फेलिक्स अबल्ली

60

प्रयत्न:

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

IIRC getResourceAsStream()डिफ़ॉल्ट रूप से वर्ग के पैकेज के सापेक्ष है।

जैसा कि @Terran ने कहा, /फ़ाइल नाम की शुरुआत में जोड़ना न भूलें


3
पवित्रता चाहने वालों के लिए, यह पोस्ट आपको संसाधन प्राप्त करने के लिए सभी तरह से एक String stackoverflow.com/a/35446009/544045
ट्रेवर

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);

क्या InputStream को बंद नहीं किया जाना चाहिए?
०३०

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");

यदि आप संसाधन खोजने के लिए क्लास-क्लास का संदर्भ लेते हैं, तो निश्चित रूप से आवेदन प्रदर्शन पर खर्च होगा।


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

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;

निम्नलिखित विधि स्ट्रिंग्स के एक 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

मावेन-बिल्ड जार को नहीं चलाने पर कोड काम करता है, उदाहरण के लिए जब आपके आईडीई से चल रहा हो? यदि हां, तो सुनिश्चित करें कि फ़ाइल वास्तव में जार में शामिल है। संसाधन फ़ोल्डर को pom फ़ाइल में, में शामिल किया जाना चाहिए <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

मैंने इसे रनिंग जार और IDE दोनों में काम किया

 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

आप फ़ाइल के url को पढ़ने के लिए com.google.common.io.Resources.getResource का उपयोग कर सकते हैं और फिर फ़ाइल की सामग्री को पढ़ने के लिए java.nio.file.Files का उपयोग करके फ़ाइल सामग्री प्राप्त कर सकते हैं।

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

-2

मुझे यह "क्लास" या "क्लासऑलडर" के संदर्भ के बिना काम करने के लिए मिलता है।

मान लें कि हमारे पास फ़ाइल के स्थान के साथ तीन परिदृश्य हैं 'example.file' और आपकी कार्यशील निर्देशिका (जहां आपका ऐप निष्पादित होता है) घर / mydocuments / प्रोग्राम / प्रोजेक्ट / myapp है:

क) एक उप फ़ोल्डर काम कर रहे निर्देशिका के वंशज: myapp / Res / files / example.file

ख) एक उप फ़ोल्डर काम कर रहे निर्देशिका के वंशज नहीं है: परियोजनाएं / फाइलें / example.file

b2) एक और उप फ़ोल्डर काम कर रहे निर्देशिका के वंशज नहीं हैं: कार्यक्रम / फ़ाइलें / example.file

ग) एक रूट फ़ोल्डर: घर / mydocuments / फ़ाइलें / example.file (लिनक्स; विंडोज में सी के साथ घर / जगह)

1) सही रास्ता पाएं: a) String path = "res/files/example.file"; b) String path = "../projects/files/example.file" b2) String path = "../../program/files/example.file" c)String path = "/home/mydocuments/files/example.file"

मूल रूप से, यदि यह एक रूट फ़ोल्डर है, तो पथ का नाम अग्रणी स्लैश से शुरू करें। यदि यह सब फ़ोल्डर है, तो पथ नाम से पहले कोई स्लैश नहीं होना चाहिए। यदि उप फ़ोल्डर कार्यशील निर्देशिका के वंशज नहीं है, तो आपको "../" का उपयोग करके इसे सीडी करना होगा। यह सिस्टम को एक फ़ोल्डर ऊपर जाने के लिए कहता है।

2) सही रास्ते से गुजर कर एक फ़ाइल ऑब्जेक्ट बनाएँ:

File file = new File(path);

3) अब आप जाने के लिए अच्छे हैं:

BufferedReader br = new BufferedReader(new FileReader(file));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.