java對文件的處理(讀取,寫入,複製,加密和解密)


這個文件處理的實現具備的功能有:文件讀取,文件寫入,文件複製,文件加密以及文件解密。

  其實在平時文件加密的操作中,我們可以簡單的通過修改文件的後綴名來改變文件的打開方式,也就是常說的:“一定是我打開的方式不對。。。”,但是這樣的操作方法就比較low(低端)。

所以下面我們來一些比較高大上的。
   整個實例的難點應該還是在於文件的加密以及解密,對於PC裏的一些不想爲人知的文件往往需要加密處理。通過對文件輸入流的方法調用得到文件的字節流:

    FileInputStream  fis = new FileInputStream(from);  
    int n = fis.read();  
然後在調用文件輸出流方法時對讀取到的字節流進行一定的按特定意願的處理後並輸出:

    //循環寫入  
            while(n!=-1){//加密算法,可行定義,與解密算法相逆  
                if(day%height*n != 1){  
                    fos.write(n+height);  
    //day和height爲密碼           
                                 }else{  
                    fos.write(n);  
                }  
                n=fis.read();  
            }  

 這樣就可以在文件輸出時出現字節流的“誤差”,原文本被“錯亂”的解碼方式所還原,便會生成亂碼或者一堆看不懂的文件。其中的參數day和height是密碼和校驗碼,可以是生日和身高的整型數據組合。

加密和解密的方法:

    /** 
         * 文件加密傳輸的方法 
         * @param from原文件(帶絕對路徑) 
         * @param to複製後文件(帶絕對路徑) 
         * @throws Exception拋出異常 
         */  
        public void JiaMi(String from,String to,int day,int height) throws Exception{  
            FileInputStream  fis = new FileInputStream(from);  
            FileOutputStream fos = new FileOutputStream(to,false);  
            int n = fis.read();  
            int count=0;  
            //循環寫入  
            while(n!=-1){//加密算法,可行定義,與解密算法相逆  
                if(day%height*n != 1){  
                    fos.write(n+height);  
                }else{  
                    fos.write(n);  
                }  
                n=fis.read();  
            }  
            fis.close();  
            fos.close();  
        }  
        /** 
         * 文件解密接收的方法 
         * @param from原文件(帶絕對路徑) 
         * @param to複製後文件(帶絕對路徑) 
         * @throws Exception拋出異常 
         */  
        public void JieMi(String from,String to,int day,int height) throws Exception{  
            FileInputStream  fis = new FileInputStream(from);  
            FileOutputStream fos = new FileOutputStream(to,false);  
            int n = fis.read();  
            //循環寫入  
            while(n!=-1){//解密算法,可行定義,與解密算法相逆  
                if(day%height*n != 1){  
                    fos.write(n-height);  
                }else{  
                    fos.write(n);  
                }  
                n=fis.read();  
            }  
            //關閉輸入輸出流  
            fis.close();  
            fos.close();  
        }  
下面上產品實例代碼:

