文章目录
一、 基础案例
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. 操作步骤描述
- 创建BufferedReader输入流对象关联源文件
- 创建BufferedWriter输出流对象关联目标文件
- 调用readLine方法不断的读取,只要不等于null 说明没有读取完毕
- 调用writer方法直接写出字符串,但是要加上newLine方法手动换行
- 关闭流释放资源
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. 操作步骤描述
分析:
- 创建Student类,用于封装数据
- 创建集合对象,将学生对象添加到集合中
- 创建输出流对象关联stuInfo.txt文件
- 遍历集合对象获取到每一个Student, 再用StringBuilder拼接成指定的格式并写出
- 关闭输出流对象
- 创建BufferedReader输入流对象关联stuInfo.txt, 因为有读取一行的方法
- 创建集合对象用于存储读取到的Student(也可以将原集合清空)
- 将读取到的每一行数据通过split方法切割,再将切割后的信息封装成Student对象
- 将学生对象添加到集合中
- 关闭输入流对象
- 遍历集合并打印
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. 操作步骤描述
- 键盘录入三个验证码用字符串接收
- 创建输出流对象关联data.txt
- 将三个验证码写入data.txt当中, 关闭输出流
- 键盘录入一个需要校验的验证码并用字符串接收
- 创建输入流对象关联data.txt
- 创建集合对象
- 读取data.txt 将读取到的数据存储到集合中
- 使用集合调用contains方法, 将需要校验的字符串传入
- 根据返回的结果, 打印是否存在
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. 作步骤描述
- 键盘录入用户名和密码并用两个String变量接受
- 创建输入流对象关联user.txt
- 创建集合对象, 用于存储读取到的数据
- 定义boolean类型的标记flag, 假设键盘录入的用户名不存在, 默认为false
- 遍历集合获取到每一个数据(数据是用户名,密码的字符串, 思路不要乱)
a) 根据逗号切割当前字符串, 获取字符串数组中0索引的用户名
b) 拿着键盘录入的用户名和切割后的用户名逐个对比, 相同的话将flag改为true - 判断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("注册成功!!");
}
}
}