স্কেল: এক বিবৃতিতে ফাইল স্ট্রিং লিখুন


144

স্কালায় ফাইলগুলি পড়ার জন্য রয়েছে

Source.fromFile("file.txt").mkString

ফাইলটিতে স্ট্রিং লেখার জন্য কি সমতুল্য এবং সংক্ষিপ্ত উপায় আছে?

বেশিরভাগ ভাষা এই জাতীয় কিছু সমর্থন করে। আমার প্রিয় গ্রোভি:

def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"

আমি প্রোগ্রামের জন্য কোডটি একটি একক লাইন থেকে কোডের একটি সংক্ষিপ্ত পৃষ্ঠায় ব্যবহার করতে চাই। আপনার নিজের লাইব্রেরিটি ব্যবহার করার অর্থ এখানে নেই। আমি একটি আধুনিক ভাষা আশা করি আমাকে কোনও ফাইলটিতে সুবিধামত কিছু লিখুক let

এর মতো পোস্ট রয়েছে তবে তারা আমার সঠিক প্রশ্নের উত্তর দেয় না বা পুরানো স্কালা সংস্করণগুলিতে ফোকাস করে।

উদাহরণ স্বরূপ:


এই প্রশ্নটি দেখুন । আমি সর্বাধিক রেটযুক্ত উত্তরের সাথে একমত - আপনার নিজের ব্যক্তিগত লাইব্রেরিটি থাকা ভাল।
শে

2
এই ক্ষেত্রে আমি একমত হই না যে একজনকে তাদের নিজস্ব লাইব্রেরি লিখতে হবে। সাধারণত, যখন আপনি অ্যাডহক জিনিসগুলি করার জন্য ছোট ছোট প্রোগ্রাম লেখেন (সম্ভবত আমি কেবল এটি একটি একক পৃষ্ঠার স্কালা স্ক্রিপ্ট বা কেবল আরপিএল লিখতে চাই)। তারপরে একটি ব্যক্তিগত গ্রন্থাগার অ্যাক্সেস একটি ব্যথা হয়ে ওঠে।
স্মার্টনাট 700

মূলত, দেখে মনে হচ্ছে এই মুহুর্তে এর জন্য স্কেলা ২.৯-তে কিছুই নেই। আমার কীভাবে এই প্রশ্নটি খোলা রাখা উচিত তা নিশ্চিত নয়।
স্মার্টনাট 700 7

1
আপনি যদি স্কালা উত্স কোডে java.io অনুসন্ধান করেন তবে আপনি অনেকগুলি উপস্থিতি খুঁজে পাবেন না, এমনকি আউটপুট ক্রিয়াকলাপগুলিতে, বিশেষত মুদ্রণ লেখকের জন্য কম less সুতরাং, স্কালাল-আইও লাইব্রেরি স্কালার অফিশিয়াল অংশ না হওয়া পর্যন্ত আমাদের খাঁটি জাভা ব্যবহার করতে হবে, যেমন উপমা হিসাবে দেখানো হয়েছে by
ফিলিহো

হ্যাঁ, প্রোবেরও jdk7 IO উন্নতির সাথে সামঞ্জস্যপূর্ণ স্কেল-আইও থ্যাটস দরকার।
স্মার্টনট 7007

উত্তর:


77

একটি সংক্ষিপ্ত একটি লাইন:

import java.io.PrintWriter
new PrintWriter("filename") { write("file contents"); close }

14
যদিও এই পদ্ধতিরটি দেখতে দুর্দান্ত দেখাচ্ছে, এটি ব্যতিক্রম-নিরাপদ নয় বা এনকোডিং-নিরাপদ নয়। একটি ব্যতিক্রম ঘটে তাহলে write(), closeকখনো বলা হবে, এবং ফাইল বন্ধ করা হবে না। PrintWriterএছাড়াও ডিফল্ট সিস্টেম এনকোডিং ব্যবহার করে, যা বহনযোগ্যতার জন্য খুব খারাপ। এবং পরিশেষে, এই পদ্ধতির বিশেষত এই লাইনের জন্য একটি পৃথক শ্রেণি তৈরি করা হয়েছে (তবে, স্কেল ইতিমধ্যে একটি সাধারণ কোডের জন্য প্রচুর ক্লাস তৈরি করেছে, এটি নিজের মধ্যে খুব কমই নয়))
ভ্লাদিমির মাত্তিভ

