Как действительно читать текстовый файл из classpath в Java

366

Я пытаюсь прочитать текстовый файл, который установлен в системной переменной CLASSPATH. Не пользовательская переменная.

Я пытаюсь получить входной поток в файл, как показано ниже:

Поместите каталог file ( D:\myDir) в CLASSPATH и попробуйте ниже:

InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");

Поместите полный путь к файлу ( D:\myDir\SomeTextFile.txt) в CLASSPATH и попробуйте те же 3 строки кода выше.

Но, к сожалению, никто из них не работает, и я всегда nullвхожу в мой InputStream in.

Чайтанья МСВ
источник

Ответы:

605

С каталогом на пути к классам из класса, загруженного тем же загрузчиком классов, вы сможете использовать любой из:

// From ClassLoader, all paths are "absolute" already - there's no context
// from which they could be relative. Therefore you don't need a leading slash.
InputStream in = this.getClass().getClassLoader()
                                .getResourceAsStream("SomeTextFile.txt");
// From Class, the path is relative to the package of the class unless
// you include a leading slash, so if you don't want to use the current
// package, include a slash like this:
InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

Если они не работают, это говорит о том, что что-то еще не так.

Например, возьмем этот код:

package dummy;

import java.io.*;

public class Test
{
    public static void main(String[] args)
    {
        InputStream stream = Test.class.getResourceAsStream("/SomeTextFile.txt");
        System.out.println(stream != null);
        stream = Test.class.getClassLoader().getResourceAsStream("SomeTextFile.txt");
        System.out.println(stream != null);
    }
}

И эта структура каталогов:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

И затем (используя разделитель пути Unix, как я на Linux box):

java -classpath code:txt dummy.Test

Результаты:

true
true
Джон Скит
источник
2
Вы перепутали относительные и абсолютные пути. Путь, начинающийся с «/», является абсолютным (т. Е. Начинается с того, что указано в CLASSPATH). Все остальные пути относятся к пакету класса, к которому вы getResourceAsStream()
обращаетесь
13
Нет, ты сломал мой пример. Я отредактирую комментарии, чтобы сделать их более понятными, но суть в том, что при использовании ClassLoader все пути уже считаются абсолютными. Там нет ничего для них быть по отношению к.
Джон Скит
6
Также не используйте Java.IO.File.Separator. Это не будет работать на окнах. Если вы запускаете этот код в Windows, он все равно должен быть «/», а не «\»
Pradhan
28
@Pradhan: Нет, вы не должны использовать File.Separator- потому что вы не запрашиваете файл , вы запрашиваете ресурс . Важно понимать, что используемая абстракция - это не файловая система.
Джон Скит
1
@jagdpanzer: Ну, это в основном только для классов, которые загружаются одним и тем же загрузчиком классов, и это потому, что Class.getResourceAsStreamэто действительно удобный метод для вызова ClassLoader.getResourceAsStream, но с дополнительной функцией «относительных» ресурсов. Если вы указываете абсолютный ресурс, то любой вызов, использующий тот же загрузчик классов, будет делать то же самое.
Джон Скит
115

При использовании Spring Framework (в виде набора утилит или контейнера - вам не нужно использовать последнюю функциональность) вы можете легко использовать абстракцию Resource .

Resource resource = new ClassPathResource("com/example/Foo.class");

Через интерфейс Resource вы можете получить доступ к ресурсу как InputStream , URL , URI или File . Изменение типа ресурса, например, ресурса файловой системы, является простым вопросом изменения экземпляра.

