一、 图片加密
思路,我们只要在输入字节的时候,异或上一个数就可以对图片进行加密
public static void main(String[] args) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("6.jpg"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy.jpg"));
int b;
while ((b=bis.read())!=-1) {
bos.write(b^123);
}
bos.close();
bis.close();
}
效果如下:
如果我们需要解密的话,只需要把输入输出的文件名改掉就ok了。即
BufferedInputStream bis=new
BufferedInputStream(new FileInputStream("copy.jpg"));
BufferedOutputStream bos=new
BufferedOutputStream(new FileOutputStream("copy2.jpg"));
二、 根据文件路劲拷贝文件
需求:在控制台录入文件的路径,将文件拷贝到当前项目下
分析:
-
创建键盘录入对象
-
定义方法对键盘录入的路径进行判断,如果是文件就返回。
-
在主方法中接受该文件
-
读和写该文件
步骤:定义一个方法获取键盘录入的文件路径,并封装成File对象返回
- 返回值类型File
- 参数列表无
public class Test2 {
public static void main(String[] args) throws IOException {
File file =getFile();
BufferedInputStream bufferedInputStream =
new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bufferedOutputStream =
new BufferedOutputStream(newFileOutputStream(file.getName()));
int b;
while ((b=bufferedInputStream.read())!=-1) {
bufferedOutputStream.write(b);
}
bufferedInputStream.close();
bufferedInputStream.close();
}
//定义一个方法获取文件路径,并封装成File对象返回
//返回类型File
//参数列表无
public static File getFile() {
Scanner scanner =new Scanner(System.in);
System.out.println("请输入一个文件的路径");
while(true) {
String line =scanner.nextLine();
File file =new File(line);
if (!file.exists()) {
System.out.print("您录入的文件路径不存在,请重新录入:");
}else if(file.isDirectory()){
System.out.println("您录入的是文件夹路径,请重新录入:");
}else {
return file;
}
}
}
}
此时我们在控制台输入一个文件的位置。
如:
此时我们该工程的项目下会多出一张图片。
三、 录入数据拷贝到文件
需求: 将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出。
分析:
- 创建键盘录入对象
- 创建输出流对象,关联text.txt文件
- 定义无限循环
- 遇到quit退出循环
- 如果不是quit就继续写入
public class Test3 {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
Scanner scanner =new Scanner(System.in);
FileOutputStream fileOutputStream =new FileOutputStream("text.txt");
System.out.print("请输入内容");
while (true) {
String line=scanner.nextLine();
if (line.equals("quite")) {
break;
}
else {
fileOutputStream.write(line.getBytes()); //字符串写出必须转换成字节数组
fileOutputStream.write("\r\n".getBytes());
}
}
fileOutputStream.close();
}
}
四、 将文本反转
需求:将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换。
分析:
第一步:创建输入输出流对象
第二步:创建集合对象,把数据进行临时存储,倒着遍历写出去
第三步:将读到的数据,存储在集合中
第四步:倒着遍历集合将数据写到文件上
第五步:关流
public class Test4 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//1.创建输入输出流对象
BufferedReader bufferedReader =new BufferedReader(new FileReader("zzz.txt"));
BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("rezzz.txt"));
//2.创建集合对象
List <String> list =new ArrayList<String>();
String line;
while ((line=bufferedReader.readLine())!=null) {
list.add(line);
}
for (int i = list.size()-1; i >=0; i--) {
bufferedWriter.write(list.get(i));
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();
}
}
五、 获取文本上字符(每一个字符,每一个字)出现的次数
需求:获取一个文本上每个字符出现的次数,将结果写在times.txt上
分析:
- 创建带缓冲的输入流对象
- 创建双列集合对象TreeMap
- 将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就讲键和1存储,如果包含这个键,就将该键和值加1存储
- 关闭输入流,创建输出流对象
- 遍历集合内容,将集合中的内容写到times.txt中,
- 关闭输出流
public class Test2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//1.创建带缓冲的输入流对象
BufferedReader bufferedReader =new BufferedReader(new FileReader("zzz.txt"));
//2.创建双列集合对象TreeMap
TreeMap<Character,Integer> treeMap =new TreeMap<Character,Integer> ();
int ch;
while ((ch=bufferedReader.read())!=-1) {
char c=(char)ch; //强制转换
treeMap.put(c, !treeMap.containsKey(c)?1:treeMap.get(c)+1);
}
//4.关闭输入流
bufferedReader.close();
//5.创建输出流对象
BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("times.txt"));
//6.遍历集合将集合中的内容写到times.txt中
for (Character key : treeMap.keySet()) {
switch (key) {
case '\t':
bufferedWriter.write("\\t"+"==="+treeMap.get(key));
break;
case '\n':
bufferedWriter.write("\\n"+"==="+treeMap.get(key));
default:
break;
}
bufferedWriter.write(key+"==="+treeMap.get(key));
bufferedWriter.newLine();
}
//7.关闭输出流
bufferedWriter.close();
}
}
效果如下:
六、 做一个试用版的软件
需求:* 当我们下载一个试用版软件,没有购买正版的时候,每执行一次就会提醒我们还有多少次使用机会用学过的IO流知识,模拟试用版软件,试用10次机会,执行一次就提示一次您还有几次机会,如果次数到了提示请购买正版
分析:
1. 创建带缓冲的输入流对象,因为要使用readLine方法。可以保证数据的原样性
2. 将读到的字符串转换为int数
3. 对int数进行判断,如果大于0,就将其- -写回去,如果不大于0.就提示购买正版
4. 在if判断中要将 - -的结果打印,并将结果通过输出流写到文件上
public class Test3 {
public static void main(String[] args) throws IOException {
//1.创建带缓冲的输入流对象,因为要使用readLine方法。可以保证数据的原样性
BufferedReader bufferedReader =new BufferedReader(new FileReader("config.txt"));
//2.将读到的字符串转换为int数
String line =bufferedReader.readLine();
int times = Integer.parseInt(line);
if (times > 0) {
System.out.println("您还有"+times--+"次机会");
FileWriter fileWriter =new FileWriter("config.txt");
fileWriter.write(times+"");
fileWriter.close();
}else {
System.out.println("您的试用次数已到,请购买正版。");
}
bufferedReader.close();
}
}
我们在config.txt中写10次的话,我们每运行一次,次数都会减少。
七、 内存输出流
需求:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
分析:
1.read(byte[] b)是字节输入流的方法,创建FileInputStream,关联a.txt
2. 创建字节数组,长度为5
3. 将内存输出流的数据全部转换为字符串打印
4. 关闭输入流
FileInputStream fis =new FileInputStream("a.txt");
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
int len;
//3.创建字节数组,长度为5
byte[] arr=new byte[5];
while ((len=fis.read(arr))!=-1) {
byteArrayOutputStream.write(arr,0,len);
//如果没有字符内存数组,
//System.out.println(new String(arr,0,len));
}
//将内存输出流的数据全部转换为字符串打印
System.out.println(byteArrayOutputStream); //即使没有调用,底层也会默认帮我们调用toString()方法
fis.close();