উপরের মন্তব্য অনুসারে, এটি একটি ওয়ান লাইনার হলেও এটি অনিরাপদ। : আপনি আরো নিরাপত্তা অবস্থান থেকে আরও বিকল্প থাকার এবং / অথবা ইনপুট বাফার উপলব্ধ যখন চান, তবে উত্তর হবে আমি শুধু একটি অনুরূপ থ্রেডে পোস্ট দেখুন stackoverflow.com/a/34277491/501113
chaotic3quilibrium

2
অস্থায়ী ডিবাগ-লগিংয়ের জন্য আমি ব্যবহার করেছিnew PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
র্যান্ডাল হুইটম্যান

স্টাইলিস্টিকভাবে এটি সম্ভবত সম্ভবত ব্যবহার করা আরও ভালclose()
কেসি

এটি দুটি লাইন এবং সহজেই এটির মতো একটি লাইনে তৈরি করা যায়:new java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
ফিলিউমিনাতি

163

আশ্চর্যজনক যে কেউ NIO.2 অপারেশনগুলির পরামর্শ দেয়নি (জাভা 7 এর পরে উপলব্ধ):

import java.nio.file.{Paths, Files}
import java.nio.charset.StandardCharsets

Files.write(Paths.get("file.txt"), "file contents".getBytes(StandardCharsets.UTF_8))

আমি মনে করি এটি এখন পর্যন্ত সবচেয়ে সহজ এবং সবচেয়ে সহজ এবং সবচেয়ে অভিহিত পদ্ধতি এবং জাভা নিজেই এটির কোনও নির্ভরতার প্রয়োজন নেই।


এটি কোনও কারণে নিউলাইন চরিত্রটিকে উপেক্ষা করে।
কাকাজি

@ কাকাজি, আপনি কি দয়া করে বিস্তারিত বলতে পারবেন? আমি কেবল নতুন লাইনের সাথে স্ট্রিং দিয়ে এটি পরীক্ষা করেছি এবং এটি পুরোপুরি কার্যকর হয়। এটি কেবল কোনও কিছুই ফিল্টার করতে পারে না - ফাইল.উইরাইট () বাইট অ্যারেটির বিষয়বস্তু বিশ্লেষণ না করে ব্লব হিসাবে লেখেন। সর্বোপরি, কিছু বাইনারি ডেটাতে 0x0d বাইটের নিউলাইন ছাড়া অন্য গুরুত্বপূর্ণ অর্থ থাকতে পারে।
ভ্লাদিমির মাত্তেভ

4
অতিরিক্ত দ্রষ্টব্য: আপনার কাছে যদি কোনও ফাইল থাকে তবে প্রথম প্যারামিটারটি পেতে '.toPath' করুন।
আকৌপ্পি

1
এই একটি আরও শিল্প গ্রেড (সুস্পষ্ট চারসেট পছন্দের কারণে) তবে এর সরলতা (এবং একটি লাইনার ..) এর অভাব রয়েছে reflect.io.File.writeAll(contents)। কেন? আপনি যখন দুটি আমদানির বিবৃতি অন্তর্ভুক্ত করেন তখন তিনটি লাইন। হয়তো আইডিই এটি আপনার জন্য স্বয়ংক্রিয়ভাবে করে তবে আরআরপিএল এ এটি এতটা সহজ না।
জাভাদ্ব্বা

3
@ জাভাদ্ব্বা আমরা জেভিএমে আছি, আমদানি প্রায় 'লাইন' হিসাবে গণ্য করা হয় না বিশেষত কারণ বিকল্পটি প্রায় সর্বদা একটি নতুন লাইব্রেরি নির্ভরতা যুক্ত করে চলেছে। যাইহোক, Files.writeএটি একটি java.lang.Iterableদ্বিতীয় তর্ক হিসাবেও গ্রহণ করে এবং আমরা এটি একটি স্কালার কাছ থেকে পেতে পারি Iterable, অর্থাত্ কোনও রূপান্তরকারী ব্যবহার করে কোনও সংগ্রহের ধরণ:import java.nio.file.{Files, Paths}; import scala.collection.JavaConverters.asJavaIterableConverter; val output = List("1", "2", "3"); Files.write(Paths.get("output.txt"), output.asJava)
ইয়াওয়ার

