पहली नज़र में इस कोड को पूरी तरह से ठीकक्या java.io.BufferedOutputStream उपयोग करने के लिए सुरक्षित है?
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("1.txt"));
byte[] bytes = new byte[4096];
bout.write(bytes);
bout.close();
लगता है, लेकिन अगर हम गौर हम इस प्रकार
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close();
}
क्या यह संभव है कि कारण flush()
त्रुटियों अनदेखी कर रहे हैं कि close()
कार्यान्वित किया जाता है देखेंगे डेटा खो जा सकता है और कार्यक्रम इसे नोटिस नहीं करेगा? FilterOutputStream.close
में किसी भी खतरे का कोई उल्लेख नहीं है (जहां BufferedOutputStream
एआईपीआई से close()
विरासत)।
अद्यतन: पास दौरान आईओ त्रुटि अनुकरण करने के लिए() मैं परीक्षण एक फ्लैश मेमोरी में लिखने के लिए बदल गया है, bout.close से पहले एक 5 सेकंड नींद जोड़ा() और जब तक परीक्षण सो रहा था मैं USB से फ्लैश हटाया । परीक्षण अपवादों के बिना समाप्त हुआ, लेकिन जब मैंने फ्लैश डाला और इसे चेक किया - 1.txt वहां नहीं था।
तब मैं overrode पास()
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("g:/1.txt")) {
@Override
public void close() throws IOException {
flush();
super.close();
}
};
और फिर से परीक्षण भाग गया और
Exception in thread "main" java.io.FileNotFoundException: g:\1.txt (The system cannot the specified path)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
at test.Test1.main(Test1.java:10)
'फ़िल्टरऑटपुटस्ट्रीम' टाइपो? –
यह openjdk 'close()' विधि में एक बग के रूप में दिखाता है। - मृत स्टोर को अनदेखा करने के लिए ... –
@ निकोलय नहीं। BufferedOuptutStream वहां से करीब विरासत में आता है, –