1.字节流 字符流 2.read() 3.-1 4.System.out 5.InputStream 6.OutputStream
1.IO流按流向分为输入流和输出流,即输入流和输出流都属于IO流。输入流是将数据从硬盘读到内存中,输出流是将数据从内存写到内存中。
IO流按操作类型分为字节流和字符流,字节流和字符流都属于IO流。字节流可以操作任何数据,因为在计算机中任何类型的数据都是以字节存储的。字符流只能操作纯字符数据。字节流直接与数据产生交互,而字符流是将字符转成字节从硬盘读到内存中再将字节转成字符写到内存中。
2.FileInputStream和FileOutputStream:FileInputStream的read()方法一个从文件中读一个字节,返回给程序一个字节,读取文件的次数多,效率低;FileOutputStream的write()方法一次向文件中写入一个字节,写出文件的次数多,效率低。
BufferedInputStream和BufferedOutputStream:BufferedInputStream内置一个缓冲区(数组),BufferedInputStream会一次性从文件中读取8192个字节存在缓冲区中,返回给程序一个,直到缓冲区中所有的都被使用过,才会从文件中重新读取8192个;BufferedOutputStream也内置一个缓冲区(数组),程序向流中写出字节时,会先写到缓冲区中,直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。
FileReader和FileWriter:FileReader的read()方法可以先读取到字节文件再转为字符,FileWriter的write()方法可以自动将字符转为字节写出。
BufferedReader和BufferedWriter:BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区,然后逐个返回给程序降低读取文件的次数,提高效率。BufferedWriter的write()方法写出字符时会先写到缓冲区,缓冲区写满时会写到文件,降低写文件的次数,提高效率。
InputStreamReader和OutputStreamWriter:可以使用指导码表读取和写出文件,InputStreamReader是从字节流到字符流的桥梁(in,charset),OutputStreamWriter是从字符流到字节流的桥梁(out,charset)
3.缓冲流的优点是降低了读取和写入文件的次数,提高了效率。缓冲流是在流中内置一个缓冲区,当程序读取文件或向程序写入文件时,必须等到缓冲区满了之后一次性读取或写入,这样便降低了读取和写入文件的次数。
package com.zuikc.kehoutest; public class Test7 { /* * 需求:实现字符串和字节数组之间的相互转换。必如将字符串“北京最课程bjzkc”转换为字节数组,并将字节数组再转换回字符串。 */ public static void main(String[] args) { String str = "北京最课程bjzkc"; byte[] arr = str.getBytes(); System.out.println(arr); String str2 = new String(arr); System.out.println(str2); } }
package com.zuikc.kehoutest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Test8 { /* * 需求:分别使用文件流和缓冲流复制一个长度大于100MB的视频文件,并观察效率的差异。 */ public static void main(String[] args) throws IOException { // demo1(); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("教父.rmvb")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("xxx.rmvb")); int b; while((b = bis.read()) != -1) { bos.write(b); } bis.close(); bos.close(); } private static void demo1() throws FileNotFoundException, IOException { FileInputStream fis = new FileInputStream("教父.rmvb"); FileOutputStream fos = new FileOutputStream("xxx.rmvb"); int b; while((b = fis.read()) != -1) { fos.write(b); } fis.close(); fos.close(); } }
package com.zuikc.kehoutest; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Test9 { /* * 需求:使用IO包中的类读取D盘上exam.txt文本文件的内容,每次读取一行内容,将每行作为一个输入放入ArrayList的泛型集合中并将集合中的内容使用加强for进行输出显示。 */ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("D:\exam.txt")); ArrayList<String> list = new ArrayList<>(); String line; while((line = br.readLine()) != null) { list.add(line); } for (String string : list) { System.out.println(string); } } }
package com.zuikc.bean; public class Student implements Comparable<Student>{ private int id; private String name; private int age; public Student() { super(); // TODO Auto-generated constructor stub } public Student(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Student s) { return this.age - s.age; } } package com.zuikc.kehoutest; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; public class Test10 { /*需求: * 由控制台按照固定格式输入学生信息,包括学号,姓名,年龄信息,当输入的内容为exit退出; * 将输入的学生信息分别封装到一个Student对象中,再将每个Student对象加入到一个集合中,要求集合中的元素按照年龄大小正序排序; * 最后遍历集合,将集合中学生信息写入到记事本,每个学生数据占单独一行。 */ public static void main(String[] args) throws IOException { HashSet<Student> hs = new HashSet<>(); Scanner sc = new Scanner(System.in); System.out.println("请输入学生信息(学号#姓名#年龄):"); while(true) { String line = sc.nextLine(); if ("quit".equals(line)) { break; } String[] info = line.split("#"); Student stu = new Student(Integer.parseInt(info[0]), info[1],Integer.parseInt(info[2])); hs.add(stu); } BufferedWriter bw = new BufferedWriter(new FileWriter("stu.txt")); Iterator<Student> it = hs.iterator(); while (it.hasNext()) { String info2 = it.next().toString(); bw.write(info2); bw.newLine(); } bw.close(); } }