Cách đọc tệp văn bản từ classpath trong Java


366

Tôi đang cố đọc một tệp văn bản được đặt trong biến hệ thống CLASSPATH. Không phải là một biến người dùng.

Tôi đang cố gắng để có được luồng đầu vào vào tập tin như dưới đây:

Đặt thư mục của tệp ( D:\myDir) trong CLASSPATH và thử bên dưới:

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

Đặt đường dẫn đầy đủ của tệp ( D:\myDir\SomeTextFile.txt) vào CLASSPATH và thử 3 dòng mã trên.

Nhưng thật không may, KHÔNG phải ai trong số họ cũng đang làm việc và tôi luôn bị cuốn nullvào InputStream của mình in.

Câu trả lời:


605

Với thư mục trên đường dẫn lớp, từ một lớp được tải bởi cùng một trình nạp lớp, bạn sẽ có thể sử dụng một trong hai:

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

Nếu những cái đó không hoạt động, điều đó cho thấy một cái gì đó khác là sai.

Vì vậy, ví dụ, lấy mã này:

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

Và cấu trúc thư mục này:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

Và sau đó (sử dụng trình phân tách đường dẫn Unix như trên hộp Linux):

java -classpath code:txt dummy.Test

Các kết quả:

true
true

2
Bạn trộn đường dẫn tương đối và tuyệt đối lên. Đường dẫn bắt đầu bằng "/" là tuyệt đối (nghĩa là bắt đầu từ bất cứ điều gì được liệt kê trong CLASSPATH). Tất cả các đường dẫn khác đều liên quan đến gói của lớp mà bạn gọigetResourceAsStream()
Aaron Digulla

13
Không, bạn đã phá vỡ ví dụ của tôi. Tôi sẽ chỉnh sửa các nhận xét để làm cho chúng rõ ràng hơn, nhưng vấn đề là sử dụng ClassLoader, tất cả các đường dẫn đều được coi là tuyệt đối. Không có gì để họ có liên quan đến.
Jon Skeet

6
Cũng không sử dụng Java.IO.File.Separator. Nó không hoạt động trên windows. Nếu bạn đang chạy mã này trên windows thì nó vẫn phải là '/' chứ không phải '\'
Pradhan

28
@Pradhan: Không, bạn không nên sử dụng File.Separator- vì bạn không yêu cầu tệp , bạn đang yêu cầu tài nguyên . Điều quan trọng là phải hiểu rằng sự trừu tượng liên quan không phải là hệ thống tệp.
Jon Skeet

1
@jagdpanzer: Về cơ bản, nó chỉ dành cho các lớp được tải bởi cùng một trình nạp lớp - và đó Class.getResourceAsStreamthực sự là một phương thức tiện lợi để gọi ClassLoader.getResourceAsStream, nhưng với tính năng bổ sung của tài nguyên "tương đối". Nếu bạn chỉ định một tài nguyên tuyệt đối, thì bất kỳ cuộc gọi nào sử dụng cùng một trình nạp lớp sẽ làm điều tương tự.
Jon Skeet

115

Khi sử dụng Spring Framework (dưới dạng tập hợp các tiện ích hoặc vùng chứa - bạn không cần sử dụng chức năng sau), bạn có thể dễ dàng sử dụng trừu tượng hóa Tài nguyên .

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

Thông qua giao diện Tài nguyên, bạn có thể truy cập tài nguyên dưới dạng InputStream , URL , URI hoặc Tệp . Thay đổi loại tài nguyên thành ví dụ tài nguyên hệ thống tệp là một vấn đề đơn giản để thay đổi thể hiện.


