2015-10-06 8 views
6

कोई मुझे बता सकते हैं क्यों इस निर्माण अभ्यस्त काम:जावा पढ़ने/लिखने निर्माण

while (fileInputStream.available()>0) {  
    fileOutputStream.write(fileInputStream.read()); 
} 

और यह एक बस ठीक काम करता है:

while (fileInputStream.available()>0) { 
    int data = fileInputStream.read(); 
    fileOutputStream.write(data); 
} 

मेरे लिए वे समान हैं के रूप में, लेकिन 1 एक अभ्यस्त डेटा सही ढंग से लिखें (फ़ाइल लंबाई/डेटा का आधा लिखेंगे)।

+1

क्या कोई लूप है जो आप हमें नहीं दिखा रहे हैं? क्योंकि पढ़ना() केवल डेटा का एक खंड पढ़ता है। आम तौर पर यह खंड एक कंटेनर द्वारा निर्धारित किया जाता है, एक इंट 32 बिट्स है जहां फ़ाइलआउटपुटस्ट्रीम बाइट्स –

+0

की विभिन्न मात्रा लेता है, वे वही हैं। ध्यान दें कि यह ** नहीं ** इनपुट स्ट्रीम की संपूर्ण सामग्री को आउटपुट स्ट्रीम में कॉपी करता है। यह सिर्फ एक बाइट पढ़ और लिख देगा। – Jesper

+0

यदि आप इसे काम करना चाहते हैं तो आपको एक बाइट बफर इनपुट करना चाहिए http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read (बाइट []) –

उत्तर

9

आप गलत तरीके से available() विधि का उपयोग कर रहे हैं। इस विधि का उपयोग यह निर्धारित करने के लिए किया जाता है कि थ्रेड को अवरुद्ध किए बिना पढ़ने के लिए कितने बाइट उपलब्ध हैं।

int data = fileInputStream.read(); 
while (data != -1) { 
    fileOutputStream.write(data); 
    data = fileInputStream.read(); 
} 

इस विधि: यदि आप तक पहुँच चुके हैं EOF अगर read() विधि लौटे -1 को देखने के लिए है

Good Stack Overflow Question about available()

JavaDoc on available()


सही तरीका जाँच करने के लिए शायद जाना है यदि आप बड़ी मात्रा में डेटा पढ़ने की कोशिश करते हैं तो जी काफी धीमी हो जाएगी।आप read(byte[] b, int off, int len) विधि का उपयोग करके अधिक बाइट्स में पढ़कर इसे तेज कर सकते हैं। लूप दूसरे के समान दिखता है।

byte [] buffer = new byte[1024]; // 1kb buffer 
int numBytesRead = fileInputStream.read(buffer); 
while (numBytesRead != -1) { 
    fileOutputStream.write(buffer, 0, numBytesRead); 
    numBytesRead = fileInputStream.read(buffer); 
} 
+0

'जबकि (-1! = (डेटा = पढ़ें())) लिखें (डेटा);' – ZhongYu

1

की भी खफा मैं इस छोटे से परीक्षण लिखा था मेरी रुचि:

public static void main(String[] args) throws IOException { 

    FileInputStream fileInputStream = new FileInputStream("/home/nick/foo"); 
    FileOutputStream fileOutputStream = new FileOutputStream("/home/nick/bar"); 
    fileOutputStream.write(fileInputStream.read()); 

    fileOutputStream.flush(); 
    fileOutputStream.close(); 
    fileInputStream.close(); 
} 

यह काम अपेक्षा के अनुरूप - /home/nick/foo से एक एकल बाइट पढ़ सकते हैं और /home/nick/bar करने के लिए इसे लिखा था

संपादित करें:

अपडेट किया गया कार्यक्रम:

public static void main(String[] args) throws IOException { 

    FileInputStream fileInputStream = new FileInputStream("/home/nick/foo"); 
    FileOutputStream fileOutputStream = new FileOutputStream("/home/nick/bar"); 
    while (fileInputStream.available()>0) {  
     fileOutputStream.write(fileInputStream.read()); 
    } 

    fileOutputStream.flush(); 
    fileOutputStream.close(); 
    fileInputStream.close(); 
} 

कॉपी किया गया पूरी फाइल (ध्यान दें - मैं एक समय में एक फ़ाइल को बाइट कॉपी करने की अनुशंसा नहीं करता, पूरे भाग की प्रतिलिपि बनाने के लिए बुफर्ड I/O कक्षाओं का उपयोग करें)

क्या आप flush() और close() को आउटपुटस्ट्रीम में भूल गए थे?

+0

मैंने पहली पोस्ट अपडेट की - आप इस सवाल में कोई फर्क नहीं पड़ता। लूप है और इसमें – Hikaru

+0

अंतर है - यह अपडेट करें – NickJ

+0

अपडेट करें मैंने इसे चेक किया: हाँ यह फ़ाइल कॉपी करता है और कुछ डेटा इसे से पढ़ा जा सकता है, लेकिन सामग्री निश्चित रूप से क्षतिग्रस्त है। – Hikaru

1

ऐसा लगता है कि आपका समय लूप अनुमानित चीजें और यहां और वहां छोड़ रहा है।

public int available() throws IOException { 
     return 0; 
    } 

शेष बाइट्स कि इस इनपुट स्ट्रीम के लिए एक विधि के अगले मंगलाचरण द्वारा ब्लॉक किए बिना इस इनपुट धारा से पढ़ा जा सकता है (या आप छोड़) की संख्या का अनुमान देता है। अगला आमंत्रण एक ही धागा या अन्य धागा हो सकता है। का एक एकल पढ़ने या छोड़ना यह कई बाइट ब्लॉक नहीं होंगे, लेकिन कम बाइट पढ़ या छोड़ सकते हैं। कुछ मामलों में, गैर-अवरुद्ध पढ़ने (या छोड़ें) को अवरुद्ध किया जा सकता है जब यह केवल धीमा होता है, उदाहरण के लिए धीमी नेटवर्क पर बड़ी फ़ाइलों को पढ़ने पर।

See here

+0

धन्यवाद, मुझे लगता है कि यह यहां होता है। – Hikaru

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