зевать
источник
6
Не могли бы вы предоставить пример кода о том, как это можно использовать в файловом вводе / выводе? Я не могу найти приличного , явного и простого способа использования его в Интернете: ((((
Работает как шарм. Предоставленный один лайнер - это все, что вам нужно. Используйте анализ потока из других примеров, если вы не знаете, как получить строку из потока.
Джозеф Луст
У меня возникли некоторые проблемы, когда я точно понял, что делать с переменной ресурса. Я отредактировал ответ немного подробнее
DavidZemon
Я уже использовал Spring и пробовал «чистый Java» путь. Это убивало меня, различия между getResource, getResourceAsStream и т. Д., Без хороших рабочих примеров. Это прекрасный пример инкапсуляции, поэтому мне все равно.
TinkerTenorSoftwareGuy
1
Будьте осторожны, если вы упаковываете свой проект в jar, вы должны использовать InputStream. Если вы используете файл, он работает в вашей IDE, но не будет работать, если вы протестируете его из фляги. Если вам действительно нужен файл, попробуйте с stackoverflow.com/questions/4317035/…
Рафаэль Мембривс
58

Вот как я читаю все строки текстового файла на моем пути к классам, используя Java 7 NIO:

...
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

...

Files.readAllLines(
    Paths.get(this.getClass().getResource("res.txt").toURI()), Charset.defaultCharset());

NB это пример того, как это можно сделать. Вам придется вносить улучшения по мере необходимости. Этот пример будет работать только в том случае, если файл действительно присутствует в вашем пути к классам, в противном случае будет выдано исключение NullPointerException, когда getResource () вернет null и для него будет вызван .toURI ().

Кроме того, начиная с Java 7, одним удобным способом задания наборов символов является использование констант, определенных в java.nio.charset.StandardCharsets (они, в соответствии с их javadocs , «гарантированно будут доступны в каждой реализации платформы Java».).

Следовательно, если вы знаете кодировку файла UTF-8, то укажите явно кодировку StandardCharsets.UTF_8

Петер Перхач
источник
1
Спасибо за решение NIO - так мало людей используют этот замечательный API, это позор.
mvreijn
7
Чтобы прочитать в одной строке, попробуйте. новая строка (Files.readAllBytes (Paths.get (MyClass.class.getResource (resource) .toURI ())));
Тео Бриско
2
Лучшее решение для меня, так как оно не нуждается в каких-либо зависимостях, таких как Spring или Commons IO.
Берни
1
Это не удастся, если ваш файл ресурсов находится внутри jar, например, в модуле maven. В этом случае вам нужно использовать что-то вроде Springs StreamUtils.copyToString.
Сому
26

Пожалуйста, попробуй

InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

Ваши попытки не сработали, потому что только загрузчик классов для ваших классов может загружаться из пути к классам. Вы использовали загрузчик классов для самой системы Java.

Тангенс
источник
Не уверен насчет "/", хотя. Относительный путь может работать лучше в этом случае.
VonC
3
Если вы используете его без "/", вы ищете свой файл в пакете "this".
тангенс
1
InputStream file = this.getClass (). GetResourceAsStream ("SomeTextFile.txt"); InputStream file = this.getClass (). GetResourceAsStream ("/ SomeTextFile.txt"); InputStream file = this.getClass (). GetResourceAsStream ("// SomeTextFile.txt"); Ничто из вышеперечисленного не сработало :(
Чайтанья MSV
@ Чайтанья: Можете ли вы привести пример из ответа Джона Скита?
Аарон Дигулла
20

Чтобы на самом деле прочитать содержимое файла, мне нравится использовать Commons IO + Spring Core. Предполагая Java 8:

try (InputStream stream = new ClassPathResource("package/resource").getInputStream()) {
    IOUtils.toString(stream);
}

В качестве альтернативы:

InputStream stream = null;
try {
    stream = new ClassPathResource("/log4j.xml").getInputStream();
    IOUtils.toString(stream);
} finally {
    IOUtils.closeQuietly(stream);
}
Павел
источник
Как насчет закрытия входного потока?
Стефан
Поток будет закрыт автоматически. Это особенность Java 7 «Попробуй с ресурсами» docs.oracle.com/javase/tutorial/essential/exceptions/…
Михал Мацей Галушка
Только если он находится внутри оператора try, а здесь это не так. Надо было попробовать (final InputStream stream = new ClassPathResource ("/ log4j.xml"). GetInputStream ()) {...
andresp
15

Чтобы получить абсолютный путь к классу, попробуйте это:

String url = this.getClass().getResource("").getPath();
Webcom
источник
А что потом? Эта информация бесполезна сама по себе.
Маркиз Лорн
Эта информация была идеальной. Мне не хватало только getPath ()!
Патрик
@Patrick Этот ответ не предоставляет «абсолютный путь класса». Он предоставляет URL. Совсем не одно и то же.
маркиз Лорн
12

Каким-то образом лучший ответ не работает для меня. Мне нужно использовать немного другой код вместо этого.

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("SomeTextFile.txt");

Я надеюсь, что это поможет тем, кто сталкивается с той же проблемой.

user1695166
источник
Это помогло мне и на Android, где класс был загружен загрузчиком приложения, но ключ, который ему был нужен, был лениво загружен в поток пользовательского интерфейса.
Asokan
Вам необходимо предоставить информацию о том, почему лучший ответ не работает для вас (например, структура вашего приложения, используемая вами структура, ошибка и т. Д.). Лучший ответ ясно сказал, что 1) каталог должен находиться в пути к классам, 2) вам нужно запросить класс, загруженный тем же загрузчиком классов. Скорее всего, одно из этих предположений не относится к вашему заявлению. Кроме того, загрузчик классов контекста очень не рекомендуется, поскольку он был введен как хакерский. Некоторые фреймворки действительно используют его, но важно знать смысл (который требует, чтобы вы описали фон вашего проекта)
Xinchao
6

Если вы используете гуаву:

import com.google.common.io.Resources;

мы можем получить URL от CLASSPATH:

URL resource = Resources.getResource("test.txt");
String file = resource.getFile();   // get file path 

или InputStream:

InputStream is = Resources.getResource("test.txt").openStream();
Алексей Симонов
источник
Путь к файлу бесполезен, если ресурс находится в файле JAR или WAR.
Маркиз Лорн
Метод URL getFile не возвращает имя файла. Он просто возвращает часть пути URL, которая не обязательно является допустимым именем файла. (Класс URL был частью Java 1.0; тогда большинство URL действительно ссылались на физические файлы на одном и том же компьютере или на другом компьютере.)
VGR
3

Чтобы прочитать содержимое файла в строку из classpath, вы можете использовать это:

private String resourceToString(String filePath) throws IOException, URISyntaxException
{
    try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath))
    {
        return IOUtils.toString(inputStream);
    }
}

Примечание:
IOUtilsявляется частью Commons IO.

Назовите это так:

String fileContents = resourceToString("ImOnTheClasspath.txt");
BullyWiiPlaza
источник
1

Вы говорите: «Я пытаюсь прочитать текстовый файл, заданный в системной переменной CLASSPATH». Я предполагаю, что это в Windows, и вы используете этот уродливый диалог для редактирования «Системных переменных».

Теперь вы запускаете свою Java-программу в консоли. И это не работает: консоль получает копию значений системных переменных один раз при запуске . Это означает, что любое изменение в диалоге впоследствии не имеет никакого эффекта.

Есть эти решения:

  1. Запускать новую консоль после каждого изменения

  2. Используйте set CLASSPATH=...в консоли, чтобы установить копию переменной в консоли, и когда ваш код заработает, вставьте последнее значение в диалоговое окно переменной.

  3. Поместите вызов Java в .BATфайл и дважды щелкните по нему. Это будет каждый раз создавать новую консоль (таким образом, копируя текущее значение системной переменной).

ВНИМАНИЕ: Если у вас также есть переменная User, CLASSPATHона будет скрывать вашу системную переменную. Вот почему обычно лучше поместить вызов вашей Java-программы в .BATфайл и указать там путь к классу (используя set CLASSPATH=), а не полагаться на глобальную системную или пользовательскую переменную.

Это также гарантирует, что вы можете иметь более одной Java-программы, работающей на вашем компьютере, поскольку они обязательно имеют разные пути к классам.

Аарон Дигулла
источник
0

Мой ответ не совсем то, что задают в вопросе. Скорее, я даю решение, как легко мы можем прочитать файл в наше Java-приложение из нашего пути к классам проекта.

Например, предположим, что имя файла конфигурации example.xml находится по следующему пути:

com.myproject.config.dev

и наш исполняемый файл класса Java находится по следующему пути: -

com.myproject.server.main

Теперь просто проверьте оба указанных выше пути, которые являются ближайшим общим каталогом / папкой, откуда вы можете получить доступ как к dev, так и к главному каталогу / папке (com.myproject.server.main - там, где существует исполняемый класс java нашего приложения) - Мы можем видеть что это папка / каталог myproject, которая является ближайшей общей папкой / папкой, откуда мы можем получить доступ к нашему файлу example.xml. Поэтому из исполняемого класса java, находящегося в папке / директории main, мы должны вернуться на два шага, как ../../, чтобы получить доступ к myproject . Теперь, следуя этому, посмотрим, как мы можем прочитать файл: -

package com.myproject.server.main;

class Example {

  File xmlFile;

  public Example(){
       String filePath = this.getClass().getResource("../../config/dev/example.xml").getPath();
       this.xmlFile = new File(filePath);
    }

  public File getXMLFile() {
      return this.xmlFile;
  }
   public static void main(String args[]){
      Example ex = new Example();
      File xmlFile = ex.getXMLFile();
   }
}
Абхиджит Притам Датта
источник
0

Если вы компилируете свой проект в jar-файл: вы можете поместить свой файл в resources / files / your_file.text или pdf;

и используйте этот код:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;

public class readFileService(){
    private static final Logger LOGGER = LoggerFactory.getLogger(readFileService.class);


    public byte[] getFile(){
        String filePath="/files/your_file";
        InputStream inputStreamFile;
        byte[] bytes;
        try{
            inputStreamFile = this.getClass().getResourceAsStream(filePath);
            bytes = new byte[inputStreamFile.available()];
            inputStreamFile.read(bytes);    
        } catch(NullPointerException | IOException e) {
            LOGGER.error("Erreur read file "+filePath+" error message :" +e.getMessage());
            return null;
        }
        return bytes;
    } 
}
Ахмед АЛИ
источник
-1

Я использую сервер приложений webshpere, и мой веб-модуль построен на Spring MVC. Они Test.propertiesбыли расположены в папке ресурсов, я попытался загрузить эти файлы, используя следующее:

  1. this.getClass().getClassLoader().getResourceAsStream("Test.properties");
  2. this.getClass().getResourceAsStream("/Test.properties");

Ни один из приведенных выше кодов не загружал файл.

Но с помощью приведенного ниже кода файл свойств был успешно загружен:

Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");

Спасибо пользователю "user1695166" .

Сардар Сайх
источник
1
Добро пожаловать в переполнение стека! Пожалуйста, не добавляйте «спасибо» в качестве ответов, даже если вы также частично предоставляете информацию о том, как прошло ваше решение, если ваши решения совпадают с другими публикациями, добавлять их не нужно. После того, как вы потратите некоторое время на сайт, вы получите достаточные привилегии для ответа на понравившиеся вам ответы, что является способом переполнения стека сказать спасибо.
SuperBiasedMan
-1

использование org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));

