ใช้ในการอ่านไฟล์ข้อความของทรัพยากรไปยัง String (Java) [ปิด]


215

มียูทิลิตีใด ๆ ที่ช่วยในการอ่านไฟล์ข้อความในทรัพยากรลงใน String หรือไม่ ฉันคิดว่านี่เป็นข้อกำหนดที่ได้รับความนิยม แต่ฉันไม่พบโปรแกรมอรรถประโยชน์ใด ๆ หลังจาก Googling


1
โปรดอธิบายสิ่งที่คุณหมายถึงโดย "ไฟล์ข้อความทรัพยากร" และ "ไฟล์ข้อความในทรัพยากร" - มันไม่ง่ายที่จะเข้าใจสิ่งที่คุณพยายามที่จะบรรลุ
Mat

นั่นเป็นเพียงไฟล์ข้อความภายใต้ classpath เช่น "classpath *: mytext / text.txt"
Loc Phan

คำตอบ:


301

ใช่ฝรั่งให้สิ่งนี้ในResourcesชั้นเรียน ตัวอย่างเช่น:

URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, StandardCharsets.UTF_8);

21
@JonSkeet นี่ยอดเยี่ยม แต่สำหรับเว็บแอปพลิเคชั่นมันอาจไม่ใช่ทางออกที่ดีที่สุดการใช้งานกำลังดำเนินgetResourceอยู่Resource.class.getClassLoaderแต่ในเว็บแอปพลิเคชันนี่อาจไม่ใช่ "class" ของคุณดังนั้นจึงแนะนำให้ใช้ (เช่นใน [1]) Thread.currentThread().getContextClassLoader().getResourceAsStreamแทน (อ้างอิง [1]: stackoverflow.com/questions/676250/… )
Eran Medan

2
@EranMedan: ใช่ถ้าคุณต้องการให้ classloader บริบทคุณต้องการใช้อย่างชัดเจน
Jon Skeet

6
ในกรณีพิเศษเมื่อทรัพยากรอยู่ถัดจากชั้นเรียนของคุณคุณสามารถทำได้Resources.toString(MyClass.getResource("foo.txt"), Charsets.UTF_8)ซึ่งรับประกันการใช้งานตัวโหลดคลาสที่ถูกต้อง
Bogdan Calmac

2
com.google.common.io.Resourcesมีการทำเครื่องหมายไม่เสถียรตาม SonarQube
Ghilteras

1
guavaมีการเปลี่ยนแปลงการใช้งาน สำหรับฝรั่ง 23 การใช้งานมีดังต่อไปนี้ ClassLoader loader = MoreObjects.firstNonNull( Thread.currentThread().getContextClassLoader(), Resources.class.getClassLoader());
xxy

171

คุณสามารถใช้กลโกง Stupid Scanner oneliner แบบเดิมโดยไม่ต้องพึ่งพาเพิ่มเติมเช่นฝรั่ง:

String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();

ผู้ชายอย่าใช้สิ่งของบุคคลที่ 3 เว้นแต่คุณจะต้องการมัน มีฟังก์ชั่นมากมายใน JDK อยู่แล้ว


41
การหลีกเลี่ยงบุคคลที่สามเป็นหลักการที่สมเหตุสมผล น่าเสียดายที่ห้องสมุดหลักดูเหมือนว่าจะแพ้การสร้างแบบจำลองกรณีการใช้งานจริงในชีวิต ดูไฟล์ของ Java 7 และบอกฉันว่าทำไมการอ่านทุกอย่างจากแหล่งข้อมูล classpath ไม่ได้รวมอยู่ที่นั่นด้วย? หรืออย่างน้อยก็ใช้ 'ระบบแฟ้ม' มาตรฐาน
Dilum Ranatunga

3
มันเป็นหรือไม่จำเป็นต้องปิดสตรีมด้วย? ฝรั่งปิดกระแสภายใน
virgo47

ทำงานอย่างสวยงามสำหรับฉันเช่นกัน! ฉันเห็นด้วยเกี่ยวกับสิ่งที่บุคคลที่สามด้วย: ในคำตอบหลายคำตอบเริ่มต้นมักจะใช้ห้องสมุดบุคคลที่สาม - ไม่ว่าจะเป็นจาก Apache หรือคนอื่น
Terje Dahl

