Java IO 字符流


Reader字符输入流
Writer字符输出流
专门用于字符形式的读取和写入数据


使用字符流读取文件

FileReader是Reader的子类,用FileReader读取文件

package JavaIOTest;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {
    public static void main(String[] args) {
        File file = new File("d:/xyz/z/zzz/zzzz/lol.txt");
        //创建基于文件的Reader
        try(FileReader fileReader = new FileReader(file)){
            //创建字符数组,其长度就是文件的长度
            char[] all = new char[(int)file.length()];
            //以字符流的形式读取文件的内容
            fileReader.read(all);
            for (char b : all){
                System.out.println(b);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

使用字符流把字符串写入文件

package JavaIOTest;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {
    public static void main(String[] args) {
        File file = new File("d:/xyz/z/zzz/zzzz/lol4.txt");
        //创建基于文件的Writer对象
        try( FileWriter fileWriter = new FileWriter(file)){
            //以字符流的形式将数据写入到文件当中
           String data = "adasdfljaljdlskjdlasjd";
           fileWriter.write(data);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

练习:文件加密

准备一个文本文件(非二进制),其中包含ASCII码的字符和中文字符。
设计一个方法

public static void encodeFile(File encodingFile, File encodedFile);

在这个方法中把encodingFile的内容进行加密,然后保存到encodedFile文件中。
加密算法:
数字:
如果不是9的数字,在原来的基础上加1,比如5变成6, 3变成4
如果是9的数字,变成0
字母字符:
如果是非z字符,向右移动一个,比如d变成e, G变成H
如果是z,z->a, Z-A。
字符需要保留大小写
非字母字符
比如’,&^ 保留不变,中文也保留不变

package JavaIOTest;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class EncodeTest {
    public static void main(String[] args) {
        EncodeTest encodeTest = new EncodeTest();
        encodeTest.encodedFile();
    }
    public void encodedFile(){
        String LetterOrDigit = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        File encodingFile = new File("d:/xyz/z/zzz/zzzz/lol.txt");
        char[] chars = new char[(int)encodingFile.length()];
        File encodedFile = new File("d:/xyz/z/zzz/zzzz/lolencoded.txt");
        try(FileReader fileReader = new FileReader(encodingFile);FileWriter fileWriter = new FileWriter(encodedFile)){
            fileReader.read(chars);
            System.out.println("加密前的内容");
            System.out.println(new String(chars));
            for (int i = 0; i<chars.length; i++){
                char c = chars[i];

                if (LetterOrDigit.indexOf(c)!=-1){
                    switch (chars[i]){
                        case 'Z':
                            c='A';
                            break;
                        case 'z':
                            c='a';
                            break;
                        case '9':
                            c='0';
                            break;
                        default:
                            c++;
                            break;
                    }
                }
                chars[i]=c;
            }
            System.out.println("加密后的内容");
            System.out.println(new String(chars));
            fileWriter.write(chars);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

练习:解密

解密在文件加密中生成的文件。
设计一个方法

public static void decodeFile(File decodingFile, File decodedFile);

在这个方法中把decodingFile的内容进行解密,然后保存到decodedFile文件中。
解密算法:
数字:
如果不是0的数字,在原来的基础上减1,比如6变成5, 4变成3
如果是0的数字,变成9
字母字符:
如果是非a字符,向左移动一个,比如e变成d, H变成G
如果是a,a->z, A-Z。
字符需要保留大小写
非字母字符:
比如’,&^ 保留不变,中文也保留不变

package JavaIOTest;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;

public class DecodeTest {
    public static void main(String[] args) {
        File encodedFile = new File("d:/xyz/z/zzz/zzzz/lolencoded.txt");
        File decodedFile = new File("d:/xyz/z/zzz/zzzz/loldecoded.txt");
        DecodeTest.decodeFile(encodedFile,decodedFile);
    }

    public static void decodeFile(File...targetFile){
        String LetterOrDigit = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        int log = 0;
        File encodedFile = targetFile[0];
        File decodedFile = targetFile[1];
        char[] chars = new char[(int)encodedFile.length()];
        try(FileReader fileReader = new FileReader(encodedFile); FileWriter fileWriter = new FileWriter(decodedFile)){
            fileReader.read(chars);
            System.out.println("解密前的内容:");
            System.out.println(new String(chars));
            System.out.println();
            for (char c : chars){
                if (LetterOrDigit.indexOf(c)!=-1){
                    switch (c){
                        case '0':
                            chars[log]='9';
                            break;
                        case 'a':
                            chars[log]='z';
                            break;
                        case 'A':
                            chars[log]='Z';
                            break;
                        default:
                            chars[log]--;
                            break;
                    }
                }
                log++;
            }
            fileReader.read(chars);
            System.out.println("解密后的内容:");
            System.out.println(new String(chars));
            fileWriter.write(chars);
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}

posted @ 2019-07-30 09:47  消灭猕猴桃  阅读(73)  评论(0编辑  收藏  举报