JavaSE基础第14天练习(字节缓冲流,转换流,字符流)

一、 基础案例

1. 训练案例1【InputStreamReader OutputStreamWriter】

1.1. 训练描述:【InputStreamReader OutputStreamWriter】
一、 需求说明:以UTF-8编码的格式写出 “你好”到文件中, 并将数据正确的读取出来打印在控制台
1.2. 操作步骤描述
1. 创建OutputStreamWriter关联文件, 并在构造方法中指定编码表
2. 调用writer方法写出字符串
3. 创建InputStreamReader关联文件, 并在构造方法中指定码表进行读取
4. 调用read方法读取数据, 打印在控制台

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Test01 {

	public static void main(String[] args) throws IOException {
		
		//FileOutputStream fos = new FileOutputStream("D:\\java\\test01.txt");
		OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream("D:\\java\\test01.txt"));
		osw.write("你好你好");
		osw.flush();
		osw.close();
		
		read();
		 
	}

	private static void read() throws IOException {
		InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\java\\test01.txt"));
		char[] c = new char[1024];
		int a;
		while((a=isr.read(c)) != -1){
			System.out.println(c);
		}
	}
	
}

2. 训练案例2

2.1. 训练描述:【BufferedReader、BufferedWriter】
一、需求说明:字符缓冲区流的特殊功能复制Java文件
2.2. 操作步骤描述

  1. 创建BufferedReader输入流对象关联源文件
  2. 创建BufferedWriter输出流对象关联目标文件
  3. 调用readLine方法不断的读取,只要不等于null 说明没有读取完毕
  4. 调用writer方法直接写出字符串,但是要加上newLine方法手动换行
  5. 关闭流释放资源
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test02 {
	public static void main(String[] args) throws IOException {
		
		//BufferedReader br =new BufferedReader((new FileReader("D:\\java\\text02.txt"))); 出现乱码
		//FileReader构造函数和方法成员都没有设置编码方法
		//而InputStreamReader这个类有,因此可以wrap它以来达到转换字符编码的目的,代码如下:
		BufferedReader br =new BufferedReader(new InputStreamReader(new FileInputStream("D:\\java\\text02.txt"),"GBK"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\abc\\test02.txt"));
		String line;
		while((line =br.readLine())!=null){
			
			bw.write(line);
			bw.newLine();
			bw.flush();
			System.out.println(line);
		}
		
		bw.close();
		br.close();
		System.out.println("复制完成!!");
	}
}

3. 训练案例3

3.1. 训练描述【BufferedReader BufferedWriter】
一、 需求说明:
a) 将集合中Student对象的信息写入当前项目下的stuInfo.txt当中
b) 再读取stuInfo.txt的内容到集合中,遍历集合打印数据
二、 补充说明:
a) 写出信息的格式: it001,张曼玉,35,北京
b) 输出信息的格式: it001,张曼玉,35,北京
3.2. 操作步骤描述
分析:

  1. 创建Student类,用于封装数据
  2. 创建集合对象,将学生对象添加到集合中
  3. 创建输出流对象关联stuInfo.txt文件
  4. 遍历集合对象获取到每一个Student, 再用StringBuilder拼接成指定的格式并写出
  5. 关闭输出流对象
  6. 创建BufferedReader输入流对象关联stuInfo.txt, 因为有读取一行的方法
  7. 创建集合对象用于存储读取到的Student(也可以将原集合清空)
  8. 将读取到的每一行数据通过split方法切割,再将切割后的信息封装成Student对象
  9. 将学生对象添加到集合中
  10. 关闭输入流对象
  11. 遍历集合并打印

public class Student {
	String num;
	String name;
	int age;
	String city;
	public String getNum() {
		return num;
	}
	public void setNum(String num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String num, String name, int age, String city) {
		super();
		this.num = num;
		this.name = name;
		this.age = age;
		this.city = city;
	}
	
}
public class Test03 {