1
เปลี่ยนCartApplication.class.getResourceAsStreamไปCartApplication.class.getClassLoader().getResourceAsStreamโหลดทรัพยากรในปัจจุบัน jar..like SRM / ทดสอบ / ทรัพยากร
คริส Damour

5
ขณะที่ฉันใช้สิ่งนี้ฉันไม่เห็นด้วยกับการหลีกเลี่ยงแพคเกจของบุคคลที่สามอย่างสมบูรณ์ ความจริงที่ว่าใน Java วิธีเดียวที่จะอ่านไฟล์ไปยังสตริงได้อย่างง่ายดายคือด้วยเคล็ดลับสแกนเนอร์เป็นเรื่องน่าเศร้า ทางเลือกในการใช้ lib บุคคลที่สามคือทุกคนจะสร้าง wrappers ของตนเอง Guava for IO เป็นฝ่ายชนะหากคุณมีความต้องการใช้งานประเภทนี้จำนวนมาก ที่ฉันจะยอมรับก็คือคุณไม่ควรนำเข้าแพ็คเกจของบุคคลที่สามหากคุณมีที่เดียวในรหัสของคุณซึ่งคุณต้องการทำเช่นนี้ นั่นจะเป็น overkill imo
Kenny Cason

90

สำหรับ java 7:

new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));

3
โปรดอธิบายว่าเหตุใดจึงใช้งานได้ดีกว่าตัวเลือกอื่น ๆ และข้อควรพิจารณาด้านประสิทธิภาพ / การเข้ารหัสใด ๆ
nanofarad

5
มันเป็น nio 2 ใน java 1.7 มันเป็น feture ดั้งเดิมของจาวา สำหรับการเข้ารหัสให้ใช้สตริงใหม่ (ไบต์, StandardCharsets.UTF_8)
Kovalsky Dmitryi

5
ในกรณีของฉันฉันต้องการgetClass().getClassLoader()แต่เป็นทางออกที่ดี!
Emmanuel Touzery

3
สิ่งนี้จะใช้ไม่ได้เมื่อแอปนี้บรรจุในขวด
Daniel Bo

65

โซลูชัน Java 8+ ที่เรียบง่ายและเป็นมิตรกับขวด

วิธีการง่ายๆด้านล่างนี้ทำได้ดีถ้าคุณใช้ Java 8 หรือสูงกว่า:

/**
 * Reads given resource file as a string.
 *
 * @param fileName path to the resource file
 * @return the file's contents
 * @throws IOException if read fails for any reason
 */
static String getResourceFileAsString(String fileName) throws IOException {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    try (InputStream is = classLoader.getResourceAsStream(fileName)) {
        if (is == null) return null;
        try (InputStreamReader isr = new InputStreamReader(is);
             BufferedReader reader = new BufferedReader(isr)) {
            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
        }
    }
}

และก็ยังทำงานร่วมกับทรัพยากรในไฟล์ jar

เกี่ยวกับการเข้ารหัสข้อความ: InputStreamReaderจะใช้ชุดอักขระเริ่มต้นของระบบในกรณีที่คุณไม่ได้ระบุไว้ คุณอาจต้องการระบุด้วยตนเองเพื่อหลีกเลี่ยงปัญหาการถอดรหัสเช่นนี้:

new InputStreamReader(isr, StandardCharsets.UTF_8);

หลีกเลี่ยงการพึ่งพาที่ไม่จำเป็น

มักจะไม่ชอบขึ้นอยู่กับห้องสมุดขนาดใหญ่และอ้วน นอกจากว่าคุณกำลังใช้ Guava หรือ Apache Commons IO อยู่แล้วสำหรับงานอื่น ๆ การเพิ่มไลบรารีเหล่านั้นในโครงการของคุณเพื่อให้สามารถอ่านจากไฟล์ดูเหมือนจะมากเกินไป

วิธีการ "ง่าย"? คุณต้องล้อเล่นฉัน

ฉันเข้าใจว่า pure Java ไม่ทำงานได้ดีเมื่อพูดถึงการทำงานง่ายๆเช่นนี้ ตัวอย่างเช่นนี่คือวิธีที่เราอ่านจากไฟล์ใน Node.js:

const fs = require("fs");
const contents = fs.readFileSync("some-file.txt", "utf-8");

เรียบง่ายและอ่านง่าย (แม้ว่าผู้คนยังคงต้องการพึ่งพาหลายคนอยู่แล้วส่วนใหญ่เกิดจากความไม่รู้) หรือใน Python:

with open('some-file.txt', 'r') as f:
    content = f.read()

มันเศร้า แต่ก็ยังง่ายสำหรับมาตรฐานของ Java และสิ่งที่คุณต้องทำคือคัดลอกวิธีข้างต้นไปยังโครงการของคุณและใช้มัน ฉันไม่ได้ขอให้คุณเข้าใจสิ่งที่เกิดขึ้นในนั้นเพราะมันไม่สำคัญกับใคร มันใช้งานได้ระยะเวลา :-)


4
@zakmck โปรดพยายามแสดงความคิดเห็นของคุณอย่างสร้างสรรค์ เมื่อคุณเติบโตขึ้นในฐานะนักพัฒนาที่เป็นผู้ใหญ่คุณจะได้เรียนรู้ว่าบางครั้งคุณต้องการที่จะ ตัวอย่างเช่นคุณอาจต้องรักษาไบนารีของคุณให้ต่ำกว่าขนาดที่กำหนดไว้ ไลบรารีมักทำให้ขนาดแอปพลิเคชันของคุณเพิ่มขึ้นตามลำดับความสำคัญ หนึ่งอาจโต้เถียงตรงข้ามกับสิ่งที่คุณพูดว่า: "ไม่จำเป็นต้องเขียนโค้ดใช่แล้วลองนำเข้าห้องสมุดทุกครั้ง" คุณต้องการนำเข้าห้องสมุดเพื่อประหยัดรหัส 3 บรรทัดหรือไม่? ฉันเดิมพันว่าการเพิ่มห้องสมุดจะเพิ่ม LOC ของคุณมากกว่านั้น กุญแจสำคัญคือความสมดุล
Lucio Paiva

3
ไม่ใช่ทุกคนกำลังทำงานบนคลาวด์ มีระบบฝังตัวอยู่ทุกหนทุกแห่งที่ใช้งานจาวาเช่น ฉันไม่เห็นประเด็นของคุณในการวิจารณ์คำตอบที่ให้วิธีการที่ถูกต้องโดยสมบูรณ์เมื่อคุณพูดถึงตัวเองว่าคุณจะยอมรับคำแนะนำในการใช้ JDK โดยตรงในรหัสของคุณเอง อย่างไรก็ตามโปรดลองแสดงความคิดเห็นอย่างเคร่งครัดเพื่อช่วยปรับปรุงคำตอบไม่ใช่เพื่อหารือเกี่ยวกับความคิดเห็น
Lucio Paiva

1
โซลูชัน JDK ที่ดีเท่านั้น ฉันแค่เพิ่มการตรวจสอบว่าInputStreamตัวแปรisเป็นnullหรือไม่
scrutari

2
ดี ฉันใช้สิ่งนี้ คุณอาจพิจารณาปิดสตรีม / ผู้อ่านด้วย
Dimplex

1
@RobertBain ฉันได้แก้ไขคำตอบเพื่อเพิ่มข้อมูลเกี่ยวกับคำเตือนชุดอักขระ แจ้งให้เราทราบหากคุณพบว่ามีข้อผิดพลาดอะไรเกิดขึ้นกับตัวโหลดคลาสใน AWS ดังนั้นฉันจึงสามารถเพิ่มลงในคำตอบได้เช่นกัน ขอบคุณ!
Lucio Paiva

57

Guavaมีวิธี "toString" สำหรับการอ่านไฟล์ลงใน String:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

String content = Files.toString(new File("/home/x1/text.log"), Charsets.UTF_8);

วิธีนี้ไม่ต้องการให้ไฟล์อยู่ใน classpath (เช่นเดียวกับคำตอบก่อนหน้านี้ของJon Skeet )


2
หรือถ้ามันเป็นกระแสอินพุทฝรั่งมีวิธีที่ดีสำหรับการนี้เช่นกันString stringFromStream = CharStreams.toString(new InputStreamReader(resourceAsStream, "UTF-8"));
Eran เมดาน

1
สิ่งนี้เลิกใช้แล้วใน Guava 24.1
Andrey

47

yegor256พบทางออกที่ดีโดยใช้ Apache Commons IO :

import org.apache.commons.io.IOUtils;

String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
                               "UTF-8");

ฉันชอบ "" ในกรณีนี้ไม่สามารถใช้งานได้
user833970