6
Bạn có thể vui lòng cung cấp một mã mẫu về cách sử dụng mã này trong tệp I / O không? Tôi không thể tìm thấy một cách tử tế , rõ ràngđơn giản về cách sử dụng nó trên Internet: ((((

Hoạt động như một lá bùa. Một lót được cung cấp là tất cả bạn cần. Sử dụng phân tích cú pháp luồng từ các ví dụ khác nếu bạn không biết cách lấy chuỗi từ luồng.
Joseph Lust

Tôi đã có một chút rắc rối để tìm ra chính xác phải làm gì với biến tài nguyên. Tôi đã chỉnh sửa câu trả lời chi tiết hơn một chút
DavidZemon

Tôi đã sử dụng Spring và thử cách "java thuần túy". Nó đã giết chết tôi, sự khác biệt giữa getResource, getResourceAsStream, v.v., không có ví dụ hoạt động tốt. Đây là một ví dụ hoàn hảo về đóng gói, vì vậy tôi không cần phải quan tâm.
TinkerTenorSoftwareGuy

1
Hãy cẩn thận, nếu bạn đóng gói dự án của bạn vào một cái bình, bạn nên sử dụng InputStream. Nếu bạn sử dụng một tệp, nó hoạt động trong IDE của bạn nhưng sẽ thất bại nếu bạn kiểm tra nó từ tệp jar. Nếu bạn thực sự cần Tệp, hãy thử với stackoverflow.com/questions/4317035/ cấp
Rafael Membrive

58

Đây là cách tôi đọc tất cả các dòng của tệp văn bản trên đường dẫn lớp của mình, sử dụng 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 đây là một ví dụ về cách nó có thể được thực hiện. Bạn sẽ phải cải thiện khi cần thiết. Ví dụ này sẽ chỉ hoạt động nếu tệp thực sự có mặt trên đường dẫn lớp của bạn, nếu không, một NullPulumException sẽ bị ném khi getResource () trả về null và .toURI () được gọi trên đó.

Ngoài ra, kể từ Java 7, một cách thuận tiện để chỉ định các bộ ký tự là sử dụng các hằng được định nghĩa trong java.nio.charset.StandardCharsets (đây là, theo javadocs của chúng , "được đảm bảo có sẵn trên mọi triển khai của nền tảng Java.").

Do đó, nếu bạn biết mã hóa của tệp là UTF-8, thì chỉ định rõ ràng bộ ký tự StandardCharsets.UTF_8


1
Cảm ơn bạn về giải pháp NIO - vì vậy rất ít người sử dụng API tuyệt vời này, thật đáng tiếc.
mvreijn

7
Để đọc thành một Chuỗi đơn. Chuỗi mới (Files.read ALLBytes (Paths.get (MyClass. class.getResource (resource) .toURI ())));
Theo Briscoe

2
Giải pháp tốt nhất cho tôi, vì nó không cần bất kỳ sự phụ thuộc nào, như Spring hoặc Commons IO.
Bernie

1
Điều này sẽ thất bại nếu tệp tài nguyên của bạn nằm trong một jar, ví dụ mô-đun maven. Trong trường hợp đó, bạn sẽ cần sử dụng một cái gì đó như Springcủa StreamUtils.copyToString.
Somu

26

Vui lòng thử

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

Các lần thử của bạn không hoạt động vì chỉ có trình nạp lớp cho các lớp của bạn mới có thể tải từ đường dẫn lớp. Bạn đã sử dụng trình nạp lớp cho chính hệ thống java.


Không chắc chắn về "/" mặc dù. Một đường dẫn tương đối có thể hoạt động tốt hơn trong trường hợp này.
VonC

3
Nếu bạn sử dụng nó mà không có "/", bạn đang tìm kiếm tệp của mình bên trong gói "này".
tang

1
Tệp InputStream = this.getClass (). GetResourceAsStream ("someTextFile.txt"); Tệp InputStream = this.getClass (). GetResourceAsStream ("/ someTextFile.txt"); Tệp InputStream = this.getClass (). GetResourceAsStream ("// someTextFile.txt"); Không có cách nào ở trên hoạt động :(
Chaitanya MSV

@Chaitanya: Bạn có thể chạy ví dụ từ câu trả lời của John Skeet không?
Aaron Digulla


20

Để thực sự đọc nội dung của tệp, tôi thích sử dụng Commons IO + Spring Core. Giả sử Java 8:

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

Cách khác:

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

Còn việc đóng đầu vào thì sao?
Stephan

Luồng sẽ được đóng tự động. Đây là một tính năng của Java 7 "Thử với tài nguyên" docs.oracle.com/javase/tutorial/essential/exceptions/ trộm
Michał Maciej Gałuszka

Chỉ khi nó nằm trong câu lệnh try, đây không phải là trường hợp ở đây.
Đáng

15

Để có được đường dẫn tuyệt đối của lớp, hãy thử điều này:

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

Và rồi chuyện gì xảy ra? Thông tin đó không được sử dụng bởi chính nó.
Hầu tước Lorne

Thông tin này là hoàn hảo. Tôi chỉ thiếu getPath ()!
Patrick

@Patrick Câu trả lời này không cung cấp 'đường dẫn tuyệt đối của lớp'. Nó cung cấp một URL. Hoàn toàn không giống nhau.
Hầu tước Lorne

12

Bằng cách nào đó câu trả lời tốt nhất không làm việc cho tôi. Tôi cần phải sử dụng một mã hơi khác thay thế.

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

Tôi hy vọng điều này sẽ giúp những người gặp phải vấn đề tương tự.


Điều này đã giúp tôi trên Android cũng là nơi một lớp được tải bởi trình tải ứng dụng, nhưng một khóa mà nó cần là lười tải trong luồng UI.
asokan

Bạn cần cung cấp thông tin về lý do tại sao câu trả lời tốt nhất không phù hợp với bạn (ví dụ: cấu trúc ứng dụng của bạn, khung bạn đang sử dụng, lỗi, v.v.). Câu trả lời tốt nhất nói rõ rằng 1) thư mục cần phải nằm trên đường dẫn lớp, 2) bạn cần yêu cầu từ một lớp được tải bởi cùng một trình nạp lớp. Cơ hội là một trong những giả định này không áp dụng cho ứng dụng của bạn. Ngoài ra, trình nạp lớp ngữ cảnh rất nản lòng vì nó được giới thiệu là một bản hack. Một số khung sử dụng nó nhưng điều quan trọng là phải biết hàm ý (yêu cầu bạn mô tả nền tảng dự án của bạn)
Xinchao

6

Nếu bạn sử dụng ổi:

import com.google.common.io.Resources;

chúng tôi có thể nhận URL từ CLASSPATH:

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

hoặc InputStream:

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

Đường dẫn tệp không được sử dụng nếu tài nguyên nằm trong tệp JAR hoặc WAR.
Hầu tước Lorne

Phương thức URL getFile không trả về tên tệp. Nó chỉ trả về phần đường dẫn của URL, không được đảm bảo là tên tệp hợp lệ. (Lớp URL là một phần của Java 1.0; trước đó, hầu hết các URL thực tế đều đề cập đến các tệp vật lý trên cùng một máy tính hoặc một máy tính khác.)
VGR

3

Để đọc nội dung của tệp vào Chuỗi từ classpath, bạn có thể sử dụng:

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

Lưu ý:
IOUtilslà một phần của Commons IO.

Gọi nó như thế này:

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

1

Bạn nói "Tôi đang cố đọc một tệp văn bản được đặt trong biến hệ thống CLASSPATH." Tôi đoán đây là trên Windows và bạn đang sử dụng hộp thoại xấu xí này để chỉnh sửa "Biến hệ thống".

Bây giờ bạn chạy chương trình Java của bạn trong bàn điều khiển. Và điều đó không hoạt động: Bảng điều khiển nhận được một bản sao các giá trị của các biến hệ thống một lần khi nó được khởi động . Điều này có nghĩa là bất kỳ thay đổi nào trong hộp thoại sau đó không có bất kỳ ảnh hưởng nào.

Có những giải pháp sau:

  1. Bắt đầu một giao diện điều khiển mới sau mỗi thay đổi

  2. Sử dụng set CLASSPATH=...trong bàn điều khiển để đặt bản sao của biến trong bàn điều khiển và khi mã của bạn hoạt động, dán giá trị cuối cùng vào hộp thoại biến.

  3. Đặt cuộc gọi tới Java vào .BATtệp và nhấp đúp vào nó. Điều này sẽ tạo ra một giao diện điều khiển mới mỗi lần (do đó sao chép giá trị hiện tại của biến hệ thống).

THƯỞNG: Nếu bạn cũng có một biến Người dùng CLASSPATHthì nó sẽ phủ bóng biến hệ thống của bạn. Đó là lý do tại sao tốt hơn là đặt cuộc gọi đến chương trình Java của bạn vào một .BATtệp và đặt đường dẫn lớp ở đó (sử dụngset CLASSPATH= ) thay vì dựa vào hệ thống toàn cầu hoặc biến người dùng.

Điều này cũng đảm bảo rằng bạn có thể có nhiều chương trình Java hoạt động trên máy tính của mình vì chúng bị ràng buộc có các đường dẫn lớp khác nhau.


0

Câu trả lời của tôi không chính xác những gì được hỏi trong câu hỏi. Thay vào đó tôi đang đưa ra một giải pháp chính xác là chúng ta có thể dễ dàng đọc một tệp vào ứng dụng java từ đường dẫn lớp dự án của chúng ta như thế nào.

Ví dụ: giả sử một tên tệp cấu hình example.xml được đặt trong một đường dẫn như bên dưới: -

com.myproject.config.dev

và tệp lớp thực thi java của chúng tôi nằm trong đường dẫn bên dưới: -

com.myproject.server.main

bây giờ chỉ cần kiểm tra trong cả hai đường dẫn ở trên đó là thư mục common / thư mục gần nhất từ nơi bạn có thể truy cập cả devchính directory / folder (com.myproject.server.main - nơi lớp thực thi java ứng dụng của chúng tôi đang tồn tại) - Chúng ta có thể thấy rằng đó là thư mục / thư mục myproject, là thư mục / thư mục chung gần nhất từ ​​đó chúng ta có thể truy cập tệp example.xml của mình. Do đó, từ một lớp thực thi java nằm trong thư mục / thư mục chính, chúng ta phải quay lại hai bước như ../../ để truy cập myproject . Bây giờ làm theo điều này, xem làm thế nào chúng ta có thể đọc tệp: -

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

Nếu bạn biên dịch dự án của mình trong tệp jar: bạn có thể đặt tệp của mình vào tài nguyên / tệp / your_file.text hoặc pdf;

và sử dụng mã này:

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

Tôi đang sử dụng máy chủ ứng dụng webshpere và Mô-đun Web của tôi được xây dựng trên Spring MVC. Chúng Test.propertiesđược đặt trong thư mục tài nguyên, tôi đã cố tải các tệp này bằng cách sử dụng như sau:

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

Không có đoạn mã nào ở trên tải tập tin.

Nhưng với sự trợ giúp của mã dưới đây, tệp thuộc tính đã được tải thành công:

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

Cảm ơn người dùng "user1695166" .


1
Chào mừng bạn đến với Stack Overflow! Vui lòng không thêm "cảm ơn" làm câu trả lời ngay cả khi bạn cũng cung cấp một phần cách giải pháp của bạn đã đi, nếu giải pháp của bạn giống với bài đăng khác thì không cần phải thêm. Sau khi bạn đầu tư một chút thời gian vào trang web, bạn sẽ nhận được đủ các đặc quyền để nâng cao câu trả lời bạn thích, đó là cách nói cảm ơn Stack Overflow.
SuperBiasedMan

-1

Sử dụng org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));


tham chiếu đến src không nên được sử dụng ... Không hoạt động trong tạo phẩm cuối cùng.
L. Holanda

-1

Kịch bản:

1) client-service-1.0-SNAPSHOT.jarcó sự phụ thuộcread-classpath-resource-1.0-SNAPSHOT.jar