UI類:

    package czj_javaIO;  
      
    import java.awt.FlowLayout;  
    import java.awt.Font;  
      
    import javax.swing.ImageIcon;  
    import javax.swing.JButton;  
    import javax.swing.JFrame;  
    import javax.swing.JLabel;  
    import javax.swing.JPanel;  
    import javax.swing.JTextArea;  
    import javax.swing.JTextField;  
      
    public class MainUI extends JFrame{  
      
        public static void main(String[] args) {  
            MainUI mu = new MainUI();  
            mu.init();  
        }  
        /** 
         * 初始化界面的方法 
         */  
        private void init() {  
            this.setTitle("文件處理");  
            this.setSize(395, 850);  
            this.setLocationRelativeTo(null);  
            this.setDefaultCloseOperation(3);  
            this.setLayout(new FlowLayout());  
            this.setResizable(false);  
            addBackground();  
            JLabel j1 = new JLabel("    文件名 :        ");  
            JTextArea jp1  = new JTextArea(2, 30);  
            jp1.setText("測試用文件.txt");  
              
            JLabel j2 = new JLabel("文件絕對路徑:");  
            JTextArea jp2  = new JTextArea(2, 30);  
            jp2.setText("E://");  
              
            JLabel j3 = new JLabel("     內容  :          ");  
            JTextArea jp3  = new JTextArea(5, 30);  
            jp3.setText("這是測試文件的具體內容。");  
              
            this.add(j1);  
            this.add(jp1);  
            this.add(j2);  
            this.add(jp2);  
            this.add(j3);  
            this.add(jp3);  
              
            JButton jb_write = new JButton("寫入文件");  
            jb_write.setBorderPainted(false);  
            jb_write.setFocusable(false);  
            this.add(jb_write);  
              
            JButton jb_read = new JButton("讀取文件");  
            jb_read.setBorderPainted(false);  
            jb_read.setFocusable(false);  
            this.add(jb_read);  
              
            JLabel j4 = new JLabel("(必須已有該文件)");  
            this.add(j4);  
      
              
            JLabel jfore = new JLabel("  文件原地址  :");  
            JTextArea jtfore  = new JTextArea(2, 30);  
            jtfore.setText("E://測試用文件.txt");  
            this.add(jfore);  
            this.add(jtfore);  
              
            JLabel jafter = new JLabel("文件目標地址:");  
            JTextArea jtafter  = new JTextArea(2, 30);  
            jtafter.setText("D://複製過來的測試用文件.txt");  
            this.add(jafter);  
            this.add(jtafter);  
              
            JButton jb_copy = new JButton("  復  制            文  件  ");  
            jb_copy.setBorderPainted(false);  
            jb_copy.setFocusable(false);  
            this.add(jb_copy);  
              
            JLabel jjiami = new JLabel("***************************要加密的文件目標地址 :        ");  
            JTextArea jtjiami  = new JTextArea(2, 30);  
            jtjiami.setText("E://測試用文件.txt");  
            this.add(jjiami);  
            this.add(jtjiami);  
              
            JLabel jjiaafter = new JLabel("***************************加密後的文件目標地址 :        ");  
            JTextArea jtjiaafter  = new JTextArea(2, 30);  
            jtjiaafter.setText("D://加密後的測試用文件.txt");  
            this.add(jjiaafter);  
            this.add(jtjiaafter);  
              
            JLabel jiami = new JLabel("加密密碼:");  
            this.add(jiami);  
            //設置加密密碼  
            JTextArea jtdayjia  = new JTextArea(2,6);  
            jtdayjia.setText("19940805");  
            this.add(jtdayjia);  
            //校驗碼  
            JTextArea jtheightjia  = new JTextArea(2, 4);  
            jtheightjia.setText("185");  
            this.add(jtheightjia);  
              
            JButton jb_jiami = new JButton("  文  件            加  密  ");  
            jb_jiami.setBorderPainted(false);  
            jb_jiami.setFocusable(false);  
            this.add(jb_jiami);  
              
            JLabel jjiemi = new JLabel("***************************要解密的文件目標地址 :        ");  
            JTextArea jtjiemi  = new JTextArea(2, 30);  
            jtjiemi.setText("D://加密後的測試用文件.txt");  
            this.add(jjiemi);  
            this.add(jtjiemi);  
              
            JLabel jjieafter = new JLabel("***************************解密後的文件目標地址 :        ");  
            JTextArea jtjieafter  = new JTextArea(2, 30);  
            jtjieafter.setText("E://解密後的測試用文件.txt");  
            this.add(jjieafter);  
            this.add(jtjieafter);  
              
            JLabel jiemi = new JLabel("解密密碼:");  
            this.add(jiemi);  
            //設置解密密碼  
            JTextArea jtdayjie  = new JTextArea(2, 6);  
            jtdayjie.setText("19940805");  
            this.add(jtdayjie);  
            //校驗碼  
            JTextArea jtheightjie  = new JTextArea(2, 4);  
            jtheightjie.setText("185");  
            this.add(jtheightjie);  
              
            JButton jb_jiemi = new JButton("  文  件            解  密  ");  
            jb_jiemi.setBorderPainted(false);  
            jb_jiemi.setFocusable(false);  
            this.add(jb_jiemi);  
              
            //用以反饋當前文件處理狀態  
            JLabel now = new JLabel();  
            this.add(now);  
              
            //給按鈕添加監聽器  
            MainIOListener il = new MainIOListener(jp1,jp2,jp3,jtfore,jtafter,jtjiami,jtjiaafter,jtjiemi,jtjieafter,jtdayjia,  
                    jtheightjia,jtdayjie,jtheightjie,now);  
            jb_write.addActionListener(il);  
            jb_read.addActionListener(il);  
            jb_copy.addActionListener(il);  
            jb_jiami.addActionListener(il);  
            jb_jiemi.addActionListener(il);  
              
            this.setVisible(true);  
        }  
        /** 
         * 添加背景的方法 
         */  
        private void addBackground(){  
            ImageIcon image=new ImageIcon(this.getClass().getResource("123.jpg"));  
            JLabel jlaImage=new JLabel(image);  
            jlaImage.setBounds(0, -35, image.getIconWidth(), image.getIconHeight());  
            this.getLayeredPane().add(jlaImage,new Integer(Integer.MIN_VALUE));  
            JPanel contentpane=(JPanel)this.getContentPane();  
            contentpane.setOpaque(false);  
            }  
      
    }  
 監聽器類:

    package czj_javaIO;  
      
    import java.awt.event.ActionEvent;  
    import java.awt.event.ActionListener;  
      
    import javax.swing.JLabel;  
    import javax.swing.JTextArea;  
      
    public class MainIOListener implements ActionListener{  
      
        private JTextArea jp1,jp2,jp3,jtfore,jtafter,jtjiami,jtjiaafter,jtjiemi,jtjieafter;  
        private int jtdayjia,jtheightjia,jtdayjie,jtheightjie;  
        private JLabel now;  
        public MainIOListener(JTextArea jp1, JTextArea jp2, JTextArea jp3,  
                JTextArea jtfore, JTextArea jtafter, JTextArea jtjiami,  
                JTextArea jtjiaafter, JTextArea jtjiemi, JTextArea jtjieafter,JTextArea jtdayjia,  
                JTextArea jtheightjia,JTextArea jtdayjie,JTextArea jtheightjie,JLabel now) {  
            this.jp1 = jp1;  
            this.jp2 = jp2;  
            this.jp3 = jp3;  
            this.jtfore = jtfore;  
            this.jtafter =jtafter;  
            this.jtjiami = jtjiami;  
            this.jtjiaafter = jtjiaafter;  
            this.jtjiemi = jtjiemi;  
            this.jtjieafter = jtjieafter;  
            //String裝換爲int  
            this.jtdayjia = Integer.parseInt(jtdayjia.getText());  
            this.jtdayjie =Integer.parseInt(jtdayjie.getText());  
            this.jtheightjia = Integer.parseInt(jtheightjia.getText());  
            this.jtheightjie = Integer.parseInt(jtheightjie.getText());  
              
            this.now = now;  
        }  
        @Override  
        public void actionPerformed(ActionEvent e) {  
            if(e.getActionCommand().equals("寫入文件")){  
                JavaIO jio = new JavaIO();  
                try {  
                    jio.writeFile(jp3.getText(),jp2.getText()+jp1.getText());  
                    now.setText("文件已寫入");  
                } catch (Exception e1) {  
                    e1.printStackTrace();  
                }  
            }else if(e.getActionCommand().equals("讀取文件")){  
                JavaIO jio = new JavaIO();  
                jio.readFile(jp2.getText()+jp1.getText());  
                now.setText("文件已讀取");  
                  
            }else if(e.getActionCommand().equals("  復  制            文  件  ")){  
                JavaIO jio = new JavaIO();  
                try {  
                    jio.copy(jtfore.getText(), jtafter.getText());  
                    now.setText("文件已複製");  
                } catch (Exception e1) {  
                    e1.printStackTrace();  
                }  
            }else if(e.getActionCommand().equals("  文  件            加  密  ")){  
                JavaIO jio = new JavaIO();  
                try {  
                    jio.JiaMi(jtjiami.getText(), jtjiaafter.getText(),jtdayjia,jtheightjia);  
                    now.setText("文件已加密");  
                } catch (Exception e1) {  
                    e1.printStackTrace();  
                }  
            }else if(e.getActionCommand().equals("  文  件            解  密  ")){  
                JavaIO jio = new JavaIO();  
                try {  
                    jio.JieMi(jtjiemi.getText(), jtjieafter.getText(),jtdayjie,jtheightjie);  
                    now.setText("文件已解密");  
                } catch (Exception e1) {  
                    e1.printStackTrace();  
                }  
            }  
        }  
    }  
