一、概述
1、IO流:即InputOutput的缩写。
2、特点:
1)IO流用来处理设备间的数据传输。
2)Java对数据的操作是通过流的方式。
3)Java用于操作流的对象都在IO包中。
4)流按操作数据分为两种:字节流和字符流。
5)流按流向分为:输入流和输出流。
注意:流只能操作数据,而不能操作文件。
3、IO流的常用基类:
1)字节流的抽象基流:InputStream和OutputStream
2)字符流的抽象基流:Reader和Writer
二、字符流a、字符流中的对象融合了编码表。使用的是默认的编码,即当前系统的编码。
b、字符流只用于处理文字数据,而字节流可以处理媒体数据。
2、字符流的读写
a、创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将被覆盖。其 实该步就是在明确数据要存放的目的地。
b、调用write(String s)方法,将字符串写入到流中。
c、调用flush()方法,刷新该流的缓冲,将数据刷新到目的地中。
d、调用close()方法,关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。
3、字符流的缓冲区——BufferedReader和BufferedWriter
a、缓冲区的出现:提高了流的读写效率,所以在缓冲区创建前,要先创建流对象。即先将流对象初始化到构造函数中。
b、缓冲技术原理:此对象中封装了数组,将数据存入,再一次性取出。
c、写入流缓冲区BufferedWriter的步骤:
1)创建一个字符写入流对象。
2)为了提高字符写入流效率。加入缓冲技术。只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
3)调用write方法写入数据到指定文件
4)其实关闭缓冲区,就是在关闭缓冲区中的流对象。
三、字节流
1、概述
a、字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。
b、由于媒体文件数据中都是以字节存储的,所以,字节流对象可直接对媒体文件的数据写入到文件中,而可以不用再进行刷流 动作。
c、读写字节流:InputStream 输入流(读)
OutputStream 输出流(写)
d、为何不用进行刷流动作:
因为字节流操作的是字节,即数据的最小单位,不需要像字符流一样要进行转换为字节。所以可直接将字节数据写入到指定 文件中。
e、InputStream特有方法:
int available();//返回文件中的字节个数
字节流缓冲区
同样是提高了字节流的读写效率。
a、读写特点:
read():会将字节byte型值提升为int型值
write():会将int型强转为byte型,即保留二进制数的最后八位。
b、原理:将数据拷贝一部分,读取一部分,循环,直到数据全部读取完毕。
四、键盘输入
1、标准输入输出流
System.in:对应的标准输入设备,键盘。
Ssytem.out:对应的是标准的输出设备,控制台。
System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的子类FilterOutputStream的子类。
2、整行录入
当使用输入流进行键盘录入时,只能一个字节一个字节进行录入。为了提高效率,可以自定义一个数组将一行字节进行存 储。当一行录入 完毕,再将一行数据进行显示。这种正行录入的方式,和字符流读一行数据的原理是一样的。也就 是readLine方法。
3、转换流
3.1 转换流的由来:
a、字符流与字节流之间的桥梁
b、方便了字符流与字节流之间的操作
转换流的应用:
字节流中的数据都是字符时,转成字符流操作更高效。
3.2 InputStreamReader将字节流通向字符流
a、获取键盘录入对象。
InputStream in=System.in;
b、将字节流对象转成字符流对象,使用转换流。
InputStreamReaderisr=new InputStreamReader(in);
c、为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
BufferedReaderbr=new BufferedReader(isr);
键盘录入最常见写法
BufferedReaderin=new BufferedReader(new InputStreamReader(System.in));
3.3 OutputStreamWriter字符流通向字节流
字符通向字节:录入的是字符,存到硬盘上的是字节。步骤和InputStreamReader转换流一样。
IO流代码如下:
package arrDamo;
/*
用键盘输入五个学生的信息,信息包括学生的姓名和三门课程的成绩
学生格式如:zhangsan,40,56,67并计算出总分
再把学生信息并按总分的高低来排序,写入到一个文本文件中
*/
import java.io.*;
import java.util.*;
//实现Comparable,好让Student按自定义来排序
class Student implements Comparable<Student>
{
String name;
int ma;
int en;
int ch;
int sum;
//初始化
Student(String name,int ma,int en,int ch)
{
this.name=name;
this.ma=ma;
this.en=en;
this.ch=ch;
sum=ma+en+ch;
}
//复写compareTo类,自定义排序
public int compareTo(Student st)
{
int num = new Integer(this.sum).compareTo(new Integer(st.sum));
if(num==0)
{
return this.name.compareTo(st.name);
}
return num;
}
public String getName()
{
return name;
}
public int getSum()
{
return sum;
}
//复写hashCode()方法
public int hashCode()
{
return name.hashCode()+sum*45;
}
//复写equals(Object obj)方法
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("obj不属于学生");
Student stu = (Student)obj;
return this.name.equals(stu.name)&&this.sum==stu.sum;
}
//返回学生信息
public String StudentToString()
{
return "student("+name+","+ma+","+en+","+ch+")";
}
}
class StudentWrite
{
public static Set<Student> method_1()
{
System.out.println("请输入学生信息:");
//将从键盘输入的数据存到缓冲区长
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//创建一个TreeSet集合
Set<Student> set = new TreeSet<Student>();
//把学生信息存到集合中
String line=null;
try {
while((line=br.readLine())!=null)
{
//假如输入的是over,就结束
if("over".equals(line))
break;
//将键盘输入的数据按逗号来切割,组成一个字符串数组
String[] str=line.split(",");
//创建学生对象,并初始化
Student stus = new Student(str[0],Integer.parseInt(str[1])
,Integer.parseInt(str[2])
,Integer.parseInt(str[3]));
//将学生存到TreeSet集合中
set.add(stus);
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
//关闭流
if(br!=null)
br.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//返回Set集合
return set;
}
public static void method_2(Set<Student> sets)
{
//创建一个目的文件
File file=new File("D:\\student.txt");
//把TreeSet集合中的数据写到目的文件中
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file));
for(Student s:sets)
{
bw.write(s.StudentToString()+"\t");
bw.write(s.getSum()+"");
bw.newLine();
bw.flush();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
//关闭流
if(bw!=null)
bw.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public class StudentInfoDemo
{
public static void main(String[] args) throws Exception
{
//获取一个Set集合
Set<Student> se = StudentWrite.method_1();
//调用method_2(se)方法
StudentWrite.method_2(se);
}
}