一、流的概念
1.流:指计算机各部件之间的数据流动。是由位(Bit)组合或字符(Character)构成的序列。
2.流的划分:字节流和字符流
- 字节流:处理字节数据(基本类型InputStream、OutputStream)
每次读取8位二进制数。 - 字符流:处理字符数据(基本类型Reader、Writer)
每次读写16位二进制数。 3.输入输出流: - 输入流(Input Stream):将数据从外设或外存传递到应用程序的流。
- 输出流(Output Stream):将数据从应用程序传递到外设或外存的流。
注意对于输入流只能读取数据而不能写入数据,对于输出流只能写入数据而不能读取数据。
理解:输入流是从外设传递到应用程序的,所以在应用程序上你只可以读,输出流是从应用程序传递到外存或外设所以你只可以写,写到外设或外存上。
4.采用数据流输入输出的目的:使得程序的输入输出操作独立于相关设备。增强程序的可移植性。
5.流是输入输出的特点:数据的获取和发送是沿着数据序列顺序进行的。
6.缓冲流:为一个流配有一个缓冲区(Buffer),当一个流发送或接受数据时不是直接接受或发送的,是会有个缓冲区来临时存放数据,当数据满了再一起传递,目的是比边接收边传递效率高很多。
二、输入输出类库
InputStream、OutputStream、Reader、Writer是抽象类。所以只能实例化使用。其中InuputStream和OutputStream是处理位流的,这种流通常处理图片、音频之类的二进制数据,即二进制文件。
Reader和Writer用来处理字符流,即文本文件。
1.InputStream与OutputStream
- InputStream:从输入流读数据(键盘的输入等读入数据)
- OutputStream:向输出流写入数据(向外设如屏幕、或者磁盘文件等输出数据)
补充:Java键盘读入的两种常用方式(java是以字符串的方式输入的)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26//方式一
String str;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
str=buf.readLine();//读取字符串
str=buf.read();//读取单个字符
..........
//方式二
Scanner reader=new Scanner(System.in);
参数类型 参数名;
参数名 = reader.next参数类型();
举个例子
double num;
num=reader.nextDouble();//输入一个double型的数据
或者
String str;
str=reader.next();
str=reader.nextLine();
都是读取字符串
(1)文件输入输出流:FileInputStream和FileOutputStream
- FileInputStream:表示一个文件字节输入流,从中可以读取一个字节或一批字节
- FileOutputStream:表示一个文件字节输出流,可向流中写入一个字节或一批字节
说明以下File是java.io包中定义的一个类,其每个对象表示一个磁盘文件或文件夹。
1 | //创建一个文本文件,写入字符串后,读取其中的字符串 |
注意:上面都要进行异常捕获,否则不能编译
再来看个例子,用FileInputStream和FileOutputStream实现对二进制图像文件复制1
2
3
4
5
6
7
8
9
10FileInputStream fin=new FileInputStream("F:\\zx\\1.jpg");
FileOutputStream fout=new FileOutputStream("F:\\zx\\12.jpg");
byte[] b=new byte[fin.available()];//创建数组来存放图片数据
fin.read(b);//读
fout.write(b);//写
fin.close();
fout.close();
同理,也可以复制文件,但不推荐这么做。
(2)顺序输入流
SequenceInputStream是InputStream类的直接子类,其功能是将多个输入流顺序接在一起。
(3)管道输入输出流
管道字节输入流PipedInputStream和管道字节输出流PipedOutputStream类提供了利用管道方式进行数据输入输出管理的类。其中输入流作为管道的接收端,输出流作为管道的发送端。其可以用来将一个程序或线程的输出连接到另外一个程序或线程作为输入,来实现数据交换或不同线程间的通信。
(4)过滤输入输出流
FilterOutputStream与FilterInputStream,它们又分别派生出DataInputStream和DataOutputStream类,它的主要功能是可以进行不同数据格式间的转换。
(5)标准输入输出流1
2
3
4
5System.in 标准输入流
System.in.read();
System.out 标准输出流
System.out.print();
2.Reader和Writer流类
Reader流和Writer流是用来处理字符流的,也就是文本文件。
(1)使用FileReader类读取文件1
2
3
4
5
6char c[]=new char[500];
FileReader fr=new FileReader("F:\\zx\\1.txt");
int num=fr.read(c);//读入数据到数组c内,并返回读取的字符数
String str=new String(c,0,num);//将数组转化为字符串,从下标0开始读
fr.close();
(2)使用FileWriter类写入文件1
2
3
4
5FileWriter fw=new FileWriter("F:\\zx\\1.txt");
String str="1235464646464";
fw.writer(str);
fw.close();
(3)使用BufferedReader类读取文件
BufferedReader类是将数据读到到缓冲区的
使用BufferedReader之前,必须创建FileReader对象。1
2
3
4
5
6
7
8
9String str;
FileReader fr=new FileReader("F:\\zx\\1.txt");
BufferedReader bfr=new BufferedReader(fr);
while((str==bfr.readLine())!=null)//每次读取一行,直到文件结束
{
System.out.println(str);
}
bfr.close();
(4)使用BufferedWriter类写入文件
使用BufferedWriter之前,必须创建FileWriter对象。
由于BufferedWriter类是将数据写入到缓冲区的,所以需要用flush()清空缓冲区。1
2
3
4
5
6
7
8
9
10
11
12
13
14//利用缓冲区输入输出流进行文件复制
String str=new String();
BufferedReader in=new BufferedReader(new FileReader("F:\\zx\\1.txt"));//读文件
BufferedWriter out=new BufferedWriter(new FileWriter("F:\\zx\\12.txt"));//写文件
while((str=in.readLine())!==null){
out.write(str);
out.newLine();//写入换行符
}
out.flush();
in.close();
out.close();
注意:用Scanner获得用户的输入非常的方便,但是Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键 时,Scanner就会返回下一个输入。所以为了使用空格时我们最好用BufferedReader
BufferedReader比Scanner的效率要高,由于Scanner要进行正则解析,BufferedReader则是读取字符序列。