how2j.cn


工具版本兼容问题
Reader字符输入流
Writer字符输出流
专门用于字符的形式读取和写入数据


本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



2分14秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器



步骤 1 : 使用字符流读取文件   
步骤 2 : 使用字符流把字符串写入到文件   
步骤 3 : 练习-文件加密   
步骤 4 : 答案-文件加密   
步骤 5 : 练习-文件解密   
步骤 6 : 答案-文件解密   

步骤 1 :

使用字符流读取文件

edit
FileReader 是Reader子类,以FileReader 为例进行文件读取
package stream; import java.io.File; import java.io.FileReader; import java.io.IOException; public class TestStream { public static void main(String[] args) { // 准备文件lol.txt其中的内容是AB File f = new File("d:/lol.txt"); // 创建基于文件的Reader try (FileReader fr = new FileReader(f)) { // 创建字符数组,其长度就是文件的长度 char[] all = new char[(int) f.length()]; // 以字符流的形式读取文件所有内容 fr.read(all); for (char b : all) { // 打印出来是A B System.out.println(b); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
步骤 2 :

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

edit
FileWriter 是Writer的子类,以FileWriter 为例把字符串写入到文件
使用字符流把字符串写入到文件
package stream; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class TestStream { public static void main(String[] args) { // 准备文件lol2.txt File f = new File("d:/lol2.txt"); // 创建基于文件的Writer try (FileWriter fr = new FileWriter(f)) { // 以字符流的形式把数据写入到文件中 String data="abcdefg1234567890"; char[] cs = data.toCharArray(); fr.write(cs); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
步骤 3 :

练习-文件加密

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
准备一个文本文件(非二进制),其中包含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。
字符需要保留大小写
非字母字符
比如',&^ 保留不变,中文也保留不变
建议: 使用以前学习的练习题中的某个Java文件,比如循环练习,就有很多的字符和数字
练习-文件加密
步骤 4 :

答案-文件加密

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

10分32秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


答案-文件加密
package stream; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class TestStream { /** * * @param encodingFile * 被加密的文件 * @param encodedFile * 加密后保存的位置 */ public static void encodeFile(File encodingFile, File encodedFile) { try (FileReader fr = new FileReader(encodingFile); FileWriter fw = new FileWriter(encodedFile)) { // 读取源文件 char[] fileContent = new char[(int) encodingFile.length()]; fr.read(fileContent); System.out.println("加密前的内容:"); System.out.println(new String(fileContent)); // 进行加密 encode(fileContent); // 把加密后的内容保存到目标文件 System.out.println("加密后的内容:"); System.out.println(new String(fileContent)); fw.write(fileContent); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void encode(char[] fileContent) { for (int i = 0; i < fileContent.length; i++) { char c = fileContent[i]; if (isLetterOrDigit(c)) { switch (c) { case '9': c = '0'; break; case 'z': c = 'a'; break; case 'Z': c = 'A'; break; default: c++; break; } } fileContent[i] = c; } } public static boolean isLetterOrDigit(char c) { // 不使用Character类的isLetterOrDigit方法是因为,中文也会被判断为字母 String letterOrDigital = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return -1 == letterOrDigital.indexOf(c) ? false : true; } public static void main(String[] args) { File encodingFile = new File("E:/project/j2se/src/Test1.txt"); File encodedFile = new File("E:/project/j2se/src/Test2.txt"); encodeFile(encodingFile, encodedFile); } }
步骤 5 :

练习-文件解密

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
解密在文件加密中生成的文件。
设计一个方法

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。
字符需要保留大小写
非字母字符:
比如',&^ 保留不变,中文也保留不变
练习-文件解密
步骤 6 :

答案-文件解密

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

2分7秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


答案-文件解密
package stream; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class TestStream { /** * * @param decodingFile * 被解密的文件 * @param decodedFile * 解密后保存的位置 */ public static void decodeFile(File decodingFile, File decodedFile) { try (FileReader fr = new FileReader(decodingFile); FileWriter fw = new FileWriter(decodedFile)) { // 读取源文件 char[] fileContent = new char[(int) decodingFile.length()]; fr.read(fileContent); System.out.println("源文件的内容:"); System.out.println(new String(fileContent)); // 进行解密 decode(fileContent); System.out.println("解密后的内容:"); System.out.println(new String(fileContent)); // 把解密后的内容保存到目标文件 fw.write(fileContent); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void decode(char[] fileContent) { for (int i = 0; i < fileContent.length; i++) { char c = fileContent[i]; if (isLetterOrDigit(c)) { switch (c) { case '0': c = '9'; break; case 'a': c = 'z'; break; case 'A': c = 'Z'; break; default: c--; break; } } fileContent[i] = c; } } public static boolean isLetterOrDigit(char c) { // 不使用Character类的isLetterOrDigit方法是因为,中文也会被判断为字母 String letterOrDigital ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return -1 == letterOrDigital.indexOf(c) ? false : true; } public static void main(String[] args) { File decodingFile = new File("E:/project/j2se/src/Test2.txt"); File decodedFile = new File("E:/project/j2se/src/Test1.txt"); decodeFile(decodingFile, decodedFile); } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2022-04-11 为什么解密后内容后边会有一些小方框
慕羽1314




。。。
加载中
package file;

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

public class TestStream4 {

    public static void main(String[] args) {
        File encodedFile = new File("d:/LOLFolder/LOLjiami.txt");
        File decodedFile = new File("d:/LOLFolder/jj/jiemiwenjian.txt");
        decodeFile(encodedFile, decodedFile);
    }

    public static void decodeFile(File encodedFile, File decodedFile){
        try(FileReader fr = new FileReader(encodedFile); FileWriter fw = new FileWriter(decodedFile)){
            char[] a = new char[(int)encodedFile.length()];
            fr.read(a);
            System.out.println("解密前文件内容:");
            System.out.println(new String(a));

            decode(a);

            System.out.println("解密后文件内容:");
            System.out.println(new String(a));
            fw.write(a);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public static void decode(char[] ch){
        for(int i = 0; i < ch.length; i++){
            char k = ch[i];
            if(LetterOrDigit(k)){
                switch(k){
                    case '0':
                        k = '9';
                        break;
                    case 'a':
                        k = 'z';
                        break;
                    case 'A':
                        k = 'Z';
                        break;
                    default:
                        k--;
                }
            }
            ch[i] = k;
        }
    }

    public static boolean LetterOrDigit(char n){
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        if(-1 == str.indexOf(n))
            return false;
        else
            return true;
    }
}

							


2 个答案

gongming
答案时间:2022-04-29
daban2009
答案时间:2022-04-16
你在用char[] a = new char[(int)encodedFile.length()];创建数组时,大小给的是文件的字节大小,而你读进去的确是字符,字符的个数是不一定等于字节大小的。 例如读取文件里面只有一个汉字"中"那么它是3个字节,你定义的数组大小就是3,然后你只读取了一个字符"中"放在了数组第一个位置,当你把字符数组转字符串时,后面未赋值的元素就会打印出来方框
有问题的代码char[] a = new char[(int)encodedFile.length()];



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-03-16 我不明白答案里c--的操作
momoso




char c = fileContent[i];这里不是c指向了 fileContent[i]吗,c--之后不应该是fileContent[i]的位置减一个吗???不理解,答案看不懂了。。。
package stream;
 
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class TestStream {
 
    /**
     *
     * @param decodingFile
     *            被解密的文件
     * @param decodedFile
     *            解密后保存的位置
     */
    public static void decodeFile(File decodingFile, File decodedFile) {
 
        try (FileReader fr = new FileReader(decodingFile); FileWriter fw = new FileWriter(decodedFile)) {
            // 读取源文件
            char[] fileContent = new char[(int) decodingFile.length()];
            fr.read(fileContent);
            System.out.println("源文件的内容:");
            System.out.println(new String(fileContent));
            // 进行解密
            decode(fileContent);
            System.out.println("解密后的内容:");
            System.out.println(new String(fileContent));
            // 把解密后的内容保存到目标文件
            fw.write(fileContent);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
    private static void decode(char[] fileContent) {
        for (int i = 0; i < fileContent.length; i++) {
            char c = fileContent[i];
            if (isLetterOrDigit(c)) {
                switch (c) {
                case '0':
                    c = '9';
                    break;
                case 'a':
                    c = 'z';
                    break;
                case 'A':
                    c = 'Z';
                    break;
                default:
                    c--;
                    break;
                }
            }
            fileContent[i] = c;
        }
    }
 
    public static boolean isLetterOrDigit(char c) {
        // 不使用Character类的isLetterOrDigit方法是因为,中文也会被判断为字母
        String letterOrDigital ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        return -1 == letterOrDigital.indexOf(c) ? false : true;
    }
 
    public static void main(String[] args) {
        File decodingFile = new File("E:/project/j2se/src/Test2.txt");
        File decodedFile = new File("E:/project/j2se/src/Test1.txt");
 
        decodeFile(decodingFile, decodedFile);
 
    }
}

							


4 个答案

hoolich
答案时间:2022-04-02
/* /Users/chenqiang/Desktop/手机样本.sql 准备一个文本文件(非二进制),其中包含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。 字符需要保留大小写 非字母字符 比如',&^ 保留不变,中文也保留不变 建议: 使用以前学习的练习题中的某个Java文件,比如循环练习,就有很多的字符和数字 解密在文件加密中生成的文件。 设计一个方法 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 stream; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import static java.lang.Character.isLetterOrDigit; public class TestStream { public static String encode; public static String dcode; public static boolean isLetterOrDigit(short c) { // 不使用Character类的isLetterOrDigit方法是因为,中文也会被判断为字母 String letterOrDigital = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return -1 == letterOrDigital.indexOf(c) ? false : true; } public static void encodeFile(File encodingFile, File encodedFile){ try (FileReader fr = new FileReader(encodingFile)) { // 创建字符数组,其长度就是文件的长度 char[] all = new char[(int) encodingFile.length()]; // 以字符流的形式读取文件所有内容 char[] encodestr = new char[(int) encodingFile.length()]; fr.read(all); System.out.println("加密前"); System.out.println(new String(all)); for (int i=0;i<encodingFile.length();i++) { // 打印出来是A B short cc=(short)(all[i]); if (isLetterOrDigit(cc)) { switch (cc) { case '9': cc = '0'; break; case 'z': cc = 'a'; break; case 'Z': cc = 'A'; break; default: cc++; break; } } encodestr[i]= (char) cc; } encode = new String(encodestr); System.out.println("加密后"); System.out.println(encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try (FileWriter fr = new FileWriter(encodedFile)) { // 以字符流的形式把数据写入到文件中 fr.write(encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void decodeFile(File decodingFile, File decodedFile){ try (FileReader fr = new FileReader(decodingFile)) { // 创建字符数组,其长度就是文件的长度 char[] all = new char[(int) decodingFile.length()]; // 以字符流的形式读取文件所有内容 char[] dcodestr = new char[(int) decodingFile.length()]; fr.read(all); System.out.println("解密前"); System.out.println(new String(all)); for (int i=0;i<decodingFile.length();i++) { // 打印出来是A B short cc=(short)(all[i]); if (isLetterOrDigit(cc)) { switch (cc) { case '0': cc = '9'; break; case 'a': cc = 'z'; break; case 'A': cc = 'Z'; break; default: cc--; break; } } dcodestr[i]= (char) cc; } dcode = new String(dcodestr); System.out.println("解密后"); System.out.println(dcode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try (FileWriter fr = new FileWriter(decodedFile)) { // 以字符流的形式把数据写入到文件中 fr.write(dcode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // 准备文件lol.txt其中的内容是AB File f = new File("/Users/chenqiang/Desktop/1.sql"); // 创建基于文件的Reader File f2 = new File("/Users/chenqiang/Desktop/2.sql"); File f3 = new File("/Users/chenqiang/Desktop/3.sql"); encodeFile(f, f2); decodeFile(f2, f3); } }

hoolich
答案时间:2022-04-02
/* /Users/chenqiang/Desktop/手机样本.sql 准备一个文本文件(非二进制),其中包含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。 字符需要保留大小写 非字母字符 比如',&^ 保留不变,中文也保留不变 建议: 使用以前学习的练习题中的某个Java文件,比如循环练习,就有很多的字符和数字*/ package stream; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class TestStream { public static String encode; public static void encodeFile(File encodingFile, File encodedFile){ try (FileReader fr = new FileReader(encodingFile)) { // 创建字符数组,其长度就是文件的长度 char[] all = new char[(int) encodingFile.length()]; // 以字符流的形式读取文件所有内容 char[] encodestr = new char[(int) encodingFile.length()]; fr.read(all); System.out.println("加密前"); System.out.println(new String(all)); for (int i=0;i<encodingFile.length();i++) { // 打印出来是A B short cc=(short)(all[i]); encodestr[i]= (char) (cc+1); } encode = new String(encodestr); System.out.println("加密后"); System.out.println(encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try (FileWriter fr = new FileWriter(encodedFile)) { // 以字符流的形式把数据写入到文件中 fr.write(encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // 准备文件lol.txt其中的内容是AB File f = new File("/Users/chenqiang/Desktop/1.sql"); // 创建基于文件的Reader File f2 = new File("/Users/chenqiang/Desktop/2.sql"); encodeFile(f, f2); } }

寒舞丶月殇
答案时间:2022-03-19
这里的c--指的是c这个字符前移一个,比如b->a,9->8这种,不是数组的位置发生变化,控制数组的位置变化的应该是i

momoso
答案时间:2022-03-17
有大神帮忙解答一下嘛



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-01-30 【文件加密】代码结果出错求助
2022-01-05 中文为什么会乱码
2021-09-19 简单加密程序


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 108 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-I/O-字符流 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图