Як насправді читати текстовий файл з classpath на Java


366

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

Я намагаюся отримати вхідний потік у файл, як показано нижче:

Помістіть каталог файлу ( 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

З каталогом на classpath з класу, завантаженого одним і тим же завантажувачем, ви повинні мати можливість використовувати будь-яке з:

// 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):

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 = new ClassPathResource("com/example/Foo.class");

Через інтерфейс Resource ви можете отримати доступ до ресурсу у вигляді InputStream , URL , URI або File . Зміна типу ресурсу на наприклад, ресурс файлової системи - це проста проблема зміни екземпляра.


6
Чи можете ви надати зразок коду про те, як це можна використовувати у файлі вводу / виводу? Я не можу знайти гідний , явний і простий спосіб, як використовувати його в Інтернеті: ((((

Працює як шарм. Наданий один лайнер - все, що вам потрібно. Використовуйте аналіз потоку з інших прикладів, якщо ви не знаєте, як отримати рядок з потоку.
Йосип Похоть

У мене виникли певні проблеми, коли я зрозумів, що саме робити зі змінною ресурсу. Я відредагував відповідь дещо детальніше
DavidZemon

Я вже використовував Spring та пробував "чисту Java". Це вбивало мене, відмінності між getResource, getResourceAsStream тощо, не маючи хороших робочих прикладів. Це прекрасний приклад інкапсуляції, тому мені не потрібно піклуватися.
TinkerTenorSoftwareGuy

1
Будьте обережні, якщо ви пакуєте ваш проект у банку, ви повинні використовувати InputStream. Якщо ви використовуєте файл, він працює у вашому IDE, але вийде з ладу, якщо ви протестуєте його з баночки. Якщо вам дійсно потрібно спробувати Файл з stackoverflow.com/questions/4317035 / ...
Рафаель Membrives

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: це приклад того, як це можна зробити. Вам доведеться внести вдосконалення в міру необхідності. Цей приклад буде працювати лише в тому випадку, якщо файл насправді присутній на вашому classpath, інакше NullPointerException буде викинуто, коли getResource () поверне null і на нього викликається .toURI ().

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

Отже, якщо вам відомо, що кодування файлу має бути UTF-8, то чітко вкажіть діаграму StandardCharsets.UTF_8


1
Дякую за рішення NIO - так мало людей використовують цей чудовий API, це шкода.
mvreijn

7
Для читання в одну спробу String. новий рядок (Files.readAllBytes (Paths.get (MyClass.class.getResource (ресурс) .toURI ())));
Тео Бріско

2
Найкраще рішення для мене, оскільки він не потребує таких залежностей, як Spring або Commons IO.
Берні

1
Це не вдасться, якщо ваш ресурсний файл знаходиться в банку, наприклад, модуль Maven. У такому випадку вам потрібно буде використовувати щось на кшталт Spring's StreamUtils.copyToString.
Сому

26

Будь ласка, спробуй

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

Ваші спроби не спрацювали, тому що лише завантажувач класів для ваших класів може завантажуватися з класового шляху. Ви використовували завантажувач класів для самої системи java.


Не впевнений у тому, що й / /. Відносний шлях може працювати краще в цьому випадку.
VonC

3
Якщо ви використовуєте його без "/", ви шукаєте файл у пакеті "цього".
тангенс

1
InputStream file = this.getClass (). GetResourceAsStream ("SomeTextFile.txt"); InputStream file = this.getClass (). GetResourceAsStream ("/ SomeTextFile.txt"); InputStream file = this.getClass (). GetResourceAsStream ("// SomeTextFile.txt"); Ніщо з вищезгаданого не спрацювало :(
Чайтанья MSV

@Chaitanya: Чи можете ви навести приклад з відповіді Джона Скіта?
Аарон Дігулла


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/…
Michał Maciej Gałuszka

Тільки якщо він знаходиться в операторі спробу, що тут не так. Це слід було б спробувати (остаточний потік InputStream = новий ClassPathResource ("/ log4j.xml"). GetInputStream ()) {...
andresp

15

Щоб отримати абсолютний шлях класу, спробуйте це:

String url = this.getClass().getResource("").getPath();

І що тоді? Ця інформація сама по собі не корисна.
Маркіз Лорнського

Ця інформація була досконалою. Мені бракувало лише getPath ()!
Патрік

@Patrick Ця відповідь не забезпечує "абсолютний шлях класу". Він надає URL-адресу. Зовсім не те саме.
Маркіз Лорнський

12

Якось найкраща відповідь не працює для мене. Мені потрібно використовувати дещо інший код.

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

Я сподіваюся, що це допоможе тим, хто стикається з тим же питанням.


Це допомогло мені і на Android, де клас завантажився завантажувачем додатків, але ключ, який йому потрібен, був ледачий завантаженням у нитку інтерфейсу користувача.
asokan

Вам потрібно надати інформацію про те, чому найкраща відповідь не працює для вас (наприклад, структура вашої програми, рамка, яку ви використовуєте, помилка тощо). Найкраща відповідь чітко сказала, що 1) каталог повинен знаходитися на classpath, 2) потрібно запитувати клас, завантажений тим самим завантажувачем класів. Можливо, одне з цих припущень не стосується вашої заявки. Також навантажувач контекстного класу дуже не вражає, оскільки він був представлений як хак. Деякі рамки використовують це, але важливо знати наслідки (що вимагає описати передумови проекту)
Xinchao

6

Якщо ви використовуєте Guava:

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.
Маркіз Лорн

Метод getFile URL не повертає ім'я файлу. Він просто повертає частину контуру 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");

1

Ви говорите: "Я намагаюся прочитати текстовий файл, встановлений у системній змінній CLASSPATH." Я думаю, що це в Windows, і ви використовуєте це потворне діалогове вікно для редагування "Системних змінних".

Тепер ви запускаєте свою програму Java в консолі. І це не працює: консоль отримує копію значень системних змінних один раз при її запуску . Це означає, що будь-яка зміна діалогового вікна після цього не має ніякого ефекту.

Є такі рішення:

  1. Запустіть нову консоль після кожної зміни

  2. Використовуйте set CLASSPATH=...в консолі, щоб встановити копію змінної на консолі, і коли ваш код працює, вставте останнє значення у діалогове вікно змінної.

  3. Покладіть виклик Java у .BATфайл та двічі клацніть по ньому. Це створюватиме нову консоль кожного разу (таким чином копіюючи поточне значення системної змінної).

ПОПЕРЕДЖЕННЯ: Якщо у вас також є користувацька змінна, 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 знаходиться в головній папці / каталозі, ми повинні повернутися два кроки, як ../../, щоб отримати доступ до мого проекту . Тепер після цього подивіться, як ми можемо читати файл: -

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: ви можете розмістити свій файл у ресурсах / файлах / 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 не слід використовувати ... Не працює в остаточному артефакті.
L. Holanda

-1

Сценарій:

1) client-service-1.0-SNAPSHOT.jarмає залежністьread-classpath-resource-1.0-SNAPSHOT.jar

2) ми хочемо прочитати вміст ресурсів шляху до класу ( sample.txt) read-classpath-resource-1.0-SNAPSHOT.jarчерез 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

-2

Не використовуйте метод getClassLoader () і використовуйте "/" перед назвою файлу. "/" дуже важливо

this.getClass().getResourceAsStream("/SomeTextFile.txt");

Використання ведучого /має точно такий же ефект, як і використання 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();
                    }
                }
            }
        }

    }

}

Ні в якому разі не відповідає на питання.
Маркіз Лорнський

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.