2012-01-17 18 views
13

मैं कई वर्षों से वेब प्रोग्रामिंग कर रहा हूं और तब से मैंने डेस्कटॉप एप्लिकेशन के लिए कोई प्रोग्रामिंग नहीं किया है, और मैं इतनी सारी चीज़ें भूल गया हूं। अगर यह बहुत आसान है तो कृपया धैर्य रखें।जावा: बाइनरी फाइलें कैसे लिखें?

अब मेरे पास यह स्थिति है:
मैं एक फ़ाइल में कुछ हैश किए गए शब्दों को स्टोर करने की कोशिश कर रहा हूं। मुझे लगता है कि मुझे इसके लिए बाइनरी फाइलों का उपयोग करना चाहिए (अगर मैं गलत हूं तो कृपया मुझे सही करें)। लेकिन मुझे नहीं पता कि मुझे फाइल में शब्दों को कैसे लिखना चाहिए। मैंने कई तरीकों की कोशिश की, लेकिन जब मैं फ़ाइल को वापस पढ़ता हूं, और शब्दों को डिक्रिप्ट करने का प्रयास करता हूं, तो मुझे BadPaddingException मिलता है।

क्या किसी को यह भी पता है कि फाइल को शब्दों को कैसे लिखना है?

पुनश्च: मैं एनक्रिप्ट करने/शब्द decrypting (मैं, एक और StackOverflow धागे से समझ में आ गया कुछ संशोधनों के साथ) के लिए इस कोड का उपयोग:

public static byte[] encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(salt, 20)); 
     return pbeCipher.doFinal(property.getBytes("UTF-8")); 
    } 

    public static String decrypt(byte[] property) throws GeneralSecurityException, IOException { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(salt, 20)); 
     return new String(pbeCipher.doFinal(property)); 
    } 
+0

पर आपने अनुशंसित छोड़ा है। क्या आपने 'System.out.println (decrypt (एन्क्रिप्ट करना है) ("हैलो वर्ल्ड"))); '? – bezmax

+0

हाँ, और यह काम करता है! –

+1

फिर कृपया अपना I/O कोड पेस्ट करें। – bezmax

उत्तर

17

ठीक है, बस FileInputStream और FileOutputStream =)

का उपयोग

नमूना लेखन:

// encrypted data in array 
byte[] data = ... 

FileOutputStream fos = ... 
fos.write(data, 0, data.length); 
fos.flush(); 
fos.close(); 

नमूना पढ़ने:

File inputFile = new File(filePath); 
byte[] data = new byte[inputFile.length()]; 
FileInputStream fis = new FileInputStream(inputFile); 
fis.read(data, 0, data.length); 
fis.close(); 

ऊपर कोड मानता है कि एक फ़ाइल में एकल एन्क्रिप्टेड आइटम होता है। यदि आपको एकल फ़ाइल में एक से अधिक आइटम रखने की आवश्यकता है, तो आपको इसके लिए कुछ प्रारूप योजना तैयार करने की आवश्यकता होगी। उदाहरण के लिए, आप एन्क्रिप्टेड डेटा में बाइट्स की संख्या को डेटा से पहले 2 बाइट्स के रूप में स्टोर कर सकते हैं। प्रति आइटम 2 बाइट्स का अर्थ है एन्क्रिप्टेड आइटम 2^16 बाइट से अधिक नहीं हो सकता है। बेशक, आप लंबाई के लिए 4 बाइट्स का उपयोग कर सकते हैं।

+0

और वापस पढ़ने के लिए? क्या यह स्वचालित रूप से बाइट्स की लंबाई को पढ़ने के लिए जानता है? –

+0

वापस पढ़ने के लिए FileInputStream और इसकी विधि 'avialable()'। Javadoc को यहां पढ़ें: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html – bezmax

+0

@Ako अद्यतन उत्तर –

0

टेक्स्ट दस्तावेज़ के रूप में सहेजना मुझे अधिक समझ में आता है, डेटा पहले से ही है इसलिए इसे byte[] में बदलने की आवश्यकता नहीं है और यदि आपको फ़ाइल से पढ़ने की आवश्यकता है तो यह बहुत सुविधाजनक होगा। जब तक आप इसे वेब से सहेज नहीं लेते हैं और यह पहले से ही byte[] के रूप में सॉकेट के माध्यम से आ रहा है। मुझे पता है कि यह आपकी राय प्रदान नहीं करता है, लेकिन यह सख्ती से राय का विषय है, जो कि आपके प्रश्न का एकमात्र हिस्सा था, पिछले दो उत्तर

+0

नहीं कि मैं जरूरी असहमत हूं, लेकिन यह सवाल का जवाब नहीं देता है। यह उत्तर से मूल प्रश्न पर एक टिप्पणी के रूप में बेहतर होगा। – David

+0

ओह क्षमा करें मैं इस साइट के लिए नया हूँ। किसी भी दर पर, "मुझे लगता है कि मुझे इसके लिए बाइनरी फाइलों का उपयोग करना चाहिए (अगर मैं गलत हूं तो कृपया मुझे सही करें)।" क्या मैं जवाब देने का प्रयास कर रहा था। उसके लिए माफ़ करना। –

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