83

প্রতিবিম্ব.আই.ফাইল ব্যবহার করে এখানে একটি সংক্ষিপ্ত ওয়ান-লাইনার দেওয়া হয়েছে, এটি স্কাল 2.12 এর সাথে কাজ করে:

reflect.io.File("filename").writeAll("hello world")

বিকল্পভাবে, আপনি যদি জাভা লাইব্রেরি ব্যবহার করতে চান তবে আপনি এই হ্যাকটি করতে পারেন:

Some(new PrintWriter("filename")).foreach{p => p.write("hello world"); p.close}

1
+1 দুর্দান্ত কাজ করে। Some/ foreachকম্বো একটু ভীতু, কিন্তু এটা কোন চেষ্টা / ধরা সুবিধার / পরিশেষে দিয়ে আসে।
ব্রেন্ট ফাউস্ট

3
ভাল যদি লেখার ব্যতিক্রম ছুঁড়ে ফেলে আপনি ব্যতিক্রম থেকে পুনরুদ্ধার এবং ফাইলটি আবার পড়তে / লেখার পরিকল্পনা করেন তবে আপনি ফাইলটি বন্ধ করতে চাইতে পারেন। ভাগ্যক্রমে স্কালাল এটি করার জন্য ওয়ান-লাইনার সরবরাহ করে।
গ্যারেট হল

25
Scala.tools.nsc.io প্যাকেজটি পাবলিক API এর অংশ নয় তবে সংকলক দ্বারা ব্যবহৃত হওয়ার কারণে এটি সুপারিশ করা হয় না।
জিওভানি বোট্টা

3
Some/ foreachহ্যাক ঠিক কেন অনেক মানুষ অপাঠ্য কোড এটি উত্পাদন হ্যাকারদের ঘটায় জন্য Scala ঘৃণা হয়।
এরিক কাপলুন

3
scala.tootls.nsc.io.Fileএর জন্য একটি উপনাম reflect.io.File। এখনও অভ্যন্তরীণ এপিআই, তবে কমপক্ষে কিছুটা ছোট।
kostja

41

আপনি যদি গ্রোভি সিনট্যাক্স পছন্দ করেন তবে আপনি স্কিমায় আনার জন্য পিম্প-মাই-লাইব্রেরি ডিজাইনের প্যাটার্নটি ব্যবহার করতে পারেন :

import java.io._
import scala.io._

class RichFile( file: File ) {

  def text = Source.fromFile( file )(Codec.UTF8).mkString

  def text_=( s: String ) {
    val out = new PrintWriter( file , "UTF-8")
    try{ out.print( s ) }
    finally{ out.close }
  }
}

object RichFile {

  implicit def enrichFile( file: File ) = new RichFile( file )

}

এটি প্রত্যাশা অনুযায়ী কাজ করবে:

scala> import RichFile.enrichFile
import RichFile.enrichFile

scala> val f = new File("/tmp/example.txt")
f: java.io.File = /tmp/example.txt

scala> f.text = "hello world"

scala> f.text
res1: String = 
"hello world

2
আপনি কখনই উত্সটিতে কাছাকাছি কল করবেন না romফর্মফাইলে ফিরে আসা উদাহরণস্বরূপ, এটি জিসিড না হওয়া অবধি রিসোর্সটি বন্ধ করা হয়নি (আবর্জনা সংগ্রহ করা)। এবং আপনার মুদ্রণ লেখক বাফার হয়নি, সুতরাং এটি 8 বাইটের ক্ষুদ্র জেভিএম ডিফল্ট বাফারটি ব্যবহার করছে, সম্ভবত আপনার আইওকে ধীরে ধীরে ধীর করে দিচ্ছে। আমি শুধু একটি অনুরূপ থ্রেডে উত্তর তৈরি করেছেন যে, এই বিষয় নিয়ে ডিল: stackoverflow.com/a/34277491/501113
chaotic3quilibrium

1
তুমি ঠিক. তবে আমি যে সমাধানটি এখানে দিয়েছি তা ছোট আইও সহ স্বল্প-কালীন প্রোগ্রামগুলির জন্য ভাল কাজ করে। আমি এটি সার্ভার প্রক্রিয়া বা বৃহত ডেটার জন্য প্রস্তাব করি না (থাম্বের নিয়ম হিসাবে, 500 এমবি এর বেশি)।
দৃষ্টান্তমূলক