Чару Хурана
источник
ссылка на src не должна использоваться ... Не работает в конечном артефакте.
Л. Холанда
-1

Сценарий:

1) client-service-1.0-SNAPSHOT.jarимеет зависимостьread-classpath-resource-1.0-SNAPSHOT.jar

2) мы хотим прочитать содержимое ресурсов пути к классам ( sample.txt) из read-classpath-resource-1.0-SNAPSHOT.jarthrough client-service-1.0-SNAPSHOT.jar.

3) read-classpath-resource-1.0-SNAPSHOT.jarимеетsrc/main/resources/sample.txt

Вот рабочий пример кода, который я подготовил, после 2-3 дней, потраченных на разработку, я нашел полное комплексное решение, надеюсь, это поможет сэкономить ваше время

1. pom.xmlизread-classpath-resource-1.0-SNAPSHOT.jar

<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>jar-classpath-resource</groupId>
            <artifactId>read-classpath-resource</artifactId>
            <version>1.0-SNAPSHOT</version>
            <name>classpath-test</name>
            <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <org.springframework.version>4.3.3.RELEASE</org.springframework.version>
                <mvn.release.plugin>2.5.1</mvn.release.plugin>
                <output.path>${project.artifactId}</output.path>
                <io.dropwizard.version>1.0.3</io.dropwizard.version>
                <commons-io.verion>2.4</commons-io.verion>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>${commons-io.verion}</version>
                </dependency>
            </dependencies>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                    </resource>
                </resources>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-release-plugin</artifactId>
                        <version>${mvn.release.plugin}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.1</version>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                            <encoding>UTF-8</encoding>
                        </configuration>
                    </plugin>
                    <plugin>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>2.5</version>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <archive>
                                <manifest>
                                    <addClasspath>true</addClasspath>
                                    <useUniqueVersions>false</useUniqueVersions>
                                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                    <mainClass>demo.read.classpath.resources.ClassPathResourceReadTest</mainClass>
                                </manifest>
                                <manifestEntries>
                                    <Implementation-Artifact-Id>${project.artifactId}</Implementation-Artifact-Id>
                                    <Class-Path>sample.txt</Class-Path>
                                </manifestEntries>
                            </archive>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-shade-plugin</artifactId>
                        <version>2.2</version>
                        <configuration>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>shade</goal>
                                </goals>
                                <configuration>
                                    <transformers>
                                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                            <mainClass>demo.read.classpath.resources.ClassPathResourceReadTest</mainClass>
                                        </transformer>
                                    </transformers>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </project>

