วิธีอ่านไฟล์ข้อความจาก 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เข้า inInputStream

คำตอบ:


605

ด้วยไดเร็กทอรีบน classpath จากคลาสที่โหลดโดย classloader เดียวกันคุณควรใช้อย่างใดอย่างหนึ่งต่อไปนี้:

// 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()
Aaron Digulla

13
ไม่คุณทำตัวอย่างของฉันพัง ฉันจะแก้ไขความคิดเห็นเพื่อให้ชัดเจนยิ่งขึ้น แต่ประเด็นก็คือการใช้ ClassLoader ทุกเส้นทางจะถือว่าสมบูรณ์แล้ว ไม่มีอะไรที่จะเกี่ยวข้องกับพวกเขาได้
Jon Skeet

6
นอกจากนี้อย่าใช้ Java.IO.File.Separator มันไม่ทำงานบน windows หากคุณใช้งานรหัสนี้บน windows มันจะต้องเป็น '/' และไม่ใช่ '\'
Pradhan

28
@Pradhan: ไม่มีคุณไม่ควรจะใช้File.Separator- เพราะคุณไม่ได้ถามหาไฟล์ที่คุณกำลังขอทรัพยากร สิ่งสำคัญคือต้องเข้าใจว่าสิ่งที่เป็นนามธรรมเกี่ยวข้องไม่ใช่ระบบไฟล์
Jon Skeet

1
@jagdpanzer: มันเป็นแค่คลาสที่โหลดโดย classloader เดียวกันโดยทั่วไป - และเป็นเพราะClass.getResourceAsStreamเป็นวิธีที่สะดวกสบายในการโทรClassLoader.getResourceAsStreamแต่มีคุณสมบัติเพิ่มเติมของทรัพยากร "ญาติ" หากคุณระบุทรัพยากรที่แน่นอนการโทรใด ๆ ที่ใช้ classloader เดียวกันจะทำสิ่งเดียวกัน
Jon Skeet

115

เมื่อใช้Spring Framework (ไม่ว่าจะเป็นชุดของยูทิลิตี้หรือคอนเทนเนอร์ - คุณไม่จำเป็นต้องใช้ฟังก์ชั่นหลัง) คุณสามารถใช้Resourceนามธรรมได้อย่างง่ายดาย

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

ผ่านทรัพยากรอินเตอร์เฟซที่คุณสามารถเข้าถึงทรัพยากรเป็นInputStream , URL , URIหรือไฟล์ การเปลี่ยนประเภททรัพยากรเป็นเช่นทรัพยากรระบบไฟล์เป็นเรื่องง่าย ๆ ในการเปลี่ยนอินสแตนซ์


