Cara benar-benar membaca file teks dari classpath di Jawa

366

Saya mencoba membaca file teks yang diatur dalam variabel sistem CLASSPATH. Bukan variabel pengguna.

Saya mencoba mendapatkan aliran input ke file seperti di bawah ini:

Tempatkan direktori file ( D:\myDir) di CLASSPATH dan coba di bawah ini:

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

Tempatkan path file lengkap ( D:\myDir\SomeTextFile.txt) di CLASSPATH dan coba 3 baris kode yang sama.

Tapi sayangnya TIDAK satu pun dari mereka yang berfungsi dan saya selalu masuk nullke InputStream saya in.

Chaitanya MSV
sumber

Jawaban:

605

Dengan direktori di classpath, dari kelas yang dimuat oleh classloader yang sama, Anda harus dapat menggunakan salah satu dari:

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

Jika itu tidak berhasil, itu menunjukkan ada sesuatu yang salah.

Jadi misalnya, ambil kode ini:

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

Dan struktur direktori ini:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

Dan kemudian (menggunakan pemisah jalur Unix saat saya berada di kotak Linux):

java -classpath code:txt dummy.Test

Hasil:

true
true
Jon Skeet
sumber
2
Anda mencampur jalur relatif dan absolut ke atas. Jalur yang dimulai dengan "/" adalah absolut (yaitu dimulai dari apa pun yang tercantum dalam CLASSPATH). Semua jalur lain relatif terhadap paket kelas yang Anda panggilgetResourceAsStream()
Aaron Digulla
13
Tidak, Anda memecahkan contoh saya. Saya akan mengedit komentar untuk membuatnya lebih jelas, tetapi intinya adalah bahwa menggunakan ClassLoader semua jalur sudah dianggap mutlak. Tidak ada yang bisa membuat mereka menjadi relatif.
Jon Skeet
6
Juga jangan gunakan Java.IO.File.Separator. Itu tidak akan bekerja pada windows. Jika Anda menjalankan kode ini di windows masih harus '/' dan bukan '\'
Pradhan
28
@Pradhan: Tidak, Anda tidak boleh menggunakan File.Separator- karena Anda tidak meminta file , Anda meminta sumber daya . Penting untuk dipahami bahwa abstraksi yang terlibat bukanlah sistem file.
Jon Skeet
1
@ jagdpanzer: Yah itu hanya untuk kelas yang dimuat oleh classloader yang sama, pada dasarnya - dan itu karena Class.getResourceAsStreamini benar-benar metode kenyamanan untuk menelepon ClassLoader.getResourceAsStream, tetapi dengan fitur tambahan sumber daya "relatif". Jika Anda menentukan sumber daya absolut, maka setiap panggilan menggunakan classloader yang sama akan melakukan hal yang sama.
Jon Skeet
115

Saat menggunakan Kerangka Kerja Pegas (baik sebagai kumpulan utilitas atau wadah - Anda tidak perlu menggunakan fungsionalitas yang terakhir), Anda dapat dengan mudah menggunakan abstraksi Sumberdaya .

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

Melalui antarmuka Sumber Daya Anda dapat mengakses sumber daya sebagai InputStream , URL , URI atau File . Mengubah jenis sumber daya ke misalnya sumber daya sistem file adalah masalah sederhana mengubah instance.

