1.IO小结
- 字节流小结:
小结:字节流可以复制任意文件数据,有4种方式,一般采取字节缓冲流一次读写一个字节数组的方式。
- 字符流小结:
小结:字符流只能复制文本数据,有5种方式,一般采用字符缓冲流的特有功能。
2.案例:集合到文件
需求:把ArrayList
集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件的一行数据。
思路:
- 创建
ArrayList
集合 - 往集合中存储字符串元素
- 创建字符缓冲输出流对象
- 遍历集合,得到每一个字符串数据
- 调用字符缓冲输出流对象的方法写数据
- 释放资源
代码:
package Study01;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
/*需求:把`ArrayList`集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件的一行数据。
思路:
- 创建`ArrayList`集合
- 往集合中存储字符串元素
- 创建字符缓冲输出流对象
- 遍历集合,得到每一个字符串数据
- 调用字符缓冲输出流对象的方法写数据
- 释放资源*/
public class ArrayListAndConversionStreamDemo {
public static void main(String[] args) throws IOException {
//- 创建`ArrayList`集合
ArrayList<String> arrayList = new ArrayList<String>();
//- 往集合中存储字符串元素
arrayList.add("hello");
arrayList.add("world");
arrayList.add("java");
//- 创建字符缓冲输出流对象
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("Study\\bd.txt"));
//- 遍历集合,得到每一个字符串数据
for (String al:arrayList){
//- 调用字符缓冲输出流对象的方法写数据
bufferedWriter.write(al);
bufferedWriter.newLine();
bufferedWriter.flush();
}
//- 释放资源
bufferedWriter.close();
}
}
3.案例:文件到集合
需求:把文本中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素。
思路:
- 创建字符缓冲输入流对象
- 创建
ArrayList
集合对象 - 调用字符缓冲输入流对象的方法读数据
- 把读取到的字符串存储到集合中
- 释放资源
- 遍历集合
代码
package Study01;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/*需求:把文本中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素。
思路:
- 创建字符缓冲输入流对象
- 创建`ArrayList`集合对象
- 调用字符缓冲输入流对象的方法读数据
- 把读取到的字符串存储到集合中
- 释放资源
- 遍历集合*/
public class ConversionStreamAndArrayListDemo {
public static void main(String[] args) throws IOException {
//- 创建字符缓冲输入流对象
BufferedReader bufferedReader = new BufferedReader(new FileReader("Study\\bd.txt"));
//- 创建`ArrayList`集合对象
ArrayList<String> arrayList = new ArrayList<String>();
//- 调用字符缓冲输入流对象的方法读数据
String line;
while ((line = bufferedReader.readLine())!=null){
//- 把读取到的字符串存储到集合中
arrayList.add(line);
}
//- 释放资源
bufferedReader.close();
//- 遍历集合
for (String s:arrayList){
System.out.println(s);
}
}
}
4.案例:点名器
需求:有一个文件里面存储了班级同学的姓名,每个名字占一行,要求通过程序实现随机点名器。
思路:
- 创建字符缓冲输入流对象
- 创建
ArrayList
集合对象 - 调用字符缓冲流输入对象的方法读数据
- 把读取到的字符串数据存储到集合中
- 释放资源
- 使用Random产生一个随机数,随机数范围在[0,集合长度)
- 把上一步的随机数作为索引到
ArrayList
集合中获取值 - 输出上一步的结果
代码:
package Study01;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
/*需求:有一个文件里面存储了班级同学的姓名,每个名字占一行,要求通过程序实现随机点名器。
思路:
- 创建字符缓冲输入流对象
- 创建ArrayList集合对象
- 调用字符缓冲流输入对象的方法读数据
- 把读取到的字符串数据存储到集合中
- 释放资源
- 使用Random产生一个随机数,随机数范围在[0,集合长度)
- 把上一步的随机数作为索引到ArrayList集合中获取值
- 输出上一步的结果*/
public class RandomRollCall {
public static void main(String[] args) throws IOException {
//- 创建字符缓冲输入流对象
BufferedReader bufferedReader = new BufferedReader(new FileReader("Study\\bd.txt"));
//- 创建ArrayList集合对象
ArrayList<String> arrayList = new ArrayList<String>();
//- 调用字符缓冲流输入对象的方法读数据
String line;
while ((line=bufferedReader.readLine())!=null){
//- 把读取到的字符串数据存储到集合中
arrayList.add(line);
}
//- 释放资源
bufferedReader.close();
//- 使用Random产生一个随机数,随机数范围在[0,集合长度)
Random random = new Random();
int index = random.nextInt(arrayList.size());
//- 把上一步的随机数作为索引到ArrayList集合中获取值
String result = arrayList.get(index);
//- 输出上一步的结果
System.out.println(result);
}
}
5. 案例:集合到文件(改进版)
需求:把ArrayList
集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据
格式:学号,姓名,年龄,居住地
举例:001,迪丽热巴,18,新疆
思路:
-
定义学生类
-
创建
ArrayList
集合 -
创建学生对象
-
往集合中存储学生对象元素
-
创建字符缓冲输出流对象
-
遍历集合,得到每一个学生对象
-
把学生对象的数据拼接成指定格式的字符串
-
调用字符缓冲输出流对象的方法写学生对象数据
-
释放资源
代码
//学生类
package Study02;
public class Student {
private int number;
private String name;
private int age;
private String address;
public Student (){
}
public Student(int number,String name,int age,String address){
this.number = number;
this.name = name;
this.age = age;
this.address = address;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package Study02;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
/*需求:把`ArrayList`集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据
格式:学号,姓名,年龄,居住地
举例:001,迪丽热巴,18,新疆
思路:
- 定义学生类
- 创建`ArrayList`集合
- 创建学生对象
- 往集合中存储学生对象元素
- 创建字符缓冲输出流对象
- 遍历集合,得到每一个学生对象
- 把学生对象的数据拼接成指定格式的字符串
- 调用字符缓冲输出流对象的方法写学生对象数据
- 释放资源*/
public class ArrayListToConversionStream {
public static void main(String[] args) throws IOException {
//- 创建`ArrayList`集合
ArrayList<Student> arrayList = new ArrayList<Student>();
//- 创建学生对象
Student s1 = new Student(001,"小明",18,"浙江杭州");
Student s2 = new Student(002,"小艾",19,"浙江宁波");
Student s3 = new Student(003,"小果",20,"浙江温州");
Student s4 = new Student(004,"小磊",21,"浙江义乌");
//- 往集合中存储学生对象元素
arrayList.add(s1);
arrayList.add(s2);
arrayList.add(s3);
arrayList.add(s4);
//- 创建字符缓冲输出流对象
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("Study\\bw.txt"));
//- 遍历集合,得到每一个学生对象
for (Student s:arrayList){
//- 把学生对象的数据拼接成指定格式的字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("学号:");
stringBuilder.append(s.getNumber());
stringBuilder.append(" 姓名:");
stringBuilder.append(s.getName());
stringBuilder.append(" 年龄:");
stringBuilder.append(s.getAge());
stringBuilder.append(" 地址:");
stringBuilder.append(s.getAddress());
String result = stringBuilder.toString();
//- 调用字符缓冲输出流对象的方法写学生对象数据
bufferedWriter.write(result);
bufferedWriter.newLine();
}
//- 释放资源
bufferedWriter.close();
}
}
6.案例:文件到集合(改进版)
需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值。
举例:oo1,迪丽热巴,18,新疆
思路:
- 定义学生类
- 创建字符缓冲输入流对象
- 创建
ArrayList
集合对象 - 调用字符缓冲输入流对象的方法读数据
- 把读取到的字符串数据用split()进行分割,得到一个字符串数组
- 创建学生对象
- 把字符数组中的每一个元素取出来对应赋值给学生对象的成员变量值
- 把学生对象添加到集合
- 释放资源
- 遍历集合
代码
//student类
package Study03;
public class Student {
private int number;
private String name;
private int age;
private String address;
public Student (){
}
public Student(int number,String name,int age,String address){
this.number = number;
this.name = name;
this.age = age;
this.address = address;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package Study03;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/*需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值。
举例:oo1,迪丽热巴,18,新疆
思路:
- 定义学生类
- 创建字符缓冲输入流对象
- 创建`ArrayList`集合对象
- 调用字符缓冲输入流对象的方法读数据
- 把读取到的字符串数据用split()进行分割,得到一个字符串数组
- 创建学生对象
- 把字符数组中的每一个元素取出来对应赋值给学生对象的成员变量值
- 把学生对象添加到集合
- 释放资源
- 遍历集合*/
public class ConversionStreamToArrayList {
public static void main(String[] args) throws IOException {
//- 创建字符缓冲输入流对象
BufferedReader bufferedReader = new BufferedReader(new FileReader("Study\\bw.txt"));
//- 创建`ArrayList`集合对象
ArrayList<Student> arrayList = new ArrayList<Student>();
//- 调用字符缓冲输入流对象的方法读数据
String line;
while ((line=bufferedReader.readLine())!=null){
//- 把读取到的字符串数据用split()进行分割,得到一个字符串数组
String[] result = line.split(",");
//- 创建学生对象
Student student = new Student(Integer.parseInt(result[0]),result[1],Integer.parseInt(result[2]),result[3]);
//- 把学生对象添加到集合
arrayList.add(student);
}
//- 释放资源
bufferedReader.close();
//- 遍历集合
for (Student s:arrayList){
System.out.println(s.getNumber()+","+s.getName()+","+s.getAge()+","+s.getAddress());
}
}
}
//- 创建学生对象
Student student = new Student(Integer.parseInt(result[0]),result[1],Integer.parseInt(result[2]),result[3]);
//- 把学生对象添加到集合
arrayList.add(student);
}
//- 释放资源
bufferedReader.close();
//- 遍历集合
for (Student s:arrayList){
System.out.println(s.getNumber()+","+s.getName()+","+s.getAge()+","+s.getAddress());
}
}
}