java中IO的操作

来源:互联网 发布:联通网络不稳定 编辑:程序博客网 时间:2024/04/29 21:43

一直以来IO流的操作一直都是我的一个痛点,这个东西我总是看了忘、忘了看,今天终于又理解了一次,所以准备写在博客上,一是为了自己以后方便复习,二来也是为了和大家一块学习,写的不对的地方希望大家指正。

对文件的操作都是通过流来进行操作的。流分为字节流和字符流,字节流是一个字节序列,它与外部设备中的字节对应。凡是文件用字节流对其进行操作一定是能够解决的。而字符流是一个字符序列,在字符流中,可按照需要进行某些字符的转换,在被读写字符和外部设备中的字符不存在一一对应的关系,被读写的字符的个数可能与外部的个数不一样,字符流一般主要用于文本文件的操作。

那么那些是字节流哪些是字符流呢?在这里我告诉大家一个最简单的方法,凡是格式是xxxstream的都是字节流,凡是XXreader或是xxwriter的都是字符流。

下面是我从一个网站上看到的别人写的一些总结,然后加上了我的一点总结,希望对大家有用!

 

1.字节流
  1)InputStream、OutputStream
   InputStream抽象了应用程序读取数据的方式
   OutputStream抽象了应用程序写出数据的方式 
2)EOF = End   读到-1就读到结尾
3)输入流基本方法
  int  b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF
  in.read(byte[] buf) 
  in.read(byte[] buf,int start,int size)
         对于read的方法,它们返回的都是一个整数,在读取的过程中我们需要判断这个整数是否为-1,如果返回的整数是-1,那么代表的是已经把数据读取完毕了
4)输出流基本方法
 out.write(int b)      写出一个byte到流,b的低8位
   out.write(byte[] buf)  将buf字节数组都写入到流
 out.write(byte[] buf,int start,int size)
对于输入和输出流的操作,一般我建议大家使用第三个方法,这样我们可以更好的控制每次读取/写入的数据
  5)FileInputStream--->具体实现了在文件上读取数据
  6)FileOutputStream 实现了向文件中写出byte数据的方法
  7)DataOutputStream/DataInputStream
    对"流"功能的扩展,可以更加方面的读取int,long,字符等类型数据
   DataOutputStream
     writeInt()/writeDouble()/writeUTF()
  这些方法,在jdk中都已经把那些移位的操作帮我们做好了,我们只需要拿来用就好了。
8)BufferedInputStream&BufferedOutputStream
  这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入
  或读取操作时,都会加上缓冲,这种流模式提高了IO的性能


  从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:
  FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去
  DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去
  BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提高了 
  2.字符流
  1) 编码问题
  2)认识文本和文本文件
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)
文件是byte byte byte ...的数据序列
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果,所以使用字符流的时候大家一定要小心编码的问题
3)字符流(Reader Writer)---->操作的是文本文本文件
字符的处理,一次处理一个字符
字符的底层仍然是基本的字节序列
字符流的基本实现
  InputStreamReader   完成byte流解析为char流,按照编码解析
        OutputStreamWriter  提供char流到byte流,按照编码处理  
  FileReader/FileWriter
  字符流的过滤器
      BufferedReader   ---->readLine 一次读一行
      BufferedWriter/PrintWriter   ---->写一行 

      这些操作都需要我们自己手工的换行,当然了也有自己封装的换行。 

下面给大家显示一段小例子(我学习的时候看到的):

文件的拷贝:

public static void copyFile(File srcFile,File destFile)throws IOException{
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
byte[] buf = new byte[1024];
int b ;
   while((b = in.read(buf,0,buf.length))!=-1){
    out.write(buf,0,b);
    out.flush();
   }
   in.close();
   out.close();

}



public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{

BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destFile));
int c ;
while((c = bis.read())!=-1){
bos.write(c);
bos.flush();
}
bis.close();
bos.close();
}


public static void copyFileByByte(File srcFile,File destFile)throws IOException{

FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
int c ;
while((c = in.read())!=-1){
out.write(c);
out.flush();
}
in.close();
out.close();
}

注意:在IO操作时一般是会抛异常的,需要try catch一下,另外流使用完毕时一定要注意关闭,另外输出流写的时候一定要调用flush()方法,不然可能会出现有时候写不全的情况。


0 0