11
เช่นเดียวกับที่มีขนาดกะทัดรัด IOUtils.toString(this.getClass().getResource("foo.xml"), "UTF-8")แต่มีการปิดเหมาะสมของสตรีมใส่:
Bogdan Calmac

1
หากวิธีนี้ใช้ไม่ได้ผลให้ลองเพิ่มgetClassLoader()วิธีห่วงโซ่: String text = IOUtils.toString( getClass().getClassLoader().getResourceAsStream("foo.xml"), StandardCharsets.UTF_8);
Abdull

39

apache-commons-ioมีชื่อยูทิลิตี้FileUtils:

URL url = Resources.getResource("myFile.txt");
File myFile = new File(url.toURI());

String content = FileUtils.readFileToString(myFile, "UTF-8");  // or any other encoding

1
ทำไมต้องระบุการเข้ารหัสฉันไม่เข้าใจ ถ้าฉันอ่านไฟล์ฉันแค่ต้องการมีอะไรอยู่ในนั้นก็ควรจะรู้ว่าการเข้ารหัสมันเป็นอย่างไร เมื่อฉันเปิดใน Notepad หรือ ++ ฉันไม่ได้บอกว่าควรใช้การเข้ารหัสอะไร ฉันใช้วิธีนี้แล้วหลังจากนั้น writeStringToFile ... แต่เนื้อหาต่างกัน ฉันได้รับโทเค็นแปลก ๆ ในไฟล์ที่โคลน .. ฉันไม่เข้าใจว่าทำไมฉันต้องระบุการเข้ารหัส
mmm

11
@Hamidan การเลือกการเข้ารหัสที่ถูกต้องเป็นขั้นตอนวิธีที่ซับซ้อนมาก มันมักจะนำมาใช้ในการแก้ไขข้อความ แต่บางครั้งพวกเขาล้มเหลวในการตรวจสอบการเข้ารหัสที่ถูกต้อง ฉันไม่คาดหวังว่าไฟล์การอ่าน API จะฝังอัลกอริทึมที่ซับซ้อนเช่นนี้เพื่ออ่านไฟล์ของฉัน
Vincent Robert

1
@SecretService นอกจากนี้อัลกอริทึมเหล่านั้นยังใช้ประโยชน์จากข้อมูลเช่นภาษาของระบบปฏิบัติการโลแคลและการตั้งค่าภูมิภาคอื่น ๆ ซึ่งหมายความว่าการอ่านไฟล์โดยไม่ระบุการเข้ารหัสอาจทำงานได้ในการตั้งค่าของคุณ
Feuermurmel

Apache FileUtils readLines (ไฟล์) & copyURLToFile (URL, tempFile)
Yash

2
ฉันไม่คิดว่ามันจะใช้งานได้หากพบทรัพยากรในขวด จากนั้นมันจะไม่เป็นไฟล์
Ville Oikarinen

16

ฉันมักจะมีปัญหานี้ด้วยตนเอง เพื่อหลีกเลี่ยงการพึ่งพาโครงการขนาดเล็กฉันมักจะเขียนฟังก์ชั่นยูทิลิตี้ขนาดเล็กเมื่อฉันไม่ต้องการคอมมอน io นี่คือรหัสในการโหลดเนื้อหาของไฟล์ในสตริงบัฟเฟอร์:

StringBuffer sb = new StringBuffer();

BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("path/to/textfile.txt"), "UTF-8"));
for (int c = br.read(); c != -1; c = br.read()) sb.append((char)c);

System.out.println(sb.toString());   

การระบุการเข้ารหัสมีความสำคัญในกรณีนั้นเนื่องจากคุณอาจแก้ไขไฟล์ของคุณใน UTF-8 จากนั้นใส่ไว้ในขวดและคอมพิวเตอร์ที่เปิดไฟล์อาจมี CP-1251 เป็นการเข้ารหัสไฟล์ดั้งเดิม (ตัวอย่าง) ; ดังนั้นในกรณีนี้คุณไม่เคยรู้การเข้ารหัสเป้าหมายดังนั้นข้อมูลการเข้ารหัสที่ชัดเจนจึงเป็นสิ่งสำคัญ การวนลูปเพื่ออ่านไฟล์ char โดย char ดูเหมือนว่าไม่มีประสิทธิภาพ แต่มันถูกใช้กับ BufferedReader และจริง ๆ แล้วค่อนข้างเร็ว


15

คุณสามารถใช้รหัสฟอร์ม Java ต่อไปนี้

new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI())));