6
คุณกรุณาให้รหัสตัวอย่างว่าจะใช้กับไฟล์ I / O ได้อย่างไร ฉันไม่สามารถหาที่ดี , อย่างชัดเจนและตรงไปตรงมาทางเกี่ยวกับวิธีการที่จะใช้ในอินเทอร์เน็ต: ((((

ทำงานเหมือนจับใจ สายการบินเดียวที่ให้มาคือทั้งหมดที่คุณต้องการ ใช้การแยกสตรีมจากตัวอย่างอื่น ๆ หากคุณไม่รู้วิธีรับสตริงจากสตรีม
Joseph Lust

ฉันมีปัญหาเล็กน้อยในการหาว่าจะทำอย่างไรกับตัวแปรทรัพยากรเช่นกัน ฉันได้แก้ไขคำตอบพร้อมรายละเอียดอีกเล็กน้อย
DavidZemon

ฉันใช้ Spring อยู่แล้วลองใช้วิธี "pure java" มันกำลังฆ่าฉันความแตกต่างระหว่าง getResource, getResourceAsStream และอื่น ๆ ที่ไม่มีตัวอย่างการทำงานที่ดี นี่เป็นตัวอย่างที่สมบูรณ์แบบของการห่อหุ้มดังนั้นฉันไม่ต้องสนใจ
TinkerTenorSoftwareGuy

1
ระวังถ้าคุณทำโปรเจคของคุณให้เป็น jar คุณควรใช้ InputStream ถ้าคุณใช้ไฟล์มันทำงานใน IDE ของคุณ แต่จะล้มเหลวถ้าคุณทดสอบจากขวด หากคุณต้องการไฟล์ลองด้วยstackoverflow.com/questions/4317035/…
Rafael Membrives

58

นี่คือวิธีที่ฉันอ่านทุกบรรทัดของไฟล์ข้อความบน classpath ของฉันโดยใช้ 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
หากต้องการอ่านเป็นลองสตริงเดี่ยว สตริงใหม่ (Files.readAllBytes (Paths.get (MyClass.class.getResource (ทรัพยากร) .toURI ())));
Theo Briscoe

2
ทางออกที่ดีที่สุดสำหรับฉันเนื่องจากไม่ต้องการการพึ่งพาใด ๆ เช่น Spring หรือ Commons IO
เบอร์นี

1
สิ่งนี้จะล้มเหลวหากไฟล์ทรัพยากรของคุณอยู่ในขวดเช่นโมดูล maven ในกรณีที่คุณจะต้องใช้สิ่งที่ต้องการ'sSpring StreamUtils.copyToString
Somu

26

โปรดลอง

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

ความพยายามของคุณไม่ทำงานเนื่องจากมีตัวโหลดคลาสสำหรับคลาสของคุณเท่านั้นที่สามารถโหลดจาก classpath คุณใช้คลาสโหลดเดอร์สำหรับระบบจาวาเอง


ไม่แน่ใจเกี่ยวกับ "/" แม้ว่า เส้นทางสัมพัทธ์อาจทำงานได้ดีขึ้นในกรณีนี้
VonC

3
หากคุณใช้งานโดยไม่มี "/" คุณกำลังมองหาไฟล์ของคุณอยู่ในแพ็คเกจของ "this"
tangens

1
ไฟล์ InputStream = this.getClass (). getResourceAsStream ("SomeTextFile.txt"); ไฟล์ InputStream = this.getClass (). getResourceAsStream ("/ SomeTextFile.txt"); ไฟล์ InputStream = this.getClass (). getResourceAsStream ("// SomeTextFile.txt"); ไม่มีการทำงานใด ๆ ที่กล่าวมาข้างต้น: (
Chaitanya MSV

@Chaitanya: คุณสามารถเรียกใช้ตัวอย่างจากคำตอบของ John Skeet ได้หรือไม่?
Aaron Digulla


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

แล้วไงต่อ? ข้อมูลนั้นไม่ได้ใช้ด้วยตนเอง
มาร์ควิสแห่ง Lorne

ข้อมูลนี้สมบูรณ์แบบ ฉันหายไปแค่ getPath ()!
แพทริค

@Patrick คำตอบนี้ไม่ได้ให้ 'เส้นทางสัมบูรณ์ระดับ' มันมี URL ไม่เหมือนกันทั้งหมด
มาร์ควิสแห่ง Lorne

12

อย่างใดคำตอบที่ดีที่สุดไม่ทำงานสำหรับฉัน ฉันต้องใช้รหัสที่แตกต่างกันเล็กน้อยแทน

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

ฉันหวังว่านี่จะช่วยผู้ที่พบปัญหาเดียวกัน


สิ่งนี้ช่วยฉันบน Android รวมถึงโหลดคลาสโดยตัวโหลดแอปพลิเคชัน แต่คีย์ที่จำเป็นต้องใช้คือโหลดแบบขี้เกียจในเธรด UI
asokan

คุณต้องให้ข้อมูลว่าทำไมคำตอบที่ดีที่สุดไม่เหมาะกับคุณ (เช่นโครงสร้างแอปพลิเคชันของคุณกรอบงานที่คุณใช้ข้อผิดพลาด ฯลฯ ) คำตอบที่ดีที่สุดกล่าวอย่างชัดเจนว่า 1) ไดเรกทอรีต้องอยู่ใน classpath, 2) คุณต้องขอจากคลาสที่โหลดโดย class loader เดียวกัน โอกาสที่เป็นหนึ่งในข้อสันนิษฐานเหล่านี้ไม่ได้มีไว้สำหรับการสมัคร นอกจากนี้คลาสตัวโหลดบริบทถูกกีดกันอย่างมากเนื่องจากถูกนำมาใช้เป็นแฮ็ก กรอบบางอย่างใช้ประโยชน์จากมัน แต่เป็นสิ่งสำคัญที่จะต้องทราบความหมาย (ซึ่งคุณต้องอธิบายพื้นหลังของโครงการของคุณ)
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
มาร์ควิสแห่ง Lorne

เมธอด getFile ของ URL ไม่ส่งคืนชื่อไฟล์ มันเพิ่งส่งคืนส่วนเส้นทางของ URL ซึ่งไม่รับประกันว่าจะเป็นชื่อไฟล์ที่ถูกต้อง (คลาส URL เป็นส่วนหนึ่งของ Java 1.0 ก่อนหน้านี้จริง ๆ แล้ว URL ส่วนใหญ่อ้างถึงไฟล์จริงบนคอมพิวเตอร์เครื่องเดียวกันหรือคอมพิวเตอร์เครื่องอื่น)
VGR

3

หากต้องการอ่านเนื้อหาของไฟล์ลงใน String จาก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ไฟล์และตั้งค่า classpath ในนั้น (โดยใช้set CLASSPATH=) แทนที่จะใช้ระบบโกลบอลหรือตัวแปรผู้ใช้

สิ่งนี้ยังทำให้แน่ใจว่าคุณสามารถมีโปรแกรม Java มากกว่าหนึ่งโปรแกรมที่ทำงานบนคอมพิวเตอร์ของคุณเพราะพวกมันถูกผูกไว้กับ classpaths ที่แตกต่างกัน


0

คำตอบของฉันไม่ตรงกับที่ถามในคำถาม ค่อนข้างฉันจะให้วิธีการที่แน่นอนว่าเราสามารถอ่านไฟล์ลงในแอปพลิเคชัน java จากเส้นทางคลาสโครงการ

ตัวอย่างเช่นสมมติว่าชื่อไฟล์config.xmlตั้งอยู่ในพา ธ ดังนี้: -

com.myproject.config.dev

และไฟล์คลาสที่เรียกใช้งานจาวาของเราอยู่ในพา ธ ด้านล่าง: -

com.myproject.server.main

ขณะนี้เป็นเพียงการตรวจสอบทั้งในเส้นทางดังกล่าวข้างต้นซึ่งเป็นที่ใกล้ที่สุดไดเรกทอรีทั่วไป / โฟลเดอร์จากที่คุณสามารถเข้าถึงทั้งdevและหลักไดเรกทอรี / โฟลเดอร์ (com.myproject.server.main - ที่จาวาระดับปฏิบัติการโปรแกรมของเราจะมีชีวิตอยู่) - เราสามารถมองเห็น นั่นคือโฟลเดอร์ / ไดเรกทอรีของmyprojectซึ่งเป็นไดเรกทอรี / โฟลเดอร์ทั่วไปที่ใกล้ที่สุดซึ่งเราสามารถเข้าถึงไฟล์ example.xml ของเราได้ ดังนั้นจากอยู่จาวาระดับปฏิบัติการในโฟลเดอร์ / ไดเรกทอรีหลักที่เราต้องกลับไปสองขั้นตอนเช่น../../เข้าถึงMyProject ตอนนี้ต่อไปนี้ดูวิธีที่เราสามารถอ่านไฟล์: -

package com.myproject.server.main;

class Example {

  File xmlFile;

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

  public File getXMLFile() {
      return this.xmlFile;
  }
   public static void main(String args[]){
      Example ex = new Example();
      File xmlFile = ex.getXMLFile();
   }
}

0

หากคุณรวบรวมโครงการของคุณในไฟล์ jar: คุณสามารถวางไฟล์ของคุณในแหล่งข้อมูล / ไฟล์ / 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
ยินดีต้อนรับสู่ Stack Overflow! โปรดอย่าเพิ่ม "ขอบคุณ" เป็นคำตอบแม้ว่าคุณจะเป็นผู้จัดหาวิธีแก้ปัญหาของคุณไปบางส่วนหากโซลูชันของคุณเหมือนกับโพสต์อื่นก็ไม่จำเป็นต้องเพิ่ม หลังจากที่คุณลงทุนในเว็บไซต์คุณจะได้รับสิทธิพิเศษมากมายในการตอบคำถามที่คุณชอบซึ่งเป็นวิธี Stack Overflow ในการกล่าวคำขอบคุณ
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) เราต้องการอ่านเนื้อหาของ class path resources ( sample.txt) of read-classpath-resource-1.0-SNAPSHOT.jarthroughclient-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. เรียกใช้ jar ดังต่อไปนี้:

[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


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

    }

}

ไม่ตอบคำถาม แต่อย่างใด
มาร์ควิสแห่ง Lorne

-5

คุณต้องใส่ 'ตัวแปรระบบ' ของคุณบน java classpath


ฉันวางตัวแปรของระบบเอง
Chaitanya MSV

'ตัวแปรระบบ' คือ Java CLASSPATH คำตอบไม่สมเหตุสมผล
มาร์ควิสแห่ง Lorne

ทั้งหมดจริง ... ไม่จำไม่ได้ว่าการเขียนคำตอบนี้ :)
Salandur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.