menguap
sumber
6
Bisakah Anda memberikan kode sampel tentang bagaimana ini dapat digunakan dalam file I / O? Saya tidak dapat menemukan cara yang layak , eksplisit dan mudah tentang cara menggunakannya di Internet: ((((
Bekerja seperti pesona. Satu liner yang disediakan adalah yang Anda butuhkan. Gunakan aliran parsing dari contoh lain jika Anda tidak tahu cara mendapatkan string dari arus.
Joseph Lust
Saya mengalami sedikit kesulitan untuk mencari tahu apa yang harus dilakukan dengan variabel sumber daya juga. Saya telah mengedit jawaban dengan sedikit lebih detail
DavidZemon
Saya sudah menggunakan Spring dan mencoba cara "java murni". Itu membunuh saya, perbedaan antara getResource, getResourceAsStream, dll, tanpa contoh kerja yang baik. Ini adalah contoh enkapsulasi yang sempurna, jadi saya tidak perlu peduli.
TinkerTenorSoftwareGuy
1
Hati-hati, jika Anda mengemas proyek Anda ke dalam toples Anda harus menggunakan InputStream. Jika Anda menggunakan File itu berfungsi dalam IDE Anda tetapi akan gagal jika Anda mengujinya dari toples. Jika Anda benar-benar membutuhkan File, coba dengan stackoverflow.com/questions/4317035/…
Rafael Membrives
58

Ini adalah bagaimana saya membaca semua baris file teks di classpath saya, menggunakan 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 ini adalah contoh bagaimana hal itu dapat dilakukan. Anda harus melakukan perbaikan seperlunya. Contoh ini hanya akan berfungsi jika file tersebut benar-benar ada di classpath Anda, jika tidak NullPointerException akan dilempar ketika getResource () mengembalikan null dan .toURI () dipanggil padanya.

Juga, sejak Java 7, satu cara mudah menentukan set karakter adalah dengan menggunakan konstanta yang didefinisikan dalam java.nio.charset.StandardCharsets (ini, menurut javadocs mereka , "dijamin akan tersedia pada setiap implementasi platform Java.").

Oleh karena itu, jika Anda mengetahui penyandian file menjadi UTF-8, maka tentukan charset secara eksplisit StandardCharsets.UTF_8

Peter Perháč
sumber
1
Terima kasih atas solusi NIO - sangat sedikit orang yang menggunakan API hebat ini. Sayang sekali.
mvreijn
7
Untuk membaca ke dalam satu String, cobalah. String baru (Files.readAllBytes (Paths.get (MyClass.class.getResource (sumber daya) .toURI ())));
Theo Briscoe
2
Solusi terbaik bagi saya, karena tidak memerlukan dependensi, seperti Spring atau Commons IO.
Bernie
1
Ini akan gagal jika file sumber Anda di dalam toples, misalnya modul pakar. Dalam hal ini Anda harus menggunakan sesuatu seperti Springitu StreamUtils.copyToString.
Somu
26

Silakan dicoba

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

Percobaan Anda tidak berhasil karena hanya pemuat kelas untuk kelas Anda yang dapat memuat dari classpath. Anda menggunakan pemuat kelas untuk sistem java itu sendiri.

tangens
sumber
Tidak yakin tentang "/". Jalur relatif mungkin bekerja lebih baik dalam hal ini.
VonC
3
Jika Anda menggunakannya tanpa "/" Anda mencari file Anda di dalam paket "ini".
tangens
1
File InputStream = this.getClass (). GetResourceAsStream ("SomeTextFile.txt"); File InputStream = this.getClass (). GetResourceAsStream ("/ SomeTextFile.txt"); File InputStream = this.getClass (). GetResourceAsStream ("// SomeTextFile.txt"); Tak satu pun dari yang di atas bekerja :(
Chaitanya MSV
@ Chaitanya: Bisakah Anda menjalankan contoh dari jawaban John Skeet?
Aaron Digulla
Berikut adalah beberapa contoh yang baik untuk getResourceAsStream
drorw
20

Untuk benar-benar membaca isi file, saya suka menggunakan Commons IO + Spring Core. Dengan asumsi Java 8:

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

Kalau tidak:

InputStream stream = null;
try {
    stream = new ClassPathResource("/log4j.xml").getInputStream();
    IOUtils.toString(stream);
} finally {
    IOUtils.closeQuietly(stream);
}
Pavel
sumber
Bagaimana dengan menutup inputstream?
Stephan
Aliran akan ditutup secara otomatis. Ini adalah fitur Java 7 "Coba dengan sumber daya" docs.oracle.com/javase/tutorial/essential/exceptions/…
Michał Maciej Gałuszka
Hanya jika itu ada di dalam pernyataan coba, yang tidak terjadi di sini. Seharusnya sudah dicoba (final InputStream stream = new ClassPathResource ("/ log4j.xml"). GetInputStream ()) {...
andresp
15

Untuk mendapatkan path absolut kelas coba ini:

String url = this.getClass().getResource("").getPath();
webcom
sumber
Lalu apa? Informasi itu tidak digunakan dengan sendirinya.
Marquis of Lorne
Informasi ini sempurna. Saya hanya melewatkan getPath ()!
Patrick
@ Patrick Jawaban ini tidak memberikan 'path absolut kelas'. Ini menyediakan URL. Sama sekali tidak hal yang sama.
Marquis of Lorne
12

Entah bagaimana jawaban terbaik tidak berhasil untuk saya. Saya perlu menggunakan kode yang sedikit berbeda.

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

Saya harap ini membantu mereka yang mengalami masalah yang sama.

pengguna1695166
sumber
Ini membantu saya di Android juga di mana kelas dimuat oleh aplikasi loader, tetapi kunci yang dibutuhkan adalah malas dimuat di utas UI.
asokan
Anda perlu memberikan informasi mengapa jawaban terbaik tidak berfungsi untuk Anda (mis. Struktur aplikasi Anda, kerangka kerja yang Anda gunakan, kesalahan, dll.). Jawaban terbaik mengatakan dengan jelas bahwa 1) direktori harus berada di classpath, 2) Anda perlu meminta dari kelas yang dimuat oleh loader kelas yang sama. Peluangnya adalah salah satu asumsi ini tidak berlaku untuk aplikasi Anda. Pemuat kelas konteks juga sangat tidak disarankan karena diperkenalkan sebagai peretasan. Beberapa kerangka kerja memang memanfaatkannya tetapi penting untuk mengetahui implikasinya (yang mengharuskan Anda menggambarkan latar belakang proyek Anda)
Xinchao
6

Jika Anda menggunakan Jambu Biji:

import com.google.common.io.Resources;

kita bisa mendapatkan URL dari CLASSPATH:

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

atau InputStream:

InputStream is = Resources.getResource("test.txt").openStream();
Alexey Simonov
sumber
Jalur file tidak ada gunanya jika sumber daya dalam file JAR atau WAR.
Marquis of Lorne
Metode getFile URL tidak mengembalikan nama file. Itu hanya mengembalikan bagian path dari URL, yang tidak dijamin menjadi nama file yang valid. (Kelas URL adalah bagian dari Java 1.0; saat itu, sebagian besar URL sebenarnya merujuk pada file fisik di komputer yang sama atau komputer yang berbeda.)
VGR
3

Untuk membaca konten file ke dalam String dari classpath, Anda dapat menggunakan ini:

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

Catatan:
IOUtilsadalah bagian dari Commons IO.

Sebut saja seperti ini:

String fileContents = resourceToString("ImOnTheClasspath.txt");
BullyWiiPlaza
sumber
1

Anda mengatakan "Saya mencoba membaca file teks yang diatur dalam variabel sistem CLASSPATH." Tebakan saya ini ada di Windows dan Anda menggunakan dialog jelek ini untuk mengedit "Variabel Sistem".

Sekarang Anda menjalankan program Java Anda di konsol. Dan itu tidak berhasil: Konsol mendapatkan salinan nilai-nilai variabel sistem satu kali ketika dimulai . Ini berarti setiap perubahan dalam dialog setelahnya tidak berpengaruh.

Ada beberapa solusi ini:

  1. Mulai konsol baru setelah setiap perubahan

  2. Gunakan set CLASSPATH=...di konsol untuk mengatur salinan variabel di konsol dan ketika kode Anda bekerja, rekatkan nilai terakhir ke dalam dialog variabel.

  3. Masukkan panggilan ke Java ke .BATfile dan klik dua kali. Ini akan membuat konsol baru setiap kali (sehingga menyalin nilai saat ini dari variabel sistem).

WASPADALAH: Jika Anda juga memiliki variabel Pengguna CLASSPATHmaka itu akan membayangi variabel sistem Anda. Itu sebabnya biasanya lebih baik untuk menempatkan panggilan ke program Java Anda ke dalam .BATfile dan mengatur classpath di sana (menggunakan set CLASSPATH=) daripada mengandalkan sistem global atau variabel pengguna.

Ini juga memastikan bahwa Anda dapat memiliki lebih dari satu program Java yang bekerja di komputer Anda karena mereka pasti memiliki jalan kelas yang berbeda.

Aaron Digulla
sumber
0

Jawaban saya tidak persis apa yang ditanyakan dalam pertanyaan. Sebaliknya saya memberikan solusi persis seberapa mudah kita dapat membaca file ke dalam aplikasi java dari jalur kelas proyek kami.

Misalnya misalkan nama file config example.xml terletak di jalur seperti di bawah ini: -

com.myproject.config.dev

dan file kelas java executable kami berada di jalur di bawah ini: -

com.myproject.server.main

sekarang cukup periksa di kedua jalur di atas yang merupakan direktori / folder umum terdekat dari tempat Anda dapat mengakses direktori / folder utama dan dev (com.myproject.server.main - di mana ada kelas executable java aplikasi kita) - Kita bisa melihat bahwa itu adalah folder / direktori myproject yang merupakan direktori / folder umum terdekat dari tempat kita dapat mengakses file example.xml kita. Oleh karena itu dari kelas yang dapat dieksekusi java berada di folder / direktori utama kita harus kembali dua langkah seperti ../../ untuk mengakses myproject . Sekarang setelah ini, lihat bagaimana kita dapat membaca file: -

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();
   }
}
Abhijit Pritam Dutta
sumber
0

Jika Anda mengkompilasi proyek Anda dalam file jar: Anda dapat meletakkan file Anda di sumber daya / file / your_file.text atau pdf;

dan gunakan kode ini:

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;
    } 
}
Ahmed ALI
sumber
-1

