1.IO流的概念:
2.IO流的分类:
1.通过流动的方法:输入 输出
2.通过操作单位:字节 字符
3.乱码情况分析
1.原因:编码字符和解码字符字符不一致
2.常见编码
GBK/GB2312/GB18030**:简称国标,表示汉字。GB2312表示简体中文,GBK/GB18030表示繁体中文,其实就是几个不同的版本而已。
Unicode编码:包含世界上所有的字符,是一个字符集。
UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度
4.IO的四大流:
1.字节流:
构造方法:
输入构造方法
1. FileInputStream(File file) 表示从file指向的文件中读取
2. FileInputStream(String name) name表示文件的路径名(路径+文件名)
输出构造方法
FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
读取的方法:
int read() 调用一次读到一个数据字节,返回的int值就是读到的数据如果已到达文件末尾,则返回 -1
int read(byte[] b) 调用一次本方法表示可以读取多个数据,读到的内容保存传入的byte数组b中,返回的是本次调用方法读到的数据字节个数
int read(byte[] b, int off, int len) 和上面的第二个类似,可以指定从b数组什么位置开始装
循环读取整个文件内容
intread=0;//准备一个变量 : 将读取的每一个字节的数据,;零时存入到该变量
while( (read=fis.read())!=-1){//用read保存的结果:跟-1比较
System.out.println((char)read);//每次保存的结果,强转成字符
}
传入byte数组读取
intlen;//读取的字节的个数
byte[]arr=newbyte[1024];//五个字节的数据,缓存在该数组的
while( (len=fis.read(arr))!=-1){
System.out.println(newString(arr,0,len) );
}
写入的方法:
构造方法
FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
写入的方法:
void write(int b) 调用一次写入一个数据字节
void write(byte[] b) 调用一次,可以把一个byte数组中的数据写入
void write(byte[] b, int off, int len) 调用一次,把b数组中的一部分数据写入
写入一个字符的示例
OutputStream os = new FileOutputStream("D:/123.avi");
os.write(65);
os.close();
写入一个字符串的示例
OutputStream os = new FileOutputStream("D:/123.txt",true);
os.write("66666".getBytes());
os.close();
2.字符流:
构造方法
参考字节流
FileRead对应FileInputStream
FileWriter对应FileOutputStream
读取的方法
int read();读取单个字符
int read(byte[])将数据读到数组中,然后再读数组中的数据
写入的方法
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的一部分
3.转换流
字节转字符构造方法
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, Charset cs)
InputStreamReader(InputStream in, String charsetName)
字符转字节流构造方法
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, Charset cs)
OutputStreamWriter(OutputStream out, String charsetName)
4.缓冲流
需要缓冲流的原因
之前循环独写数据,操作磁盘的次数非常多,影响性能,通过缓存流,可以先缓存大量读写数据,等到比较多了之后,在连接磁盘一次从磁盘读取或者写
缓冲流的构造方法
BufferedInputStream [ 1024 * 8]字节输入缓冲流
BufferedOutputStream字节输出缓冲流
BufferedReader字符输入缓冲流
BufferedWriter字符输出缓冲流
缓冲流示例
FileInputStreamfis=newFileInputStream("F:/b/aa.jpg");
BufferedInputStreambis=newBufferedInputStream(fis);//先缓冲,再读取
intlen;
byte[]b=newbyte[1024];
while((len=bis.read(b))!=-1){
System.out.println(newString(b,0,len));
}
bis.close();
fis.close();
5.IO异常处理
传统处理方式:
try{
可能发生异常的代码块
}catch(异常类型 形式参数){
捕获异常之后要做的处理
}finally{
异常语句块一定会执行的代码块,释放锁,关闭流资源
}
Java1.7后的新方式:
try(需要自动关闭的流资源){
可能发生异常的代码块
}catch(){
捕获异常之后要做的处理
}
示例
try(
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
){
byte[] b = new byte[1024];
int len;
while((len = fis.read(b)) != -1){
fos.write(b,0,len);
}
}catch(Exception e){
e.printStackTrace();
}
6.随机读写文件
随机读写文件示例:
RandomAccessFilerm=newRandomAccessFile("F:/b/random.avi","rw");
rm.write("Hello".getBytes());
//rm写过一次之后,自动的记录了下一个写入数据的位置
System.out.println(rm.getFilePointer());//获得文件指针偏移的位置[数据应该继续写入的下一个位置的字节值]
rm.seek(0);//设置从文件的哪个位置开始写操作【随机写操作】
rm.write("HA".getBytes());
System.out.println(rm.getFilePointer());//获得文件指针偏移的位置[数据应该继续写入的下一个位置的字节值]
rm.close();
//rm.setLength(1024*1024*1024);设置文件大小
今日注意事项
flush()方法:刷新流,再字符流写入中,如果不刷新或者关闭不会到磁盘中
close()方法:关闭流,关闭与文件之间的通道,再完成后操作后必须关闭,以免造成资源浪费
操作中文时字符流更好用
进行拷贝的时候选择字节流
网友评论