विशेष रूप से, मैं लिफ्ट वेब ऐप में स्थानीय फ़ाइल में फ़ाइल अपलोड सहेज रहा हूं।क्या स्केल में एक फ़ाइल में इनपुटस्ट्रीम लिखने का एक अच्छा, सुरक्षित, त्वरित तरीका है?
उत्तर
यदि यह एक पाठ फ़ाइल है, और आप तो scala.io.Source
का उपयोग कर पढ़ने के लिए स्काला और जावा के लिए अपने आप को सीमित करना चाहते हैं, शायद fastest-- है:
यहाँ कुछ उदाहरण कोड (untested) है उस में बनाया गया है नहीं है, लेकिन लिखने के लिए आसान:
def inputToFile(is: java.io.InputStream, f: java.io.File) {
val in = scala.io.Source.fromInputStream(is)
val out = new java.io.PrintWriter(f)
try { in.getLines().foreach(out.println(_)) }
finally { out.close }
}
लेकिन अगर आप अन्य पुस्तकालयों वैसे भी जरूरत है, तो आप अपने जीवन भी उन्हें प्रयोग (मिशेल दिखाता है के रूप में) द्वारा आसान बना सकते हैं।
(पी एस - स्काला 2.7 में, getLines
यह बाद एक ()
नहीं होना चाहिए।)
(पी पी एस - स्काला के पुराने संस्करणों में, getLines
न्यू लाइन को नहीं निकाला है, तो आप के बजाय print
करने की जरूरत है । println
)
मुझे किसी भी स्कैला विशिष्ट एपीआई के बारे में पता नहीं है, लेकिन चूंकि जावा जावा के लिए पूरी तरह से संगत है, इसलिए आप Apache Commons IO और Apache Commons FileUpload जैसी किसी अन्य लाइब्रेरी का उपयोग कर सकते हैं।
//using Commons IO:
val is = ... //input stream you want to write to a file
val os = new FileOutputStream("out.txt")
org.apache.commons.io.IOUtils.copy(is, os)
os.close()
//using Commons FileUpload
import javax.servlet.http.HttpServletRequest
import org.apache.commons.fileupload.{FileItemFactory, FileItem}
import apache.commons.fileupload.disk.DiskFileItemFactory
import org.apache.commons.fileupload.servlet.ServletFileUpload
val request: HttpServletRequest = ... //your HTTP request
val factory: FileItemFactory = new DiskFileItemFactory()
val upload = new ServletFileUpload(factory)
val items = upload.parseRequest(request).asInstanceOf[java.util.List[FileItem]]
for (item <- items) item.write(new File(item.getName))
जावा 7 के साथ आप उपयोग कर सकते हैं Files
from the new File I/O:
Files.copy(from, to)
जहां from
और to
Path
एस या InputStream
एस हो सकता है। इस तरह, आप इसे जार में पैक किए गए अनुप्रयोगों से संसाधनों को आसानी से निकालने के लिए भी उपयोग कर सकते हैं।
क्या आपको इसके बाद 'क्लोज़' कॉल करने की आवश्यकता है? – Jus12
'फ़ाइलें' स्वयं फ़ाइल का प्रतिनिधित्व नहीं करती है, लेकिन I/O फ़ंक्शंस का एक स्थिर संग्रह है, इसलिए इसे बंद करने की आवश्यकता नहीं है। 'Files.copy' आपके द्वारा पारित धाराओं में हेरफेर नहीं करता है, इसलिए जो भी आपको वहां बंद करने की आवश्यकता हो सकती है, आपको स्वयं को बंद करना होगा। – notan3xit
ऊपर दिए गए इनपुट टॉफ़ाइल विधि .pdf फ़ाइलों जैसे बाइनरी फ़ाइलों के साथ अच्छी तरह से काम नहीं करती है। स्ट्रिंग में फ़ाइल को डीकोड करने का प्रयास करते समय यह रनटाइम अपवाद फेंकता है। मेरे लिए क्या काम किया गया था:
def inputStreamToFile(inputStream: java.io.InputStream, file: java.io.File) = {
val fos = new java.io.FileOutputStream(file)
fos.write(
Stream.continually(inputStream.read).takeWhile(-1 !=).map(_.toByte).toArray
)
fos.close()
}
यह कोड न्यूलाइन वर्ण खो देता है। – shinichy
@shinichy - जब मैंने जवाब लिखा था तब व्यवहार बदल गया। मैंने इसे अपडेट किया है। –
अद्यतन करने के लिए धन्यवाद! – shinichy