2010-05-06 11 views

उत्तर

17

यदि यह एक पाठ फ़ाइल है, और आप तो 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)

+0

यह कोड न्यूलाइन वर्ण खो देता है। – shinichy

+0

@shinichy - जब मैंने जवाब लिखा था तब व्यवहार बदल गया। मैंने इसे अपडेट किया है। –

+0

अद्यतन करने के लिए धन्यवाद! – shinichy

7

मुझे किसी भी स्कैला विशिष्ट एपीआई के बारे में पता नहीं है, लेकिन चूंकि जावा जावा के लिए पूरी तरह से संगत है, इसलिए आप 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)) 
25

जावा 7 के साथ आप उपयोग कर सकते हैं Filesfrom the new File I/O:

Files.copy(from, to) 

जहां from और toPath एस या InputStream एस हो सकता है। इस तरह, आप इसे जार में पैक किए गए अनुप्रयोगों से संसाधनों को आसानी से निकालने के लिए भी उपयोग कर सकते हैं।

+0

क्या आपको इसके बाद 'क्लोज़' कॉल करने की आवश्यकता है? – Jus12

+0

'फ़ाइलें' स्वयं फ़ाइल का प्रतिनिधित्व नहीं करती है, लेकिन I/O फ़ंक्शंस का एक स्थिर संग्रह है, इसलिए इसे बंद करने की आवश्यकता नहीं है। 'Files.copy' आपके द्वारा पारित धाराओं में हेरफेर नहीं करता है, इसलिए जो भी आपको वहां बंद करने की आवश्यकता हो सकती है, आपको स्वयं को बंद करना होगा। – notan3xit

1

ऊपर दिए गए इनपुट टॉफ़ाइल विधि .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() 
} 
संबंधित मुद्दे

 संबंधित मुद्दे