java基础-IO流
一.流的定义
流是来读取数据的。流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出
二.流的分类
1.可以根据类型分为字节流和字符流
2.可以根据方向分为输入流和输出流
所有的输入流和输出流都是站在 程序的角度来看的。
三. 流的基本操作
* 将小写变成大写
* 1:将键盘录入打印到控制台
* 源 键盘录入 目标 控制台
* 源 是纯文本 FileWriter 目标 是 FileReader
* 是否需要缓冲区增强 是 BufferedWriter 目标 BufferedReader
*
* 2:将一个文件内容打印到控制台
源 是文件 目标 控制台
System.out
BufferedReader BufferedWriter(OutputStreamWriter(System.out))
* 3:将键盘录入写入一个文件
System.in 硬盘文件
字符
BufferedReader(InputStreamReader(System.in)) BufferedWriter
* 4:将一个文件的内容拷贝到另外一个文件
* 源 硬盘文件 目标 也是硬盘文件
* 不是纯文本 FileOutputStream
FileInputStream FileOutputStream
* 是否需要增强 是
BufferedInputStream BufferedOutputStream
5:将一个gbk文本拷贝到另外一个文件,那个文件的编码是utf-8
源 目标 文件 纯文本 FileReader FileWriter
BufferedReader
BufferedWriter
如果牵涉到编码,必然要转换流
文件字节流-----通过转换流来改变编码-----转换为字符流来使用
FileInputStream----InputStreamReader(fis,"gbk")----BufferedReader(is)
FileOutputStream-----OutputStreamWriter(fos,"utf-8")---BufferedWriter(os)
InputStreamReader
OutputStreamWriter
//将4字节内容拷贝完后,变成了6字节 原因是utf-8表示汉子是三字节 gbk是两个字节
紫霞
gbk
1100 1100 0011 0011 **** 0000 1111 0000 1111
1100 1100 0011 0011 0000 1111
utf-8
0000 0000 1100 1100 0011 0011 **** 0000 0000 0000 1111 0000 1111
BufferedWriter bw2=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/mm1.txt"),"utf-8"));
6: File
File file=new File("d:/testDemo.txt");
File file2=new File("d:/helloFile");
System.out.println(file.createNewFile());
System.out.println(file2.mkdir());
String[] fileStrings=file2.list();
for (String string : fileStrings) {
System.out.println(string);
}
四,流的使用
FileReader fr=new FileReader("mm.txt");//给对应文件创建一个输入流用来读文件
读出的第一种方式---将字符一个一个读出来
num=fr.read();//如果读到-1说明内容已经读完
while(true){
int ch=fr.read();
if(ch==-1)
break;
System.out.println((char)ch);
}
读出的第二种方式----将字符读入一个数组
/这个数组的长度一般设置为1024的整数倍
//此处因为char一个是2字节,所以此处表示2k
char[] ch=new char[1024];
fr.read(ch,0,ch.length);//根据内容的长度来写入数组
new String(ch,0,num)
char[] ch=new char[1024];//数组一般定义大小为1024整数倍,一般1--2K
int len=0;
while((len=fr.read(ch,0,ch.length))!=-1){
System.out.println(new String(ch,0,len));
}
4.1文件的copy
使用字节流来操作

FileInputStream和FileOutputStream这两个流都是字节流,都是以一个字节为单位进行输入和输出的。所以对于占用2个字节存储空间的字符来说读取出来时就会显示成乱码。
使用字符流来操作

FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。所以读取和写入占用2个字节的字符时都可以正常地显示出来,以上是以File(文件)这个类型为例对节点流进行了讲解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数据。
4.2java中提供了一种减少对磁盘的访问次数使用了一种缓冲区。即也就是缓冲流。java中有4中类型的缓冲流
BufferedReader、BufferWriter、BufferInputStream、BufferOutputStream

4.3.转换流(InputStreamReader、OutputStreamWriter)
转换流非常的有用,它可以把一个字节流转换成一个字符流,转换流有两种,一种叫InputStreamReader,另一种叫OutputStreamWriter。InputStream是字节流,Reader是字符流,InputStreamReader就是把InputStream转换成Reader。OutputStream是字节流,Writer是字符流,OutputStreamWriter就是把OutputStream转换成Writer。把OutputStream转换成Writer之后就可以一个字符一个字符地通过管道写入数据了,而且还可以写入字符串。我们如果用一个FileOutputStream流往文件里面写东西,得要一个字节一个字节地写进去,但是如果我们在FileOutputStream流上面套上一个字符转换流,那我们就可以一个字符串一个字符串地写进去。

如果使用转化流之后,就可以以字符串的形式写入到一个指定的文件中。提高了写入的速度,也减少了对磁盘的访问次数。
如何使读取文件中的内容的时候读取的速度快,可以使用缓冲流。就可以调用readLine()方法。
五、流的总结


浙公网安备 33010602011771号