IO流小结
思维导图
遇到的问题
1权限问题
刚开始学习文件创建一直会出现创建文件失败的权限问题,写明路径也没有用。最后通过相对路径和分盘解决了问题
2读和写无法明确
其实说实在的IO主要就是源和目的(读和写)分清需求然后根据具体的操作情况选择字符/字节/特殊操作流(标准输入流和序列化 流)。
3遍历问题
首先重温一下遍历方式(复习)
//字节缓冲输入流:BufferedInputStream(InputStream in)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myByteStream\\bos.txt"));
//一次读取一个字节数据
// int by;
// while ((by=bis.read())!=-1) {
// System.out.print((char)by);
// }
//一次读取一个字节数组数据
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
bis.close();
简单聊一下我遇到的问题:
读取字节数组时候没有把创建的数组写进bis.read()里导致运行出错,而且很小的一个漏洞要花挺长时间去纠错和查找问题在哪里。
比较有意思的课后练习
package 课后作业;
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class test3 {
public static void main(String[] args) throws IOException {
/*3.用代码实现以下需求
(1)定义学生类,包含姓名(String name),性别(String gender),年龄(int age)三个属性,生成空参有参构造,set和get方法,toString方法
(2)键盘录入6个学员信息(录入格式:张三,男,25),要求有两个相同的信息,将6个学员信息存入到ArrayList集合中
(3)将存有6个学员信息的ArrayList集合对象写入到D:\\StudentInfo.txt文件中
(4)读取D:\\StudentInfo.txt文件中的ArrayList对象
(5)对ArrayList集合中的6个学生对象进行去重并按照年龄从小到大的顺序排序
(6)将ArrayList集合中排序后的结果利用PrintWriter流写入到E:\\StudentInfo.txt文件中(写入格式:张三-男-25)*/
// File file = new File( "src\\StudentInfo.txt" );
//(2)键盘录入6个学员信息(录入格式:张三,男,25),要求有两个相同的信息,将6个学员信息存入到ArrayList集合中
// Scanner sc = new Scanner( System.in );
ArrayList<Student> array = new ArrayList<>();
for (int i = 0; i < 6; i++) {
addStudent( array );
}
removeAndSort( array );
writerToFile( array );
}
public static void addStudent(ArrayList<Student>array)throws IOException{
Scanner sc = new Scanner( System.in );
System.out.println("请输入学生姓名");
String name = sc.nextLine();
System.out.println("请输入学生性别");
String gender = sc.nextLine();
System.out.println("请输入学生年龄");
int age = sc.nextInt();
//赋值
Student s =new Student();
s.setName( name );
s.setGender( gender );
s.setAge( age );
//添加到集合
array.add( s );
//将有学员信息的集合对象写入文件
FileWriter fw = new FileWriter( new File( "src\\StudentInfo.txt" ) );
for (Student ss : array){
fw.write( String.valueOf( ss ) );
fw.flush();
}
System.out.println( "复制完毕" );
fw.close();
}
//对ArrayList集合中的6个学生对象进行去重并按照年龄从小到大的顺序排序
private static ArrayList<Student> removeAndSort(ArrayList<Student> array) {
//创建TreeSet集合对象使用比较器排序,去重
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge();
return num;
}
});
ts.addAll(array);
array.clear();
array.addAll(ts);
System.out.println("去重排序后:");
for (Student st : array) {
System.out.println(st);
}
return array;
}
//将存有6个学员信息的ArrayList集合对象写入到StudentInfo.txt文件中
private static void writerToFile(ArrayList<Student> array) throws IOException {
//由于Stduent是一个对象,那么存入文件就需要使用对象序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\StudentInfo.txt" , true));
oos.writeObject(array);
oos.close();
}
}
package 课后作业;
import java.io.Serializable;
public class Student implements Serializable {
//定义学生类,包含姓名(String name),性别(String gender),年龄(int age)三个属性,
// 生成空参有参构造,set和get方法,toString方法
private String name;
private String gender;
private int age;
public Student(){}
public Student(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
}
注:写的比较粗略只是实现了基本的功能练习了几种流的结合用法,操作中遇到了一些方法需求过于繁杂所以通过了另外写方法来实现需求提高代码复用性(容易在细枝末节写错分开方法来进行修改能够提高效率)。
以上,关于IO流学习小结