Saya menggunakan server aplikasi webshpere dan Modul Web saya dibuat di Spring MVC. Para Test.propertiesterletak di folder sumber daya, saya mencoba untuk memuat file ini menggunakan berikut:

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

Tidak satu pun dari kode di atas memuat file.

Tetapi dengan bantuan kode di bawah ini file properti berhasil dimuat:

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

Terima kasih kepada pengguna "user1695166" .

Sardar Saikh
sumber
1
Selamat Datang di Stack Overflow! Tolong jangan tambahkan "terima kasih" sebagai jawaban bahkan jika Anda juga memberikan sebagian bagaimana solusi Anda berjalan, jika solusi Anda sama dengan posting lain, itu tidak perlu ditambahkan. Setelah menginvestasikan waktu di situs, Anda akan memperoleh hak istimewa yang cukup untuk meningkatkan jawaban yang Anda sukai, yang merupakan cara Stack Overflow untuk mengucapkan terima kasih.
SuperBiasedMan
-1

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

Charu Khurana
sumber
referensi ke src tidak boleh digunakan ... Tidak berfungsi dalam artefak akhir.
L. Holanda
-1

Skenario:

1) client-service-1.0-SNAPSHOT.jarmemiliki ketergantunganread-classpath-resource-1.0-SNAPSHOT.jar