23
import sys.process._
"echo hello world" #> new java.io.File("/tmp/example.txt") !

এটি আরপিএলে আমার পক্ষে কাজ করে না। কোনও ত্রুটিযুক্ত সমস্যা নেই তবে আমি যদি /tmp/example.txt দেখি তবে নেই is
ব্যবহারকারী অজানা

@ ব্যবহারকারী অজানা, '' 'মিস করার জন্য দুঃখিত! কমান্ড শেষে, এখন ঠিক।
xiefei

চমৎকার! এখন এটি কাজ করে, আমি কেন তা জানতে চাই। কি #>, কি করে !?
ব্যবহারকারী অজানা

10
এই সমাধানটি বহনযোগ্য নয় ! শুধুমাত্র * নিক্স সিস্টেমে কাজ করে।
জিওভানি বোট্টা

2
এটি নির্বিচারে স্ট্রিং লেখার জন্য কাজ করবে না। এটি কেবল সংক্ষিপ্ত স্ট্রিংয়ের জন্য কাজ করবে যা আপনি কমান্ড লাইন echoসরঞ্জামে আর্গুমেন্ট হিসাবে পাস করতে পারেন ।
ধনী

15

একটি মাইক্রো লাইব্রেরি আমি লিখেছি: https://github.com/pathikrit/better-files

file.write("Hi!")

অথবা

file << "Hi!"

3
আপনার লাইব্রেরি প্রেম! স্কালার সাহায্যে কোনও ফাইল কীভাবে লিখতে হবে তা গুগল করার সময় এই প্রশ্নটি শীর্ষ হিটগুলির মধ্যে একটি - এখন আপনার প্রকল্পটি আরও বড় হয়েছে, আপনি নিজের উত্তরটি কিছুটা প্রসারিত করতে চাইতে পারেন?
asac

12

আপনি সহজেই অ্যাপাচি ফাইল ইউটিলেটগুলি ব্যবহার করতে পারেন । ফাংশন তাকান writeStringToFile। আমরা আমাদের প্রকল্পগুলিতে এই গ্রন্থাগারটি ব্যবহার করি।


3
আমি সব সময় এটি ব্যবহার। আপনি যদি মনোযোগ দিয়ে প্রশ্নটি পড়েন তবে আমি কেন ইতিমধ্যে একটি লাইব্রেরি ব্যবহার করতে চাই না তা মিলিয়ে রেখেছি।
স্মার্টনট 7007

একটি লাইব্রেরি ব্যবহার না করে, আমি যে পড়া / লিখেছেন সময় হ্যান্ডলগুলি ব্যতিক্রম একটি সমাধান তৈরি করেছেন এবং জাভা লাইব্রেরি দ্বারা উপলব্ধ ক্ষুদ্র বাফার অক্ষমতা পরলোক বাফার করা সক্ষম হয় হয়েছে: stackoverflow.com/a/34277491/501113
chaotic3quilibrium

7

একটিতে এই ফর্ম্যাটটিও রয়েছে যা উভয়ই সংক্ষিপ্ত এবং অন্তর্নিহিত গ্রন্থাগারটি সুন্দর করে রচিত (উত্স কোড দেখুন):

import scalax.io.Codec
import scalax.io.JavaConverters._

implicit val codec = Codec.UTF8

new java.io.File("hi-file.txt").asOutput.write("I'm a hi file! ... Really!")

7

এটি যথেষ্ট সংক্ষিপ্ত, আমার ধারণা:

scala> import java.io._
import java.io._

scala> val w = new BufferedWriter(new FileWriter("output.txt"))
w: java.io.BufferedWriter = java.io.BufferedWriter@44ba4f

scala> w.write("Alice\r\nBob\r\nCharlie\r\n")

scala> w.close()

4
যথেষ্ট উপযুক্ত, তবে এই "যথেষ্ট সংক্ষিপ্ত" "একটি বিবৃতি" হিসাবে শ্রেণিবদ্ধ করা হয়নি: পি
এরিক কাপলুন