จำเป็นต้องมีคำสั่งนำเข้าใดในการดึงในคลาส "ไฟล์" และ "เส้นทาง"
Steve Scherer

1
ทั้งสองเป็นส่วนหนึ่งของแพ็คเกจ java.nio.file จาก JDK 7+
Raghu K Nair

ไม่ทำงานเมื่ออยู่ในไฟล์ jar
พอใจ

4

หากคุณต้องการได้รับสตริงของคุณจากทรัพยากรโครงการเช่นไฟล์ testcase / foo.json ใน src / main / resources ในโครงการของคุณทำสิ่งนี้:

String myString= 
 new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testcase/foo.json").toURI())));

โปรดสังเกตว่าเมธอด getClassLoader () หายไปในตัวอย่างอื่น


2

ใช้ FileUtils ของ Apache Commons มันมีวิธีreadFileToString


ไฟล์ใช้งานได้เฉพาะกับทรัพยากรประเภทพา ธ ที่ดีไฟล์ ไม่ใช่หากเป็นองค์ประกอบในไฟล์. jar หรือส่วนหนึ่งของ jar ไขมันหนึ่งในการใช้งาน classloader อื่น ๆ
toolforger

2

ฉันใช้สิ่งต่อไปนี้เพื่ออ่านไฟล์ทรัพยากรจากclasspath:

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Scanner;

public class ResourceUtilities
{
    public static String resourceToString(String filePath) throws IOException, URISyntaxException
    {
        try (InputStream inputStream = ResourceUtilities.class.getClassLoader().getResourceAsStream(filePath))
        {
            return inputStreamToString(inputStream);
        }
    }