2) kami ingin membaca konten sumber daya jalur kelas ( sample.txt) read-classpath-resource-1.0-SNAPSHOT.jarmelalui client-service-1.0-SNAPSHOT.jar.

3) read-classpath-resource-1.0-SNAPSHOT.jartelahsrc/main/resources/sample.txt

Berikut ini adalah contoh kode kerja yang saya siapkan, setelah 2-3 hari menghabiskan waktu pengembangan saya, saya menemukan solusi lengkap end-to-end, harap ini membantu menghemat waktu Anda

1. pom.xmldariread-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.javakelas di read-classpath-resource-1.0-SNAPSHOT.jaryang memuat konten file sumber daya jalur kelas.

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.xmldariclient-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.javainstantiate ClassPathResourceReadTest.javaclass where, ia akan memuat sample.txtdan mencetak kontennya juga.

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.Jalankan jar yang Dapat Dieksekusi sebagai berikut:

[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
sumber
-2

Jangan gunakan metode getClassLoader () dan gunakan "/" sebelum nama file. "/" sangat penting

this.getClass().getResourceAsStream("/SomeTextFile.txt");
sachinthana87
sumber
Menggunakan pemimpin /memiliki efek yang persis sama dengan menggunakan getClassLoader()metode.
Marquis of Lorne
-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();
                    }
                }
            }
        }

    }

}
Pembantu
sumber
Tidak menjawab pertanyaan dengan cara apa pun.
Marquis of Lorne
-5

Anda harus meletakkan 'variabel sistem' Anda di classpath java.

Salandur
sumber
Saya menempatkan variabel Sistem itu sendiri.
Chaitanya MSV
'Variabel sistem' adalah Java CLASSPATH. Jawaban tidak masuk akal.
Marquis of Lorne
Benar-benar benar ... bahkan tidak ingat menulis jawaban ini :)
Salandur