how2j.cn


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

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



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



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

步骤 1 :

使用字符流读取文件

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 :

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

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 :

练习-文件加密

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
准备一个文本文件(非二进制),其中包含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 :

答案-文件加密

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


答案-文件加密
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 :

练习-文件解密

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

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 :

答案-文件解密

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


答案-文件解密
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公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-09-16 编码
花木沐



还比较简单 source:jihauzbcaatz1890ZAS$%#@妖刀橘右京IOOz'",. encoded:kjibvacdbbua2901ABT$%#@妖刀橘右京JPPa'",.
package file;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Code {
	public static void main(String[] args) {
		File source=new File("e:/LOFolder/source.txt");
		File encoded=new File("e:/LOFolder/encoded.txt");
		File decoded=new File("e:/LOFolder/decoded.txt");
		if(!encoded.exists()||!decoded.exists()) {
			try {
				encoded.createNewFile();
				decoded.createNewFile();
			}catch(IOException e) {
				
			}
		}
		encodeFile(source,encoded);
		decodeFile(encoded,decoded);
	}
	public static void encodeFile(File encodingFile,File encodedFile) {
		char[]c=new char[(int)encodingFile.length()];
		//try()中实例化,自动关闭
		try(FileReader fr=new FileReader(encodingFile)){
			fr.read(c);
			//for(char a:c)更方便
			for(int i=0;c[i]!='\0';i++) {
				if(c[i]>='0'&&c[i]<='8') c[i]+=1;
				else if(c[i]=='9') c[i]='0';
				else if(c[i]>='a'&&c[i]<='y'||c[i]>='A'&&c[i]<='Y') c[i]+=1;
				else if(c[i]=='z') c[i]='a';
				else if(c[i]=='Z') c[i]='A';
			}
		}catch(IOException e) {
			
		}
		try(FileWriter fr=new FileWriter(encodedFile)){
			fr.write(c);
		}catch(IOException e) {
			
		}
	}
	public static void decodeFile(File decodingFile,File decodedFile) {
		
	}

}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-09-12 加密作业
AKZ



