Java'da sınıf yolundan gerçekten metin dosyası nasıl okunur


366

CLASSPATH sistem değişkeninde ayarlanan bir metin dosyasını okumaya çalışıyorum. Bir kullanıcı değişkeni değil.

Aşağıdaki gibi dosyaya giriş akışı almaya çalışıyorum:

( D:\myDir) Dosyasının dizinini CLASSPATH dizinine yerleştirin ve aşağıdakileri deneyin:

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.txtCLASSPATH içine file ( ) dosyasının tam yolunu yerleştirin ve aynı 3 satırlık kodu deneyin.

Ama ne yazık ki hiçbiri çalışmıyor ve her zaman nullInputStream'ime giriyorum in.

Yanıtlar:


605

Sınıf yolundaki dizinle, aynı sınıf yükleyici tarafından yüklenen bir sınıftan aşağıdakilerden birini kullanabilmeniz gerekir:

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

Bunlar işe yaramazsa, başka bir şeyin yanlış olduğunu gösterir.

Örneğin, şu kodu alın:

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

Ve bu dizin yapısı:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

Ve sonra (bir Linux kutusunda olduğum gibi Unix yol ayırıcısını kullanarak):

java -classpath code:txt dummy.Test

Sonuçlar:

true
true

2
Göreli ve mutlak yolları karıştırdınız. "/" İle başlayan bir yol mutlaktır (yani CLASSPATH içinde listelenenlerden başlayarak). Diğer tüm yollar, aradığınız sınıfın paketine getResourceAsStream()
göredir

13
Hayır, sen benim örneğimi kırdın . Yorumları daha net hale getirmek için yorumları düzenleyeceğim, ancak nokta ClassLoader'ı kullanarak tüm yolların zaten mutlak olduğu varsayılıyor. Göreceleri için hiçbir şey yok.
Jon Skeet

6
Ayrıca Java.IO.File.Separator kullanmayın. Pencerelerde çalışmaz. Bu kodu pencerelerde çalıştırıyorsanız, hala '/' olmalı ve '\' değil
Pradhan

28
@Pradhan: Hayır, kullanmamalısınız File.Separator- çünkü bir dosya istemiyorsunuz, bir kaynak istiyorsunuz . İlgili soyutlamanın dosya sistemi olmadığını anlamak önemlidir.
Jon Skeet

1
@jagdpanzer: Sadece aynı sınıf yükleyici tarafından yüklenen sınıflar için, temel olarak - ve bunun sebebi Class.getResourceAsStream, arama için gerçekten kolay bir yöntem ClassLoader.getResourceAsStream, ancak "göreli" kaynakların ek özelliğiyle. Mutlak bir kaynak belirtiyorsanız, aynı sınıf yükleyiciyi kullanan tüm çağrılar aynı şeyi yapar.
Jon Skeet

115

Spring Framework'ü kullanırken (yardımcı programlar topluluğu olarak veya - kolayca kullanabilirsiniz konteyner Eğer ikinci işlevini kullanmak gerekmez) Kaynak soyutlama.

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

Kaynak arabirimi aracılığıyla kaynağa InputStream , URL , URI veya File olarak erişebilirsiniz . Kaynak türünü örneğin bir dosya sistemi kaynağına değiştirmek, örneği değiştirmek için basit bir konudur.