এই কোডটি জাভাটির অনেকগুলি অনুধাবন করা সমস্যা বোঝায়। দুর্ভাগ্যক্রমে স্কালা আইও-কে যথেষ্ট গুরুত্বপূর্ণ বলে মনে করে না যাতে স্ট্যান্ডার্ড লাইব্রেরি একটিতে অন্তর্ভুক্ত না করে।
ক্রিস

উত্তরটি এতিম রিসোর্সের সমস্যাগুলি নতুন ফাইল রাইটারের সাথে লুকায়। যদি নতুন ফাইল রাইটার সফল হয় তবে নতুন বাফারড্রাইটারটি ব্যর্থ হয় তবে ফাইল রাইটার উদাহরণটি আর কখনও দেখা যায় না এবং জিসিইড (আবর্জনা সংগৃহীত) অবধি খোলা থাকে এবং তারপরেও এটি বন্ধ নাও হতে পারে (জেভিএমের গ্যারান্টি চূড়ান্ত করার উপায়ের কারণে)। : আমি একটি অনুরূপ প্রশ্ন যা এই বিষয়গুলো ঠিকানাগুলি একটি উত্তর লিখেছি stackoverflow.com/a/34277491/501113
chaotic3quilibrium

2

আপনি জাভা এবং স্কালা লাইব্রেরির মিশ্রণটি দিয়ে এটি করতে পারেন। চরিত্রের এনকোডিংয়ের উপরে আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকবে। তবে দুর্ভাগ্যক্রমে, ফাইল হ্যান্ডলগুলি সঠিকভাবে বন্ধ হবে না।

scala> import java.io.ByteArrayInputStream
import java.io.ByteArrayInputStream

scala> import java.io.FileOutputStream
import java.io.FileOutputStream

scala> BasicIO.transferFully(new ByteArrayInputStream("test".getBytes("UTF-8")), new FileOutputStream("test.txt"))

আপনার কোডে আপনার একটি অনাথ সম্পদ উদাহরণ রয়েছে। যেহেতু আপনি আপনার কল করার আগে উদাহরণগুলি ক্যাপচার করছেন না, আপনি যে পদ্ধতিটি কল করছেন তার প্যারামিটারগুলি পাস করার আগে যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলে, তবে যে সংস্থানগুলি সাফল্যের সাথে ইনস্ট্যান্ট করা হয়েছে সেগুলি জিসিইড (আবর্জনা সংগ্রহ করা) না হওয়া পর্যন্ত বন্ধ থাকবে না, এমনকি এমনকী তবে জিসি যেভাবে কাজের গ্যারান্টি দেয় তার কারণে এটি নাও হতে পারে। : আমি একটি অনুরূপ প্রশ্ন যা এই বিষয়গুলো ঠিকানাগুলি একটি উত্তর লিখেছি stackoverflow.com/a/34277491/501113
chaotic3quilibrium

1
আপনি ঠিক বলেছেন এবং আপনার সমাধানটি বেশ সুন্দর। তবে এখানে প্রয়োজনীয়তা এটি এক লাইনে করছিল। এবং যখন আপনি মনোযোগ সহকারে পড়বেন, আমি আমার উত্তরে উত্স ফাঁসের বিষয়টি একটি সীমাবদ্ধ হিসাবে উল্লেখ করেছি যা এই প্রয়োজনীয়তা এবং আমার পদ্ধতির সাথে আসে। আপনার সমাধানটি দুর্দান্ত, তবে সেই এক লাইনের প্রয়োজনের সাথে মেলে না।
stefan.schwetschke

2

আমি জানি এটি কোনও লাইন নয়, তবে এটি যতটা আমি বলতে পারি সুরক্ষার সমস্যাগুলি সমাধান করে;

// This possibly creates a FileWriter, but maybe not
val writer = Try(new FileWriter(new File("filename")))
// If it did, we use it to write the data and return it again
// If it didn't we skip the map and print the exception and return the original, just in-case it was actually .write() that failed
// Then we close the file
writer.map(w => {w.write("data"); w}).recoverWith{case e => {e.printStackTrace(); writer}}.map(_.close)

আপনি যদি ব্যতিক্রম পরিচালনা সম্পর্কে চিন্তা না করেন তবে লিখতে পারেন

writer.map(w => {w.writer("data"); w}).recoverWith{case _ => writer}.map(_.close)

