এমন কোনও ইউটিলিটি রয়েছে যা রিসোর্সে টেক্সট ফাইলটিকে স্ট্রিংয়ে পড়তে সহায়তা করে। আমি মনে করি এটি একটি জনপ্রিয় প্রয়োজনীয়তা, তবে গুগলিংয়ের পরে আমি কোনও উপযোগিতা পাইনি।
এমন কোনও ইউটিলিটি রয়েছে যা রিসোর্সে টেক্সট ফাইলটিকে স্ট্রিংয়ে পড়তে সহায়তা করে। আমি মনে করি এটি একটি জনপ্রিয় প্রয়োজনীয়তা, তবে গুগলিংয়ের পরে আমি কোনও উপযোগিতা পাইনি।
উত্তর:
হ্যাঁ, পেয়ারা এই উপলব্ধ Resources
বর্গ। উদাহরণ স্বরূপ:
URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, StandardCharsets.UTF_8);
getResource
ব্যবহার করা হচ্ছে Resource.class.getClassLoader
তবে ওয়েব অ্যাপ্লিকেশনগুলিতে এটি "আপনার" শ্রেণীর লোডার নাও হতে পারে, তাই এটি প্রস্তাবিত (যেমন [1]) ব্যবহার করার জন্য Thread.currentThread().getContextClassLoader().getResourceAsStream
পরিবর্তে (রেফারেন্স [1]: স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / 676250/… )
Resources.toString(MyClass.getResource("foo.txt"), Charsets.UTF_8)
যা সঠিক বর্গ লোডার ব্যবহারের গ্যারান্টি দেয়।
com.google.common.io.Resources
guava
বাস্তবায়ন পরিবর্তন করেছে। পেয়ারার জন্য 23 বাস্তবায়ন নিম্নলিখিত পছন্দ করে। ClassLoader loader = MoreObjects.firstNonNull( Thread.currentThread().getContextClassLoader(), Resources.class.getClassLoader());
আপনি পেয়ারার মতো কোনও অতিরিক্ত নির্ভরতা ছাড়াই এটি করতে পুরানো স্টুপিড স্ক্যানার ট্রিক অনেলিনার ব্যবহার করতে পারেন :
String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();
বন্ধুরা, আপনার যদি সত্যিই এটির প্রয়োজন না হয় তৃতীয় পক্ষের জিনিস ব্যবহার করবেন না। জেডিকে ইতিমধ্যে প্রচুর কার্যকারিতা রয়েছে।
CartApplication.class.getResourceAsStream
করার জন্য CartApplication.class.getClassLoader().getResourceAsStream
বর্তমান jar..like SRM / পরীক্ষা / সম্পদ সংস্থান লোড করতে
জাভা 7 এর জন্য:
new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));
getClass().getClassLoader()
তবে অন্যথায় দুর্দান্ত সমাধান!
আপনি জাভা 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()));
}
}
}
এবং এটি জার ফাইলগুলিতে সংস্থানগুলি নিয়েও কাজ করে ।
পাঠ্য এনকোডিং সম্পর্কে: InputStreamReader
আপনি যদি কোনও নির্দিষ্ট না করেন সে ক্ষেত্রে ডিফল্ট সিস্টেম চরসেট ব্যবহার করবে। ডিকোডিং সমস্যা এড়াতে আপনি নিজে এটি নির্দিষ্ট করতে চাইতে পারেন:
new InputStreamReader(isr, StandardCharsets.UTF_8);
সর্বদা বড়, ফ্যাট লাইব্রেরির উপর নির্ভর না করে পছন্দ করুন। আপনি যদি ইতিমধ্যে অন্যান্য কাজগুলির জন্য পেয়ারা বা অ্যাপাচি কমন্স আইও ব্যবহার না করেন তবে কেবলমাত্র একটি ফাইল থেকে পড়তে সক্ষম হতে আপনার প্রকল্পে এই লাইব্রেরিগুলি যুক্ত করার বিষয়টি কিছুটা খুব বেশি মনে হচ্ছে।
আমি বুঝতে পেরেছি যে খালি জাভা ভাল কাজ করে না যখন এই জাতীয় কাজগুলি করার মতো আসে। উদাহরণস্বরূপ, আমরা নোড.জেএস-এ কোনও ফাইল থেকে এইভাবে পড়ি:
const fs = require("fs");
const contents = fs.readFileSync("some-file.txt", "utf-8");
সহজ এবং পড়তে সহজ (যদিও লোকেরা এখনও যাইহোক অনেকগুলি নির্ভরতার উপর নির্ভর করতে পছন্দ করে, বেশিরভাগই অজ্ঞতার কারণে)। বা পাইথনে:
with open('some-file.txt', 'r') as f:
content = f.read()
এটি দুঃখজনক হলেও জাভা মানগুলির পক্ষে এটি এখনও সহজ এবং আপনাকে যা করতে হবে তা হ'ল উপরের পদ্ধতিটি আপনার প্রকল্পে অনুলিপি করে ব্যবহার করতে হবে। এমনকি সেখানে কী চলছে তা বুঝতে আপনাকে জিজ্ঞাসাও করি না, কারণ এটি কারও পক্ষে সত্যিই গুরুত্বপূর্ণ নয়। এটি কেবল কাজ করে, সময়কাল :-)
InputStream
ভেরিয়েবলটি is
কিনা null
তা যাচাই করতে চাই।
স্ট্রিংয়ে ফাইল পড়ার জন্য পেয়ারাতে একটি "টসস্ট্রিং" পদ্ধতি রয়েছে:
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);
এই পদ্ধতির জন্য ফাইলটি ক্লাসপথে থাকা প্রয়োজন হয় না ( জন স্কিটির পূর্ববর্তী উত্তর হিসাবে)।
String stringFromStream = CharStreams.toString(new InputStreamReader(resourceAsStream, "UTF-8"));
yegor256 অ্যাপাচি কমন্স আইও ব্যবহার করে একটি দুর্দান্ত সমাধান খুঁজে পেয়েছে :
import org.apache.commons.io.IOUtils;
String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
"UTF-8");
IOUtils.toString(this.getClass().getResource("foo.xml"), "UTF-8")
।
getClassLoader()
তবে পদ্ধতি শৃঙ্খলে যুক্ত করার চেষ্টা করুন : String text = IOUtils.toString( getClass().getClassLoader().getResourceAsStream("foo.xml"), StandardCharsets.UTF_8);
অ্যাপাচি-কমন্স-আইওর একটি ইউটিলিটির নাম রয়েছে FileUtils
:
URL url = Resources.getResource("myFile.txt");
File myFile = new File(url.toURI());
String content = FileUtils.readFileToString(myFile, "UTF-8"); // or any other encoding
আমার প্রায়শই এই সমস্যা হত। ছোট প্রকল্পগুলির উপর নির্ভরতা এড়াতে আমি প্রায়শই একটি ছোট ইউটিলিটি ফাংশন লিখি যখন আমার আইও বা এ জাতীয় কমোন প্রয়োজন হবে না। স্ট্রিং বাফারে ফাইলটির বিষয়বস্তু লোড করার কোড এখানে রয়েছে:
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());
সেক্ষেত্রে এনকোডিং নির্দিষ্ট করা গুরুত্বপূর্ণ, কারণ আপনি নিজের ফাইলটি ইউটিএফ -8 এ সম্পাদনা করতে পারেন, এবং তারপরে এটি একটি জারে রেখেছিলেন এবং যে কম্পিউটারটি ফাইলটি খোলে তার সিপি -1211 এর স্থানীয় ফাইল এনকোডিং হিসাবে থাকতে পারে (উদাহরণস্বরূপ) ; সুতরাং এই ক্ষেত্রে আপনি কখনই লক্ষ্যযুক্ত এনকোডিং জানেন না, সুতরাং সুস্পষ্ট এনকোডিং তথ্য অত্যন্ত গুরুত্বপূর্ণ। এছাড়াও চরের দ্বারা ফাইলের চরটি পড়ার লুপটি অকার্যকর বলে মনে হয় তবে এটি একটি বাফার্ডারিডারে ব্যবহার করা হয়, এবং এটি আসলে বেশ দ্রুত।
আপনি নিম্নলিখিত কোড ফর্ম জাভা ব্যবহার করতে পারেন
new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI())));
আপনি যদি আপনার প্রকল্পের সিসিআর / মেইন / রিসোর্সে ফাইল টেস্টকেস / foo.json ফাইলের মতো কোনও প্রকল্পের সংস্থান থেকে আপনার স্ট্রিং পেতে চান তবে এটি করুন:
String myString=
new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testcase/foo.json").toURI())));
নোট করুন যে getClassLoader () পদ্ধতিটি অন্য কয়েকটি উদাহরণে অনুপস্থিত।
অ্যাপাচি কমনের ফাইল ইউটিল ব্যবহার করুন। এটিতে একটি পদ্ধতি রয়েছে রিডফিলিটোস্ট্রিং
আমি নিম্নলিখিতগুলি থেকে উত্স ফাইলগুলি পড়ার জন্য ব্যবহার করছি 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() : "";
}
}
}
কোনও তৃতীয় পক্ষের নির্ভরতা প্রয়োজন।
স্থির আমদানির সেট সহ, পেয়ারা সমাধান খুব কমপ্যাক্ট ওয়ান-লাইনার হতে পারে:
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
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;
}
}
কমপক্ষে অ্যাপাচি কমন্স-আইও 2.5 হিসাবে, আইউইটিস.ল্ট স্ট্রিং () পদ্ধতিটি একটি ইউআরআই যুক্তিকে সমর্থন করে এবং ক্লাসপাথের জারের ভিতরে থাকা ফাইলগুলির বিষয়বস্তু ফেরত দেয়:
IOUtils.toString(SomeClass.class.getResource(...).toURI(), ...)
আমি স্টুপিড স্ক্যানার ট্রিকের সাথে আকসিকি এর উত্তরটি পছন্দ করি। বাহ্যিক নির্ভরতা ছাড়া জাভা 8 এ কাজ করে এমনটি আমি দেখতে সবচেয়ে সহজ (এবং বাস্তবে জাভা 5 তে ফিরে আসা)। আপনি জাভা 9 বা ততোধিক ব্যবহার করতে পারলে এখানে আরও সহজ উত্তর InputStream.readAllBytes()
দেওয়া হয়েছে (যেহেতু জাভা 9 এ যুক্ত হয়েছিল):
String text = new String(AppropriateClass.class.getResourceAsStream("foo.txt").readAllBytes());
Files.readLines()
আপনি যদি List<String>
লাইন-বাই-লাইন হিসাবে কোনও ফেরতের মান চান তবে পেয়ারাতেও রয়েছে :
List<String> lines = Files.readLines(new File("/file/path/input.txt"), Charsets.UTF_8);
একটি পাঠ্য ফাইল থেকে পেতে 3 উপায় ( বনাম গ্যাভা এর বনাম গুয়ারা এর ) তুলনা করতে দয়া করে এখানে দেখুন ।BufferedReader
Files
Resources
String
Charsets
এছাড়াও পেয়ারাতে রয়েছে। এটি দেখুন: google.github.io/guava/reLives/23.0/api/docs
এখানে আমার পদ্ধতির ভাল কাজ করে
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
}
}
আমি এখানে সরল উত্স () পদ্ধতিগুলি লিখেছি , এটি একটি সাধারণ অনুরোধে করতে সক্ষম হতে। এটি পেয়ারা লাইব্রেরির উপর নির্ভর করে তবে আমি জেডকে-কেবল অন্যান্য উত্তরগুলিতে প্রস্তাবিত পদ্ধতিগুলি পছন্দ করি এবং আমার মনে হয় আমি এই উপায়গুলি পরিবর্তন করব।
জাভা 11 এর ব্যবহার করে এখানে একটি সমাধান দেওয়া হয়েছে 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);
}
}
আমি এটির মতো কোনও নির্ভরতা স্থিতিশীল পদ্ধতি তৈরি করেছি:
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
}
আমি অ্যাপাচি কমন্সগুলি এই ধরণের স্টাফের জন্য ব্যবহার করি এবং পরীক্ষার সময় এই সঠিক ব্যবহারের কেস (ক্লাসপাথ থেকে ফাইলগুলি পড়ার) ব্যবহার করে বিশেষত /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 ...
}
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");