主要實現方法類:
    package czj_javaIO;  
      
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.FileOutputStream;  
      
    public class JavaIO {  
          
        private File currentFile;  
        public static void main(String[] args) throws Exception {  
            JavaIO ja = new JavaIO();  
            ja.findFiles("E:/");  
    //      ja.readFile("E://類與對象總結.txt");  
    //      ja.writeFile("這是寫入文件的內容。","E://類與對象總結11.txt");  
    //      ja.JiaMi("E://類與對象總結.txt", "D://加密後的類與對象總結.png");  
    //      ja.JieMi("D://加密後的類與對象總結.png","E://解密後類與對象總結.txt" );  
    //      ja.copy("E://類與對象總結.txt", "E://類與對象總結的複製文件.txt");  
        }  
        /** 
         * 查找文件 
         * @param 查找目錄 
         */  
        public void findFiles(String s){  
            File file = new File(s);  
            File[] f = file.listFiles();  
    //      System.out.println(f);  
            for(int i = 0;i<f.length;i++){  
                 currentFile = f[i];  
                 if(currentFile.isDirectory()){  
                    findFiles(currentFile.getAbsolutePath());  
                }  
                if(currentFile.getName().endsWith("txt"))  
                System.out.println(currentFile);  
            }  
        }  
        /** 
         * 讀取文件 
         * @param s文件名(帶絕對路徑) 
         */  
        public void readFile(String s){  
            try {  
                FileInputStream  fis = new FileInputStream(s);  
                int n=fis.read();  
                while(n!=-1){  
                    System.out.println("字節:"+n);  
                    n = fis.read();  
                }  
                fis.close();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        /** 
         * 寫文件的方法 
         * @param msg寫入的內容 
         * @param s文件絕對路徑 
         * @throws Exception拋出異常 
         */  
        public void writeFile(String msg,String s) throws Exception{  
            try {  
                FileOutputStream fos = new FileOutputStream(s,false);  
                byte[] b = msg.getBytes();//得到組成字符串的字節  
                fos.write(b);  
                fos.close();//關閉輸出流   
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }  
        }  
        /** 
         * 複製文件 
         * @param from原文件(帶絕對路徑)  
         * @param to 複製後文件(帶絕對路徑) 
         * @throws Exception 
         */  
        public void copy(String from,String to) throws Exception{  
            FileInputStream  fis = new FileInputStream(from);  
            FileOutputStream fos = new FileOutputStream(to,false);  
            int n = fis.read();  
            //循環寫入  
            while(n!=-1){  
                    fos.write(n);  
                n=fis.read();  
            }  
            //關閉輸入輸出流  
            fis.close();  
            fos.close();  
        }  
        /** 
         * 文件加密傳輸的方法 
         * @param from原文件(帶絕對路徑) 
         * @param to複製後文件(帶絕對路徑) 
         * @throws Exception拋出異常 
         */  
        public void JiaMi(String from,String to,int day,int height) throws Exception{  
            FileInputStream  fis = new FileInputStream(from);  
            FileOutputStream fos = new FileOutputStream(to,false);  
            int n = fis.read();  
            int count=0;  
            //循環寫入  
            while(n!=-1){//加密算法,可行定義,與解密算法相逆  
                if(day%height*n != 1){  
                    fos.write(n+height);  
                }else{  
                    fos.write(n);  
                }  
                n=fis.read();  
            }  
            fis.close();  
            fos.close();  
        }  
        /** 
         * 文件解密接收的方法 
         * @param from原文件(帶絕對路徑) 
         * @param to複製後文件(帶絕對路徑) 
         * @throws Exception拋出異常 
         */  
        public void JieMi(String from,String to,int day,int height) throws Exception{  
            FileInputStream  fis = new FileInputStream(from);  
            FileOutputStream fos = new FileOutputStream(to,false);  
            int n = fis.read();  
            //循環寫入  
            while(n!=-1){//解密算法,可行定義,與解密算法相逆  
                if(day%height*n != 1){  
                    fos.write(n-height);  
                }else{  
                    fos.write(n);  
                }  
                n=fis.read();  
            }  
            //關閉輸入輸出流  
            fis.close();  
            fos.close();  
        }  
          
    }  
在測試時需要注意的是必須先寫入文件,否則後面的操作都將因爲找不到對象而報這樣的錯:java.io.FileNotFoundException: E:\測試用文件.txt (系統找不到指定的文件。)

   總體來說代碼量還是不少的,監聽器類的構建主要還是涉及到許多參數的傳遞會比較麻煩。UI類在佈局的調整上下了很大的功夫。。。

    加解密文件的方法裏的算法可以根據自己的設定進行修改哦。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章