n पढ़ना अवरुद्ध बिना atomically बाइट्स

वोट
0

मैं तो बस यही कारण है कि मेरी धागा बंद नीचे काम कर रहा था के बारे में एक सवाल पूछा था। यह की वजह से किया जा रहा समाप्त हो गया readLine()मेरी धागा अवरुद्ध से पहले बंद झंडा मान्यता प्राप्त किया जा सकता है। इस जाँच करके ठीक करने के लिए आसान था ready()कॉल करने से पहले readLine()

हालांकि, अब मैं एक का उपयोग कर रहा DataInputStreamश्रृंखला में निम्न कार्य करें:

int x = reader.readInt();
int y = reader.readInt();
byte[] z = new byte[y]
reader.readFully(z);

मैं जानता हूँ कि मैं अपने ही बफरिंग जो चल रहा है फ़ाइल ध्वज की जाँच करेगा, जबकि बफर लोड लागू कर सकता है। लेकिन मैं जानता हूँ कि यह कठिन हो जाएगा। इसके बजाय, मैं डेटा के भीतर बफ़र जा दे सकता है InputStreamवर्ग, और जब तक प्रतीक्षा करें मैं अपने है nनिष्पादित करने से पहले बाइट्स पढ़ा है, एक गैर अवरुद्ध पढ़ने के लिए - के रूप में मैं जानता हूँ कि मुझे कितना की जरूरत को पढ़ने के लिए।

  • 4 पहले पूर्णांक के लिए बाइट्स
  • 4 दूसरे पूर्णांक के लिए बाइट्स y
  • और yके लिए बाइट zबाइट सरणी।

इसके बजाय का उपयोग करने का ready()अगर कोई बफर में एक पंक्ति है की जाँच करने के, वहाँ कुछ बराबर है ready(int bytesNeeded)?

14/02/2020 को 00:00
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

available()विधि में बाइट्स की राशि देता है InputStreamआंतरिक बफर।

तो, एक तरह कुछ कर सकते हैं:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
14/02/2020 को 00:19
का स्रोत उपयोगकर्ता

वोट
0

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

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

दूसरे शब्दों में, अगर available()रिटर्न n, तुम्हें पता है आप सुरक्षित रूप से कॉल कर सकते हैं read(n)ब्लॉक किए बिना। ध्यान दें कि, जावाडोक राज्यों के रूप में, दिए गए मान एक अनुमान है। उदाहरण के लिए, InflaterInputStream.available () हमेशा 1 वापस आ जाएगी अगर EOF पूरा नहीं हुआ है। के दस्तावेजीकरण की जाँच करें InputStreamउपवर्ग आप इसे अपनी आवश्यकताओं को पूरा सुनिश्चित करने के लिए उपयोग किया जाएगा।

14/02/2020 को 00:20
का स्रोत उपयोगकर्ता

वोट
0

आप की अपनी समकक्ष लागू करने की आवश्यकता करने जा रहे हैं BufferedInputStream। या तो एक के एक एकमात्र मालिक के रूप में InputStreamऔर एक धागा (संभवतः एक पूल से उधार) में ब्लॉक करने के लिए। वैकल्पिक रूप से, NIO साथ लागू करते हैं।

14/02/2020 को 00:51
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more