2) chúng tôi muốn đọc nội dung của tài nguyên đường dẫn lớp ( sample.txt) của read-classpath-resource-1.0-SNAPSHOT.jarthông qua client-service-1.0-SNAPSHOT.jar.

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

Đây là mã mẫu làm việc tôi đã chuẩn bị, sau 2-3 ngày lãng phí thời gian phát triển của tôi, tôi đã tìm thấy giải pháp đầu cuối hoàn chỉnh, hy vọng điều này sẽ giúp tiết kiệm thời gian của bạn

1. pom.xmlcủaread-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.javalớp trong read-classpath-resource-1.0-SNAPSHOT.jarđó tải nội dung tệp tài nguyên đường dẫn lớp.

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.xmlcủaclient-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. lớp AccessClassPathResource.javakhởi tạo ClassPathResourceReadTest.javaở đâu, nó sẽ tải sample.txtvà in nội dung của nó.

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.Run jar thực thi như sau:

[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

Không sử dụng phương thức getClassLoader () và sử dụng "/" trước tên tệp. "/" là rất quan trọng

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

Sử dụng hàng đầu /có tác dụng chính xác như sử dụng getClassLoader()phương pháp.
Hầu tước 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();
                    }
                }
            }
        }

    }

}

Không trả lời câu hỏi theo bất kỳ cách nào.
Hầu tước Lorne

-5

bạn phải đặt 'biến hệ thống' của mình trên đường dẫn java.


Tôi đặt hệ thống biến chính nó.
Chaitanya MSV

"Biến hệ thống" Java CLASSPATH. Trả lời không có ý nghĩa.
Hầu tước Lorne

Hoàn toàn đúng ... thậm chí còn không nhớ đã viết câu trả lời này :)
Salandur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.