6
Bunun G / Ç dosyasında nasıl kullanılabileceğine ilişkin bir örnek kod verebilir misiniz? İnternette nasıl kullanılacağına dair iyi , açık ve anlaşılır bir yol bulamıyorum : ((((

Tıkır tıkır çalışıyor. Sağlanan bir astar ihtiyacınız olan tek şey. Akıştan nasıl bir dize alacağınızı bilmiyorsanız diğer örneklerden akış ayrıştırmayı kullanın.
Joseph Lust

Kaynak değişkeni ile tam olarak ne yapacağımı bulmakta biraz zorlandım. Cevabı biraz daha ayrıntılı olarak düzenledim
DavidZemon

Zaten Spring'i kullanıyordum ve "saf java" yolunu deniyordum. İyi çalışma örnekleri olmadan getResource, getResourceAsStream, vb. Arasındaki farkları öldürüyordu. Bu kapsülleme için mükemmel bir örnek, bu yüzden umurumda değil.
Ocak'ta

1
Dikkatli olun, projenizi bir kavanoza paketlerseniz bir InputStream kullanmalısınız. Bir Dosya kullanırsanız IDE'nizde çalışır ancak kavanozdan test ederseniz başarısız olur. Gerçekten bir Dosyaya ihtiyacınız varsa stackoverflow.com/questions/4317035/…
Rafael Membrives

58

Java 7 NIO kullanarak sınıf yolumdaki bir metin dosyasının tüm satırlarını şu şekilde okurum:

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

Not: Bu nasıl yapılabileceğinin bir örneğidir. Gerektiğinde iyileştirmeler yapmanız gerekecek. Bu örnek yalnızca dosya sınıf yolunuzda gerçekten varsa çalışır, aksi takdirde getResource () null döndürdüğünde ve .toURI () çağrıldığında bir NullPointerException oluşturulur.

Ayrıca, Java 7'den beri, karakter kümelerini belirtmenin uygun bir yolu, tanımlanmış sabitleri kullanmaktır java.nio.charset.StandardCharsets (bunlar, javadoclarına göre , "Java platformunun her uygulanmasına ilişkin mevcut olması garanti.").

Bu nedenle, dosyanın kodlamasını UTF-8 olarak biliyorsanız, açıkça karakter kümesini belirtin StandardCharsets.UTF_8


1
NIO çözümü için teşekkür ederiz - bu kadar az sayıda kişi bu harika API'yı kullanıyor.
mvreijn

7
Tek bir Dize okumak için deneyin. new String (Files.readAllBytes (Paths.get (MyClass.class.getResource (resource) .toURI ())));
Theo Briscoe

2
Benim için en iyi çözüm, çünkü Spring veya Commons IO gibi herhangi bir bağımlılığa ihtiyaç duymuyor.
Bernie

1
Kaynak dosyanız bir kavanozun içindeyse, örneğin bir maven modülü için bu başarısız olur. Bu durumda Spring's' gibi bir şey kullanmanız gerekir StreamUtils.copyToString.
Somu

26

Deneyin lütfen

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

İçin tek sınıf yükleyici çünkü çalışır işe yaramadı senin sınıfların sınıfyolundan yükleyebildiğinden. Java sisteminin kendisi için sınıf yükleyiciyi kullandınız.


Ama "/" hakkında emin değilim. Bu durumda göreli bir yol daha iyi sonuç verebilir.
VonC

3
Eğer "/" olmadan kullanırsanız, dosyanızı "this" paketinin içinde arıyorsunuz.
tangens

1
InputStream dosyası = this.getClass (). GetResourceAsStream ("SomeTextFile.txt"); InputStream dosyası = this.getClass (). GetResourceAsStream ("/ SomeTextFile.txt"); InputStream dosyası = this.getClass (). GetResourceAsStream ("// SomeTextFile.txt"); Yukarıdakilerin hiçbiri işe yaramadı :(
Chaitanya MSV

@Chaitanya: Örneği John Skeet'in cevabından alabilir misin?
Aaron Digulla


20

Dosyanın içeriğini okumak için Commons IO + Spring Core kullanmayı seviyorum. Java 8 varsayarsak:

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

Alternatif:

InputStream stream = null;
try {
    stream = new ClassPathResource("/log4j.xml").getInputStream();
    IOUtils.toString(stream);
} finally {
    IOUtils.closeQuietly(stream);
}

Giriş akışını kapatmaya ne dersiniz?
Stephan

Akış otomatik olarak kapatılacaktır. Java 7 "Kaynaklarla deneyin" özelliğidir docs.oracle.com/javase/tutorial/essential/exceptions/…
Michał Maciej Gałuszka 13:18

Sadece try ifadesinin içindeyse, burada durum böyle değil. Denenmiş olmalıydı (son InputStream akışı = yeni ClassPathResource ("/ log4j.xml"). GetInputStream ()) {...
andresp

15

Sınıf mutlak yolunu elde etmek için şunu deneyin:

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

Ve sonra ne? Bu bilgi kendi başına bir fayda değildir.
Lorne Marquis

Bu bilgi mükemmeldi. Ben sadece getPath () eksikti!
Patrick

@Patrick Bu cevap 'sınıf mutlak yolunu' sağlamaz. Bir URL sağlar. Aynı şey değil.
Lorne Marquis

12

Bir şekilde en iyi cevap benim için işe yaramıyor. Bunun yerine biraz farklı bir kod kullanmam gerekiyor.

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

Umarım bu aynı sorunla karşılaşanlara yardımcı olur.


Bu, Android'de de bir sınıfın uygulama yükleyici tarafından yüklendiği yerlerde bana yardımcı oldu, ancak ihtiyaç duyduğu bir anahtar UI iş parçacığına tembel yüklendi.
asokan

En iyi yanıtın sizin için neden işe yaramadığı hakkında bilgi vermeniz gerekir (örneğin uygulamanızın yapısı, kullandığınız çerçeve, hata vb.). En iyi cevap açıkça 1) dizinin sınıfyolunda olması gerektiğini, 2) aynı sınıf yükleyici tarafından yüklenen bir sınıftan talep etmeniz gerektiğini söyledi. Şansınız, başvurunuz için geçerli olmayan bu varsayımlardan biridir. Ayrıca bağlam sınıfı yükleyici bir hack olarak tanıtıldığından çok cesaretini kırmıştır. Bazı çerçeveler bundan faydalanır, ancak (projenizin arka planını tanımlamanızı gerektirir) etkisini bilmek önemlidir
Xinchao

6

Guava kullanıyorsanız:

import com.google.common.io.Resources;

CLASSPATH adresinden URL alabiliriz:

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

veya InputStream:

InputStream is = Resources.getResource("test.txt").openStream();

Kaynak bir JAR veya WAR dosyasındaysa dosya yolu herhangi bir fayda sağlamaz.
Lorne Marquis

URL'nin getFile yöntemi bir dosya adı döndürmez. URL'nin yalnızca geçerli bir dosya adı olduğu garanti edilmeyen yol bölümünü döndürür. (URL sınıfı Java 1.0'ın bir parçasıydı; o zamanlar çoğu URL aslında aynı bilgisayardaki veya farklı bir bilgisayardaki fiziksel dosyalara atıfta bulundu.)
VGR

3

Bir dosyanın içeriğini bir Dize içine okumak için şunu classpathkullanabilirsiniz:

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

Not:
IOUtilsbir parçasıdır Commons IO.

Buna şöyle deyin:

String fileContents = resourceToString("ImOnTheClasspath.txt");

1

"CLASSPATH sistem değişkeninde ayarlanan bir metin dosyasını okumaya çalışıyorum" diyorsunuz. Sanırım bu Windows üzerinde ve "Sistem Değişkenleri" düzenlemek için bu çirkin iletişim kutusunu kullanıyorsunuz.

Artık Java programınızı konsolda çalıştırıyorsunuz. Ve bu işe yaramazsa: konsol sistemi değişkenlerinin değerlerinin bir kopyasını alır kez o zaman başladı . Bu, daha sonra iletişim kutusundaki herhangi bir değişiklik anlamına gelir herhangi bir etkisi yoktur.

Bu çözümler var:

  1. Her değişiklikten sonra yeni bir konsol başlatın

  2. set CLASSPATH=...Konsoldaki değişkenin kopyasını ayarlamak için kullanın ve kodunuz çalıştığında, son değeri değişken iletişim kutusuna yapıştırın.

  3. Java çağrısını .BATdosyaya yerleştirin ve çift tıklayın. Böylece her seferinde yeni bir konsol oluşturulur (böylece sistem değişkeninin mevcut değeri kopyalanır).

DİKKAT: Ayrıca bir Kullanıcı değişkeniniz CLASSPATHvarsa, sistem değişkeninizi gölgelendirir. Bu nedenle, Java programınıza gelen çağrıyı bir .BATdosyaya koymak ve set CLASSPATH=genel bir sisteme veya kullanıcı değişkenine güvenmek yerine sınıf yolunu orada (kullanarak ) ayarlamak genellikle daha iyidir .

Bu, aynı zamanda, farklı sınıf yollarına sahip olmaları gerektiğinden, bilgisayarınızda çalışan birden fazla Java programına sahip olmanızı sağlar.


0

Cevabım tam olarak soruda sorulan şey değil. Daha ziyade tam olarak ne kadar kolay bir proje proje yolumuza Java uygulaması içine bir dosya okuyabilir bir çözüm veriyorum.

Örneğin, example.xml yapılandırma dosyası adını varsayalım aşağıdaki gibi bir yolu bulunur: -

com.myproject.config.dev

ve java yürütülebilir sınıf dosyamız aşağıdaki yolda: -

com.myproject.server.main

artık sadece ikisinde de hem erişebileceğiniz en yakın ortak dizin / klasör yukarıda yolunu kontrol dev ve ana (- bizim uygulamanın java çalıştırılabilir sınıf var olduğu com.myproject.server.main) - dizin / klasör görebiliyoruz o olduğunu myproject bizim example.xml dosyaya erişebilir yerden en yakın ortak dizin / klasör klasör / dizin. Bu nedenle bir java yürütülebilir sınıf klasör / dizin ana içinde yer almaktadır benim proje erişmek için ../../ gibi iki adım geri gitmek zorunda . Şimdi bunu izleyerek dosyayı nasıl okuyabileceğimizi görün: -

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

Projenizi jar dosyasında derlerseniz: dosyanızı kaynaklar / dosyalar / dosya_dosyası.text veya pdf içine koyabilirsiniz;

ve şu kodu kullanın:

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 uygulama sunucusu kullanıyorum ve Web Modülüm Spring MVC üzerine kurulu. Test.propertiesKaynakları klasöründe bulunan edildi i aşağıdaki kullanarak bu dosyaları yüklemeye çalıştı:

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

Yukarıdaki kodlardan hiçbiri dosyayı yüklemedi.

Ancak aşağıdaki kod yardımıyla özellik dosyası başarıyla yüklendi:

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

Kullanıcı "user1695166" sayesinde .


1
Stack Overflow'a hoş geldiniz! Lütfen çözümünüzün nasıl gittiğini kısmen sağlasanız bile yanıt olarak "teşekkürler" i eklemeyin, çözümleriniz başka bir gönderiyle aynı ise, eklenmesine gerek yoktur. Siteye biraz zaman harcadıktan sonra , beğendiğiniz cevapları onaylamak için yeterli ayrıcalık kazanacaksınız , bu da Yığın Taşması'nın teşekkür etmenin bir yolu.
SuperBiasedMan

-1

kullanım org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));


src referansı kullanılmamalıdır ... Son eserde çalışmaz.
L. Holanda

-1

Senaryo:

1) client-service-1.0-SNAPSHOT.jarbağımlılığı varread-classpath-resource-1.0-SNAPSHOT.jar

2) biz sınıf yolu kaynaklar içeriğini (okumak istiyorum sample.txt) arasında read-classpath-resource-1.0-SNAPSHOT.jararacılığıylaclient-service-1.0-SNAPSHOT.jar .

3) read-classpath-resource-1.0-SNAPSHOT.jarvardırsrc/main/resources/sample.txt

