सुरक्षित एन्कोडिंग निर्माता
जावा को ठीक से आपको एन्कोडिंग त्रुटियों की सूचना देना मुश्किल है। आपको सबसे अधिक क्रिया और, का उपयोग करना चाहिए , कम से कम , प्रत्येक के लिए चार वैकल्पिक contructors का कम से कम इस्तेमाल कियाInputStreamReader और OutputStreamWriterएक एन्कोडिंग गड़बड़ पर एक उचित अपवाद प्राप्त करने के लिए।
फ़ाइल I / O के लिए, हमेशा दूसरे तर्क के रूप में उपयोग करने के लिए हमेशा सुनिश्चित करें OutputStreamWriterऔर InputStreamReaderफैंसी एनकोडर तर्क दोनों :
Charset.forName("UTF-8").newEncoder()
वहाँ भी अन्य कट्टर संभावनाओं रहे हैं, लेकिन तीन सरल संभावनाओं में से कोई भी अपवाद सौंपने के लिए काम करते हैं। ये करते हैं:
OutputStreamWriter char_output = new OutputStreamWriter(
new FileOutputStream("some_output.utf8"),
Charset.forName("UTF-8").newEncoder()
);
InputStreamReader char_input = new InputStreamReader(
new FileInputStream("some_input.utf8"),
Charset.forName("UTF-8").newDecoder()
);
साथ चलने के लिए
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
समस्या यह है कि यह चरित्र धाराओं के लिए पूर्ण एनकोडर तर्क फॉर्म का उपयोग नहीं करेगा, और इसलिए आप फिर से एन्कोडिंग समस्याओं को याद करेंगे।
लंबा उदाहरण
यहां एक लंबा उदाहरण है, यह एक फाइल के बजाय एक प्रक्रिया का प्रबंधन करता है, जहां हम दो अलग-अलग इनपुट बाइट स्ट्रीम को बढ़ावा देते हैं और एक आउटपुट बाइट स्ट्रीम सभी को यूटीएफ -8 चरित्र धाराओं को पूर्ण अपवाद हैंडलिंग के साथ :
Process
slave_process = Runtime.getRuntime().exec("perl -CS script args");
OutputStream
__bytes_into_his_stdin = slave_process.getOutputStream();
OutputStreamWriter
chars_into_his_stdin = new OutputStreamWriter(
__bytes_into_his_stdin,
Charset.forName("UTF-8").newEncoder()
);
InputStream
__bytes_from_his_stdout = slave_process.getInputStream();
InputStreamReader
chars_from_his_stdout = new InputStreamReader(
__bytes_from_his_stdout,
Charset.forName("UTF-8").newDecoder()
);
InputStream
__bytes_from_his_stderr = slave_process.getErrorStream();
InputStreamReader
chars_from_his_stderr = new InputStreamReader(
__bytes_from_his_stderr,
Charset.forName("UTF-8").newDecoder()
);
अब आप तीन चरित्र धाराओं कि त्रुटियों एन्कोडिंग पर सभी बढ़ाने अपवाद क्रमश: कहा जाता है chars_into_his_stdin, chars_from_his_stdoutऔर chars_from_his_stderr।
यह केवल थोड़ा अधिक जटिल है कि आपको अपनी समस्या के लिए क्या चाहिए, जिसका समाधान मैंने इस उत्तर के पहले भाग में दिया। कुंजी बिंदु यह एन्कोडिंग त्रुटियों का पता लगाने का एकमात्र तरीका है।
बस मुझे PrintStreamखाने के अपवाद के बारे में शुरू नहीं मिलता है।
InputStreamReader char_input = new InputStreamWriterपढ़ना चाहिए:InputStreamReader char_input = new InputStreamReaderऔरInputStreamReaderनिर्माणकर्ता एक लेता हैCharsetDecoder, ए नहींCharsetEncoder।