	public static void main(String[] args) throws IOException {
		ArrayList<Student> set = new ArrayList<>();
		set.add(new Student("it001","张曼玉",35,"北京"));
		set.add(new Student("it002","刘德华",35,"深圳"));
		set.add(new Student("it003","张家辉",35,"深圳"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("stuInfo1.txt"));
		for(Student s : set){
			bw.write(s.getNum()+" "+s.getName()+" "+s.getAge()+" "+s.getCity());
			bw.newLine();
			bw.flush();
		}
		bw.close();
		
		BufferedReader br = new BufferedReader(new FileReader("stuInfo1.txt"));
		String s;
		while((s = br.readLine())!=null){
			String[] sp = s.split(" ");
			
			Student stu = new Student();
			stu.setNum(sp[0]);
			stu.setName(sp[1]);
			stu.setAge(Integer.parseInt(sp[2]));
			stu.setCity(sp[3]);
			set.add(stu);
		}
		br.close();
		for(Student s1 :set){
			System.out.println(s1.getNum()+" "+s1.getName()+" "+s1.getAge()+" "+s1.getCity());
		}
	}

}

二、 扩展案例

1. 训练案例1

1.1. 训练描述:
一、 分析以下需求,并用代码实现:
实现一个验证码小程序,要求如下:
1. 在项目根目录下新建一个文件:data.txt,键盘录入3个字符串验证码,并存入data.txt中,要求一个验证码占一行;
2. 键盘录入一个需要被校验的验证码,如果输入的验证码在data.txt中存在:在控制台提示验证成功,如果不存在控制台提示验证失败
1.2. 操作步骤描述

  1. 键盘录入三个验证码用字符串接收
  2. 创建输出流对象关联data.txt
  3. 将三个验证码写入data.txt当中, 关闭输出流
  4. 键盘录入一个需要校验的验证码并用字符串接收
  5. 创建输入流对象关联data.txt
  6. 创建集合对象
  7. 读取data.txt 将读取到的数据存储到集合中
  8. 使用集合调用contains方法, 将需要校验的字符串传入
  9. 根据返回的结果, 打印是否存在
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class Tz01 {

	public static void main(String[] args) throws IOException {
		BufferedWriter fw = new BufferedWriter(new FileWriter("data.txt"));
		Scanner input = new Scanner(System.in);
		System.out.println("请存入三个3个字符的验证码:");
		String a = input.next();
		String b = input.next();
		String c = input.next();
		fw.write(a);
		fw.write("\r\n");		
		fw.write(b);
		fw.write("\r\n");
		fw.write(c);
		fw.write("\r\n");
		fw.flush();
		fw.close();
		
		System.out.println("请输入验证码:");
		String d = input.next();
		ArrayList<String> list = new ArrayList<String>();
		BufferedReader br = new BufferedReader(new FileReader("data.txt"));
		String line;
		while((line = br.readLine())!=null){
			list.add(line);
		}
		System.out.println("是否包含验证码:"+list.contains(d));

	}

}

2. 训练案例2

2.1. 训练描述:
需求分析:1.项目根目录下建立文件: user.txt,文件中存放用户名和登录密码,格式:用户名,密码,如:aaa,123;
2. user.txt文件中初始存放的用户信息有如下:
jack,123
rose,123
tom,123
3.要求完成如下功能:
程序运行时:控制台提示用户输入注册的用户名和密码;
验证键盘录入的用户名跟user.txt中已注册的用户名是否重复:
是:控制台提示:用户名已存在
否:将键盘录入的用户名及密码写入user.txt文件,并在控制台提示:注册成功;
2.2. 作步骤描述

  1. 键盘录入用户名和密码并用两个String变量接受
  2. 创建输入流对象关联user.txt
  3. 创建集合对象, 用于存储读取到的数据
  4. 定义boolean类型的标记flag, 假设键盘录入的用户名不存在, 默认为false
  5. 遍历集合获取到每一个数据(数据是用户名,密码的字符串, 思路不要乱)
    a) 根据逗号切割当前字符串, 获取字符串数组中0索引的用户名
    b) 拿着键盘录入的用户名和切割后的用户名逐个对比, 相同的话将flag改为true
  6. 判断flag
    a) true : 提示已经存在
    b) false: 创建输出流对象关联user.txt, 并将键盘录入的用户名和密码拼接上逗号写出.(注意尾部追加)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class Tz02 {

	public static void main(String[] args) throws IOException {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入账号:");
		String a = input.next();
		System.out.println("请输入密码:");
		String b = input.next();
		ArrayList<String> list = new ArrayList<String>();
		BufferedReader br = new BufferedReader(new FileReader("user.txt"));
		String line;
		while((line =br.readLine())!=null){
			list.add(line);
		}
		br.close();
		boolean flag = false;
		for(int i =0;i<list.size();i++){
			String s = list.get(i);
			String[] sp =s.split(",");
			if(a.equals(sp[0])){
				flag=true;
			}
		}
		if(flag){
			System.out.println("用户已存在");
		}else{
			BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt"));
			String s = a + "," +b;
			bw.write(s);
			bw.newLine();
			bw.close();
			System.out.println("注册成功!!");
		}
		
	}

}
发布了30 篇原创文章 · 获赞 10 · 访问量 874

猜你喜欢

转载自blog.csdn.net/weixin_45788152/article/details/104371985