IO概述:
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
2.字节流:
1.向文件中写字节:FileOutputStream
a.使用步骤:
1.创建 FileOutputStream 流对象,关联文件路径
2.利用write()方法向关联的文件中写入内容
3.关流释放流对象占用的系统底层资源
b.案例:
FileOutputStream fos = new FileOutputStream("c:\\a.txt");//创建FileOutputStream流对象关联c:\\a.txt
//如果指定的路径文件已经存在,清空文件内容
//如果指定的路径不存在,创建新的空文件
fos.write(97);//将97字节写入a.txt,但是a.txt,使用GBK码表(支持ASCII码表)
//显示的是a
byte[] bytes = {65,66,67,68};
fos.write(bytes);//批量字节的写入
//写字节数组的一部分,开始索引,写几个
fos.write(bytes, 1, 2);//部分字节写入,66,67字节写入
fos.write("hello".getBytes());//将字符串按照平台默认码表(GBK)转换为字节写入
//a.txt在按照gbk码表查找出每个字节对应的字符
fos.close();//关闭资源
2.读取文件中的字节:FileInputStream
a.使用步骤:
1.创建FileInputStream 流对象,关联文件的路径
2.利用read()方法从流关联的文件中读取内容(文件必须存在,否则报错)
3.关流释放流对象占用的系统底层资源
b.案例:
FileInputStream fis = new FileInputStream("c:\\a.txt");
byte[] b = new byte[1024];//定义一个缓冲区(字节数组),我们一般开辟1024的整数倍
int len = 0 ;
while( (len = fis.read(b)) !=-1){//从a.txt中读取尽可能多的字节(读取的字节数<=1024),装到b的字节数组中,返回当前读到的有效字节个数
System.out.print(new String(b,0,len));//将b字节数组中从0索引开始,len个字节按照平台默认的码表转换为字符串
}
fis.close();
3.字符流:
a.码表概念:
ASCII码表:占用一个字节,第一位为0,用的后七位(0xxx xxxxx)表示单个字符:'a','b'...
Unicode码表:囊括了各国的字符,每个字符都使用两个字节表示
UTF-8码表:囊括了各国的字符,但是为了节省空间(ASCII码用1个字节表示,文字用2个或2个字节以上表示)
UTF-8使用变长字节表示字符,范围1~4个字节
ISO8859-1:占用一个字节,第一位为1,用的后七位(1xxx xxxx)表示拉丁字符
没有中文字符的对照关系
gb2312:所有的字符占用两个字节,该码表表示的是中文与字节的对应关系
gbk:所有的字符占用两个字节,该码表表示的是中文与字节的对应关系,gbk表示的中文更多,gb2312的增强版
编码:将文字转为数字 "a".getBytes()=>{97}
解码:将数字转为文字 new String({97,98,99})=>"abc"
注意:以上所有的码表都包含ASCII码表
b.向文本文件中写字符:FileWriter
FileWriter fw = new FileWriter("c:\\1.txt");
//写1个字符
fw.write(100);
fw.flush();//为什么需要flush()?=>FileWriter底层使用了Writer类的缓冲区(长度为1024的字符数组)
//fw.Write(100)对应的将'd'字符写入到字符数组中,在调用flush()将
//字符数组中的内容刷新FileWriter关联的1.txt中
//只要将数据写到缓冲区中就需要刷新,将缓冲区中的内容刷新到流关联的文件中
//写1个字符数组
char[] c = {'a','b','c','d','e'};
fw.write(c);
fw.flush();
//写字符数组一部分
fw.write(c, 2, 2);
fw.flush();
//写如字符串
fw.write("hello");
fw.flush();
fw.close();
c.读取文本文件中的内容:FileReader
FileReader fr = new FileReader("c:\\1.txt");
char[] ch = new char[1024];
int len = 0 ;
while((len = fr.read(ch))!=-1){//从c:\\1.txt读取尽可能多的字符到ch中,返回的是当前读到的字符的个数
System.out.print(new String(ch,0,len));//将ch中从0索引开始len个字符转换为字符串
}
fr.close();
d.flush()方法与close()方法
flush()方法:如果数据写到缓冲区中,需要调用flush()方法将数据刷新到文件中
close()方法:底层会先刷新在关流释放流占用的底层系统资源
4.字节流与字符流的拷贝文件:
1.字节流拷贝:适用于所有的文件(文本文件,音频,视频,多媒体,因为所有的文件在计算机中都是以字节存储)
a.单字节拷贝:
/*单字节拷贝的标准IO异常处理格式*/
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//建立两个流的对象,绑定数据源和数据目的
fis = new FileInputStream("c:\\t.zip");
fos = new FileOutputStream("d:\\t.zip");
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len); //字节输入流,读取1个字节,输出流写1个字节
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件复制失败");
}finally{
try{//这个try检测的fos.close()
if(fos!=null)//如果上面new FileOutputStream("d:\\t.zip");抛出异常
//fos为null,fos.close()会报NullPointerException
//所以说:为了防止NullPointerException
fos.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{//目的:防止fos关闭出现异常,fis无法关闭
try{//这个try...catch检测和处理fis.close()
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
}
b.多字节拷贝(提高效率):
FileInputStream fis = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream("c:\\t.zip");
fos = new FileOutputStream("d:\\t.zip");
//定义字节数组,缓冲
byte[] bytes = new byte[1024*10];
//读取数组,写入数组
int len = 0 ;
while((len = fis.read(bytes))!=-1){//从t.zip中尽可能读取字节到bytes字节数组中(读取的字节数<=1024*10),返回当前读到的有效字节个数
fos.write(bytes, 0, len);//将bytes数组从0索引开始,len个字节写入到fos关联的d:\\t.zip中
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件复制失败");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
2.字符流拷贝(只能操作文本文件)
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("c:\\1.txt");
fw = new FileWriter("d:\\1.txt");
char[] cbuf = new char[1024];//开辟长度为1024整数倍的字符数组
int len = 0 ;
while(( len = fr.read(cbuf))!=-1){
fw.write(cbuf, 0, len);
fw.flush();
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("复制失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
}
|
|