2. ClassPathResourceReadTest.javaкласс, read-classpath-resource-1.0-SNAPSHOT.jarкоторый загружает содержимое файла ресурсов пути к классу.

package demo.read.classpath.resources;

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

public final class ClassPathResourceReadTest {
    public ClassPathResourceReadTest() throws IOException {
        InputStream inputStream = getClass().getResourceAsStream("/sample.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        List<Object> list = new ArrayList<>();
        String line;
        while ((line = reader.readLine()) != null) {
            list.add(line);
        }
        for (Object s1: list) {
            System.out.println("@@@ " +s1);
        }
        System.out.println("getClass().getResourceAsStream('/sample.txt') lines: "+list.size());
    }
}

3. pom.xmlизclient-service-1.0-SNAPSHOT.jar

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>client-service</groupId>
    <artifactId>client-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>jar-classpath-resource</groupId>
            <artifactId>read-classpath-resource</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <useUniqueVersions>false</useUniqueVersions>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <mainClass>com.crazy.issue.client.AccessClassPathResource</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Implementation-Artifact-Id>${project.artifactId}</Implementation-Artifact-Id>
                            <Implementation-Source-SHA>${buildNumber}</Implementation-Source-SHA>
                            <Class-Path>sample.txt</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.crazy.issue.client.AccessClassPathResource</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

4. AccessClassPathResource.javaсоздать экземпляр ClassPathResourceReadTest.javaкласса, в котором он будет загружаться sample.txtи печатать его содержимое.

package com.crazy.issue.client;

import demo.read.classpath.resources.ClassPathResourceReadTest;
import java.io.IOException;

public class AccessClassPathResource {
    public static void main(String[] args) throws IOException {
        ClassPathResourceReadTest test = new ClassPathResourceReadTest();
    }
}

5. Запустите исполняемый флягу следующим образом:

[ravibeli@localhost lib]$ java -jar client-service-1.0-SNAPSHOT.jar
****************************************
I am in resources directory of read-classpath-resource-1.0-SNAPSHOT.jar
****************************************
3) getClass().getResourceAsStream('/sample.txt'): 3
ravibeli
источник
-2

