字节流
读取数据是文件的二进制数据,不会对这个二进制进 行任何处理,直接以二进制的方式。
字符流读取数据是以字符为单位的,字符串也是读取到二进制数据,然后会把二进制数据进行编码或者解码。
字符流=字节流+解码·编码
输入流(Inputstream) 数据的读入
使用步骤:
1:目标(确定读取文件位置)
2:建立传输的通道
3:读取文件的数据
4:关闭资源;
使用字节流写入中文:
字节流之所以写入中文是因为它借助字符串的getbyte()z这个方法,一个一个字节的读取文件转为char,会出现乱码,是因为在gbk编码中占用两个字节。
字符输出流:
FileWrite的内部也是维护了一个1024字符的字符数组。当写入数据到磁盘的时候,实际上这个类是先将这个数据写入到了内部维护的1024个字符的数组中。
以下三种情况才会真的将内部维护的数组中的数据写入到磁盘。
1 数据存满了,也就是1024个字符。
2 FileWrite的对象,调用了flush方法。
3 或者关闭资源的时候,直接存储。
输出流 outputstream Fileoutputstream
将内存数据写入到硬盘中
使用步骤:
1:找到目标文件(写入文件的位置)
2:建立数据传输通道(FileoutputStream)
3:传输数据 把数据转化为字节数组,然后用Fileoutputstream这个类的对象写入到文件。
4:关闭资源
当使用Fileoutputstream的Write(int b)来写入数据的时候,接受数据类型虽然是int类型但是实际上只能给写出一个字节的数据(8个位的数据)是把int类型的低八位数据写出,舍弃前面的24位数据。
使用Fileoutputstream类写入数据到磁盘的时候,如果目标存在,那么写入的时候会先清空文件中原本的数据,然后在写入数据(会覆盖原本的内容)。
如果我们不想覆盖这个已经存在的文件的内容,那么我们可以用Fileoutputstream(File file.boolean.append)构造输出流对象。
import java.io.BufferedInputstream;
import java.io.FileinputStream;
import java.io.File;
import java.io.IOException;
public class Demo
public static void main(Sting[]args)throws IOException{
readTest();
}
public static void readTset()throws IOException{
File file=new file("E:/dm");//找到目标文件;
FileInputstream fileInputstream=new FileInputstream(file);//建立数据传输通道
BufferedInputstream bufferedInputstream=new BufferedInputstream(fileInputstream);//准备用BufferInputstream读取数据
byte[]b=new byte[1024];//读取缓冲数组的方式
int length=0;
while((length=bufferedInputstream.read(b))!=-1){
System.out.print(new String(b,0,length));
}
BufferedInputStream.close();//关闭资源
}
}
缓冲输入流
Object:InputStream FielInputStream BufferedInputstream
缓冲输入流
Object:OutputStream Fileoutstrem BufferedOutputStream
因为读取文件的数据,使用缓冲数组,结合循环的方式,效率更高。
缓冲输入字节流更高效的读取文件。
底层实现:它的底层是维护了一个8kb大小的字节数组来实现更高效率的读取数据。
使用步骤:
1找到目标文件(要读取的数据)
2建立数据传输通道
3建立缓冲输入字节流对象来读取数据
4 关闭资源
实际上BufferedInputstream这个类的对象,本身并不具备读取数据和关闭资源的能力,是靠构造这个对象提供给他们的FileInputStrem对象实现的。