    private static String inputStreamToString(InputStream inputStream)
    {
        try (Scanner scanner = new Scanner(inputStream).useDelimiter("\\A"))
        {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
}

ไม่จำเป็นต้องพึ่งพาบุคคลที่สาม


1

ด้วยชุดการนำเข้าแบบคงที่โซลูชัน Guava อาจมีขนาดเล็กมากแบบหนึ่งซับ:

toString(getResource("foo.txt"), UTF_8);

จำเป็นต้องนำเข้าต่อไปนี้:

import static com.google.common.io.Resources.getResource
import static com.google.common.io.Resources.toString
import static java.nio.charset.StandardCharsets.UTF_8

1
package test;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            String fileContent = getFileFromResources("resourcesFile.txt");
            System.out.println(fileContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //USE THIS FUNCTION TO READ CONTENT OF A FILE, IT MUST EXIST IN "RESOURCES" FOLDER
    public static String getFileFromResources(String fileName) throws Exception {
        ClassLoader classLoader = Main.class.getClassLoader();
        InputStream stream = classLoader.getResourceAsStream(fileName);
        String text = null;
        try (Scanner scanner = new Scanner(stream, StandardCharsets.UTF_8.name())) {
            text = scanner.useDelimiter("\\A").next();
        }
        return text;
    }
}

1

อย่างน้อยที่สุดของ Apache commons-io 2.5 วิธีการ IOUtils.toString () รองรับอาร์กิวเมนต์ URI และส่งคืนเนื้อหาของไฟล์ที่อยู่ภายในไหบน classpath:

IOUtils.toString(SomeClass.class.getResource(...).toURI(), ...)

1

ฉันชอบคำตอบของ akosicki กับ Stupid Scanner Trick มันง่ายที่สุดที่ฉันเห็นโดยไม่ต้องพึ่งพาภายนอกที่ทำงานใน Java 8 (และในความเป็นจริงกลับไปที่ Java 5) ต่อไปนี้เป็นคำตอบที่ง่ายยิ่งขึ้นถ้าคุณสามารถใช้ Java 9 หรือสูงกว่า (ตั้งแต่InputStream.readAllBytes()ถูกเพิ่มใน Java 9):

String text = new String(AppropriateClass.class.getResourceAsStream("foo.txt").readAllBytes());

0

Guava ยังมีFiles.readLines()ถ้าคุณต้องการค่าตอบแทนเป็นList<String>บรรทัดต่อบรรทัด:

List<String> lines = Files.readLines(new File("/file/path/input.txt"), Charsets.UTF_8);

โปรดอ้างอิงที่นี่เพื่อเปรียบเทียบ 3 วิธี ( BufferedReaderเทียบกับของFilesGuava กับของ Guava Resources) เพื่อรับStringจากไฟล์ข้อความ


คลาส Charsets คืออะไร ไม่ใช่คนพื้นเมือง
e-info128

@ e-info128 Charsetsยังอยู่ใน Guava เห็นนี้: google.github.io/guava/releases/23.0/api/docs
philipjkim

0

นี่คือวิธีการของฉันทำงานได้ดี

public String getFileContent(String fileName) {
    String filePath = "myFolder/" + fileName+ ".json";
    try(InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath)) {
        return IOUtils.toString(stream, "UTF-8");
    } catch (IOException e) {
        // Please print your Exception
    }
}

2
IOUtils มาจากไหน แหล่งอ้างอิงควรอ้างอิงอย่างชัดเจน
ehecatl

0

ฉันได้เขียนวิธี readResource () ที่นี่เพื่อที่จะสามารถทำได้ในการร้องของ่ายๆ มันขึ้นอยู่กับห้องสมุด Guava แต่ฉันชอบวิธี JDK เท่านั้นที่แนะนำในคำตอบอื่น ๆ และฉันคิดว่าฉันจะเปลี่ยนสิ่งเหล่านี้


0

หากคุณรวม Guava คุณสามารถใช้:

String fileContent = Files.asCharSource(new File(filename), Charset.forName("UTF-8")).read();

(วิธีการแก้ปัญหาอื่น ๆ ที่กล่าวถึงวิธีอื่นสำหรับ Guava แต่พวกเขาจะเลิก


0

รหัสต่อไปนี้ใช้งานได้สำหรับฉัน:

compile group: 'commons-io', name: 'commons-io', version: '2.6'

@Value("classpath:mockResponse.json")
private Resource mockResponse;

String mockContent = FileUtils.readFileToString(mockResponse.getFile(), "UTF-8");

0

นี่เป็นวิธีแก้ปัญหาโดยใช้ Java 11's Files.readString:

public class Utils {
    public static String readResource(String name) throws URISyntaxException, IOException {
        var uri = Utils.class.getResource("/" + name).toURI();
        var path = Paths.get(uri);
        return Files.readString(path);
    }
}

0

ฉันทำวิธีคงที่ไม่มีการพึ่งพาแบบนี้:

import java.nio.file.Files;
import java.nio.file.Paths;

public class ResourceReader {
    public  static String asString(String resourceFIleName) {
        try  {
            return new String(Files.readAllBytes(Paths.get(new CheatClassLoaderDummyClass().getClass().getClassLoader().getResource(resourceFIleName).toURI())));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
class CheatClassLoaderDummyClass{//cheat class loader - for sql file loading
}

0

ฉันชอบ Apache ทั่วไปสำหรับสิ่งประเภทนี้และใช้กรณีการใช้งานที่แน่นอน (การอ่านไฟล์จาก classpath) อย่างกว้างขวางเมื่อทดสอบโดยเฉพาะอย่างยิ่งสำหรับการอ่านไฟล์ JSON จาก/src/test/resourcesเป็นส่วนหนึ่งของการทดสอบหน่วย / บูรณาการ เช่น

public class FileUtils {

    public static String getResource(String classpathLocation) {
        try {
            String message = IOUtils.toString(FileUtils.class.getResourceAsStream(classpathLocation),
                    Charset.defaultCharset());
            return message;
        }
        catch (IOException e) {
            throw new RuntimeException("Could not read file [ " + classpathLocation + " ] from classpath", e);
        }
    }

}

สำหรับจุดประสงค์ในการทดสอบมันเป็นเรื่องดีที่จะจับIOExceptionและโยนRuntimeException- คลาสทดสอบของคุณอาจมีลักษณะเช่น

    @Test
    public void shouldDoSomething () {
        String json = FileUtils.getResource("/json/input.json");

        // Use json as part of test ...
    }

-2
public static byte[] readResoureStream(String resourcePath) throws IOException {
    ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
    InputStream in = CreateBffFile.class.getResourceAsStream(resourcePath);

    //Create buffer
    byte[] buffer = new byte[4096];
    for (;;) {
        int nread = in.read(buffer);
        if (nread <= 0) {
            break;
        }
        byteArray.write(buffer, 0, nread);
    }
    return byteArray.toByteArray();
}

Charset charset = StandardCharsets.UTF_8;
String content = new   String(FileReader.readResoureStream("/resource/...*.txt"), charset);
String lines[] = content.split("\\n");

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