1

আপডেট: এর পর থেকে আমি আরও কার্যকর সমাধান তৈরি করেছি যার উপর আমি এখানে বর্ণনা করেছি: https://stackoverflow.com/a/34277491/501113

আমি নিজেকে আরও বেশি করে কাজ করতে দেখছি Eclipse এর জন্য স্কালা IDE এর মধ্যে স্কাল ওয়ার্কশিটে (এবং আমি বিশ্বাস করি যে IntelliJ IDEA এর সমতুল্য কিছু আছে)। যাইহোক, "আউটপুট কাট অফের সীমা ছাড়িয়ে গেছে" বলে কিছু সামগ্রী আউটপুট করতে আমার এক-লাইনার করতে সক্ষম হওয়া দরকার। আমি বিশেষত স্কালার সংগ্রহের সাথে উল্লেখযোগ্য কিছু করছি কিনা তা বার্তা।

আমি এটিকে সহজ করার জন্য প্রতিটি নতুন স্কাল ওয়ার্কশিটের শীর্ষে একটি ওয়ান-লাইনার প্রবেশ করিয়েছি (এবং তাই খুব সাধারণ প্রয়োজনের জন্য আমাকে পুরো বাহ্যিক গ্রন্থাগার আমদানি অনুশীলন করতে হবে না)। আপনি যদি স্টিলার হন এবং লক্ষ্য করেন যে এটি প্রযুক্তিগতভাবে দুটি লাইন, তবে কেবলমাত্র এই ফোরামে এটি আরও পাঠযোগ্য। এটি আমার স্কালা ওয়ার্কশিটে একটি একক লাইন।

def printToFile(content: String, location: String = "C:/Users/jtdoe/Desktop/WorkSheet.txt") =
  Some(new java.io.PrintWriter(location)).foreach{f => try{f.write(content)}finally{f.close}}

এবং ব্যবহারটি সহজভাবে:

printToFile("A fancy test string\ncontaining newlines\nOMG!\n")

এটি আমার ডিফল্টের বাইরে অতিরিক্ত ফাইল থাকতে চাইলে ফাইল নামটি provideচ্ছিকভাবে সরবরাহ করতে দেয় (যা পদ্ধতিটি যখন প্রতিটি সময় ডাকা হয় তখন পুরোপুরি ফাইলটি ওভাররাইট করে)।

সুতরাং, দ্বিতীয় ব্যবহারটি সহজভাবে:

printToFile("A fancy test string\ncontaining newlines\nOMG!\n", "C:/Users/jtdoe/Desktop/WorkSheet.txt")

উপভোগ করুন!


1

অ্যামোনেট অপ্স লাইব্রেরি ব্যবহার করুন । বাক্যবিন্যাসটি খুব ন্যূনতম, তবে গ্রন্থাগারের প্রস্থটি প্রশস্ত যেমন প্রায় বাশের মতো শেল স্ক্রিপ্টিং ভাষায় এ জাতীয় কোনও কাজ করার চেষ্টা থেকে কী প্রত্যাশা করে।

পৃষ্ঠায় আমি লিঙ্ক করেছি, এটি লাইব্রেরিতে যে কোনও কাজ করতে পারে তা দেখায়, তবে এই প্রশ্নের উত্তর দিতে, এটি কোনও ফাইলকে লেখার উদাহরণ

import ammonite.ops._
write(pwd/'"file.txt", "file contents")

-1

সেমিকোলনের যাদুটির মাধ্যমে আপনি যেকোন কিছুতে ওয়ান-লাইনার তৈরি করতে পারেন।

import java.io.PrintWriter
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.charset.StandardCharsets
import java.nio.file.StandardOpenOption
val outfile = java.io.File.createTempFile("", "").getPath
val outstream = new PrintWriter(Files.newBufferedWriter(Paths.get(outfile)
  , StandardCharsets.UTF_8
  , StandardOpenOption.WRITE)); outstream.println("content"); outstream.flush(); outstream.close()

এখানে কোন যুক্তি নেই। আমি সিদ্ধান্ত নিয়েছি যে কোন এপিআইগুলিকে আমার জীবনের অংশ প্রবাহিত করা দরকার, তাই আমি সর্বদা এটি করি।
অয়ন ফ্রিম্যান 22
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.