İşte hazırladığım örnek kod, 2-3 gün geliştirme süremi boşa harcadıktan sonra, uçtan uca çözümü buldum, umarım bu zaman kazanmanıza yardımcı olur

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.javasınıf read-classpath-resource-1.0-SNAPSHOT.jar, sınıf yolu kaynakları dosya içeriğini yükler.

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. içeriği yükleyeceği ve AccessClassPathResource.javayazdıracağı bir ClassPathResourceReadTest.javasınıf örneği 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. çalıştırılabilir kavanoz aşağıdaki gibi çalıştırın:

[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 () yöntemini kullanmayın ve dosya adından önce "/" kullanın. "/" çok önemli

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

Satır /aralığı kullanmak, getClassLoader()yöntemi kullanmakla tamamen aynı etkiye sahiptir .
Lorne Marquis

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

    }

}

Soruya hiçbir şekilde cevap vermiyor.
Lorne Marquis

-5

'sistem değişkeninizi' java sınıfyoluna koymanız gerekir.


Sistem değişkeninin kendisini koydum.
Chaitanya MSV

'Sistem değişkeni' olduğunu Java CLASSPATH. Cevap mantıklı değil.
Lorne Marquis

Tamamen doğru ... bu cevabı yazdığımı bile hatırlamadı :)
Salandur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.