Не используйте метод getClassLoader () и используйте «/» перед именем файла. "/" очень важно

this.getClass().getResourceAsStream("/SomeTextFile.txt");
sachinthana87
источник
Использование ведущего /имеет тот же эффект, что и getClassLoader()метод.
Маркиз Лорн
-4
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile

{
    /**
     * * feel free to make any modification I have have been here so I feel you
     * * * @param args * @throws InterruptedException
     */

    public static void main(String[] args) throws InterruptedException {
        // thread pool of 10
        File dir = new File(".");
        // read file from same directory as source //
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();
            for (File file : files) {
                // if you wanna read file name with txt files
                if (file.getName().contains("txt")) {
                    System.out.println(file.getName());
                }

                // if you want to open text file and read each line then
                if (file.getName().contains("txt")) {
                    try {
                        // FileReader reads text files in the default encoding.
                        FileReader fileReader = new FileReader(
                                file.getAbsolutePath());
                        // Always wrap FileReader in BufferedReader.
                        BufferedReader bufferedReader = new BufferedReader(
                                fileReader);
                        String line;
                        // get file details and get info you need.
                        while ((line = bufferedReader.readLine()) != null) {
                            System.out.println(line);
                            // here you can say...
                            // System.out.println(line.substring(0, 10)); this
                            // prints from 0 to 10 indext
                        }
                    } catch (FileNotFoundException ex) {
                        System.out.println("Unable to open file '"
                                + file.getName() + "'");
                    } catch (IOException ex) {
                        System.out.println("Error reading file '"
                                + file.getName() + "'");
                        // Or we could just do this:
                        ex.printStackTrace();
                    }
                }
            }
        }

    }

}
помощник
источник
Не отвечает на вопрос в любом случае.
Маркиз Лорн
-5

Вы должны поместить свою 'системную переменную' в путь к классам Java.

Salandur
источник
Я поставил саму Системную переменную.
Чайтанья MSV
Системная переменная - это Java CLASSPATH. Ответ не имеет смысла.
Маркиз Лорн
Совершенно верно ... даже не помню, как писал этот ответ :)
Salandur