作业
package io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
//准备一个文本文件(非二进制),其中包含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。
//字符需要保留大小写
//非字母字符:
//比如',&^ 保留不变,中文也保留不变
public class CharStreamDemo {
	public static File encodingFile;
	public static File encodedFile;
	public static File decodingFile;
	public static File decodedFile;
	public static void encodeFile(File encodingFile,File encodedFile) {
		try {
			FileReader fr=new FileReader(encodingFile);
			FileWriter fw=new FileWriter(encodedFile);
			char [] encodingChar=new char[(int) encodingFile.length()];
			fr.read(encodingChar);
			System.out.println(Arrays.toString(encodingChar));
			String encodingCharc="";
			for(char c:encodingChar) {
				if(c=='9') {
					c='0';
				}
				else if(c>='0'&&c<='8') {
					c=(char) (c+1);
				}
				if(c>='a'&&c<='y') {
					c=(char) (c+1);
				}
				if(c>='A'&&c<='Y'){
					c=(char) (c+1);
				}
				if(c=='z') {
					c='a';
				}
				if(c=='Z') {
					c='A';
				}	
				encodingCharc+=c;
			}
			char [] encodedCharc=encodingCharc.toCharArray();
			System.out.println(Arrays.toString(encodedCharc));
			fw.write(encodedCharc);
			fr.close();
			fw.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			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。
		//字符需要保留大小写
		//非字母字符:
		//比如',&^ 保留不变,中文也保留不变
		try {
			FileReader fr=new FileReader(decodingFile);
			FileWriter fw=new FileWriter(decodedFile);
			char [] decodingChar=new char[(int) decodingFile.length()];
			fr.read(decodingChar);
			String decodingCharc="";
			for(char c:decodingChar) {
				if(c>'0'&&c<='9') {
					c=(char) (c-1);
				}
				else if(c=='0'){
					c='9';
				}
				if(c>'a'&&c<='z') {
					c=(char) (c-1);
				}
				else if(c=='a') {
					c='z';
				}
				if(c>'A'&&c<='Z') {
					c=(char) (c-1);
				}
				else if(c=='A') {
					c='Z';
				}
				decodingCharc+=c;
			}
			char []decodedCharc=decodingCharc.toCharArray();
			fw.write(decodedCharc);
			fr.close();
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		encodingFile=new File("e:/encodingFile.txt");
		encodedFile=new File("e:/encodedFile.txt");
		decodingFile=new File("e:/decodingFile.txt");
		decodedFile=new File("e:/decodedFile.txt");
		//encodeFile(encodingFile,encodedFile);
		decodeFile(decodingFile,decodedFile);
	}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-09-08 坚持交作业!!!
2018-08-28 提交作业
2018-08-23 交作业,自己写的,容易理解
2018-08-18 关于空格和read方法的问题
2018-08-18 交一下加密的作业,写的不够简洁
2018-07-31 检查一下
2018-07-30 第五题作业
2018-07-30 第四题作业
2018-07-30 第四题作业
2018-07-30 作业
2018-07-28 交作业
2018-07-20 作业加密未完善
2018-07-18 为啥加解密一次最后就会多几个空格呢?请大神帮忙解释下,感谢不尽
2018-07-08 加密问题 输出 后有一个方框,文本里没有
2018-07-01 交作业(解密,加密)
2018-06-29 文件加密
2018-06-12 使用加密和解密写入文件后会文件最后会多出一些非法字符,为什么?
2018-06-11 交作业
2018-05-12 为啥我测试读文件汉字出来是乱码
2018-04-16 解密思路其实就是另一种变相的加密
2018-04-14 加密
2018-04-03 这里用增强循环为什么不可以?
2018-03-26 加密答案
2018-03-25 交作业
2018-03-21 用if代替switch,但是除了问题,请帮看看是什么原因多了几个空格
2017-12-12 用字符流创建字符数组读取文件长度的时候,如果文件内容是汉字,读取长度会翻倍,导致输出的内容有空格。请问如何解决?
2017-12-10 汉字=-=
2017-12-10 汉字怎么解决呢
2017-10-22 try()这个小括号里一般是什么,能不能把里面的东西写在外面
2017-10-17 代码运行的时候总是会出现拒绝访问。。。把文件换了无数个地方还是不行啊,心态崩了
2017-10-17 代码运行的时候总是会出现拒绝访问。。。把文件换了无数个地方还是不行啊,心态崩了
2017-10-13 交作业
2017-10-04 为什么文件长度和数组长度相等?
2017-09-20 文件写入时实际文件大小和写入的字节大小
2017-08-21 使用字节输入输出流就不会乱码,使用字符输入输出流就会乱码。
2017-08-10 无法写入文件中
2017-08-02 拷贝代码
2017-08-02 无法把字符流写入文件中
2017-07-26 第一个例子all数组设置的太大了吧?应该设置一半就好了吧
2017-05-14 以前没有这么写过
2017-04-14 为什么我加密后的字符串写不进去文件中?
2017-03-21 请问字符串可以直接写入吗
2017-03-20 为什么控制台输出最后多了个框
2017-03-16 为什么这样子不能转换?9和z可以正常转换,是‘|’这个运算符用法不对吗?
2016-08-07 三元运算
2016-07-29 为什么中文读出来再写回去就变成了一个奇怪的符号,而且在中文输入法模式下的符号也是这样
2016-07-29 为什么中文读出来再写回去就变成了一个奇怪的符号,而且在中文输入法模式下的符号也是这样
2016-07-23 为什么加密后的文件末尾会多出来一些空格?
2016-04-13 for (char b : all)




提问之前请登陆
关于 JAVA 中级-I/O-字符流 的提问

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

上传截图