欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO流

程序员文章站 2024-03-03 19:29:34
...

一、流介绍

     IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而java用于操作流的对象都在IO包中。

     IO流的分类:

           1.根据处理数据类型的不同分为:字符流和字节流;

           2.根据数据流向不同分为:输入流和输出流 ;(程序读取文件内容叫输入,程序把内容写入文件叫输出

    字符流和字节流的区别:  

         1.读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位;

         2.处理对象不同:字节流可以处理全部类型数据,字符流只能处理字符型的数据;

         3.读写位数不同:字节流一次读入或读出8位二进制, 字符流一次读入或读出16位二进制;  

         注:处理纯文本文件首先考虑字符流                   

    关系类图:

    Java IO流

二、字符流

     字符流的基本简介:

           1.字符流中的对象融合了编码表,是系统默认的编码表(GBK)

           2.字符流只处理文本数据

           3.数据最常见的表现方式是文件,字符流用于操作文件的之类一般是FileReader和FileWriter

     字符流读写注意事项:

            1.写入文件后必须flush(),然后关闭流;

            2.使用流要捕获异常;

            3.定义文件路劲时用“/”或“\\”或者File.separator;

            4.创建文件时,有相同名字文件将会被覆盖;读取文件时,文件不存在会抛出异常;

   字符输出流实例:

class FireWriterDemo {  
    public static void main(String[] args) throws IOException {             //需要对IO异常进行处理   
  
        //创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。  
        //而且该文件会被创建到指定目录下。如果该目录有同名文件,那么该文件将被覆盖。  
  
        FileWriter fw = new FileWriter("F:\\1.txt");//目的是明确数据要存放的目的地。  
  
        //调用write的方法将字符串写到流中  
        fw.write("hello world!");  
      
        //刷新流对象缓冲中的数据,将数据刷到目的地中  
        fw.flush();  
  
        //关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。当我们结束输入时候,必须close();  
        fw.write("first_test");  
        fw.close();  
        //flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入。  
  
    }  
}  

二、字节流

    字节流概述:
       1.可处理全部类型数据
       2.字节流操作不用flush
       3.InputStream特有方法:int available();//返回文件中字节个数

       注:可以利用此方法来制定读取方式中传入数组的长度,而省去循环判断。单文件较大时此数组长度所占内存空间就会溢出        (虚拟机启动分配的默认内存一般为64M)。

    字节流实例:

import java.io.*;    
class CopyPic {  
    public static void copyBmp() {  
        FileInputStream fis = null;  
        FileOutputStream fos = null;  
        try {  
            fis = new FileInputStream("F:\\java_Demo\\day9_28\\1.bmp");       
            fos = new FileOutputStream("F:\\java_Demo\\day9_28\\2.bmp");  
            byte[] copy = new byte[1024];  
            int len = 0;  
            while((len=fis.read(copy))!=-1) {  
            fos.write(copy,0,len);  
            }  
        }  
        catch (IOException e) {  
            e.printStackTrace();  
            throw new RuntimeException("复制文件异常");  
        }  
        finally {  
            try {  
                if(fis!=null) fis.close();  
            }  
            catch (IOException e) {  
                e.printStackTrace();  
                throw new RuntimeException("读取流异常");  
            }  
        }         
    }  
}  

三、转换流

     InputStreamReader:字节到字符的桥梁  ;OutputStreamWriter:字符到字节的桥梁

     转换流的特点:是字符流和字节流之间的转换桥梁。

     转换流使用场景:

          1.源或目标对应的设备是字节流,但操作的是文本数据,可以使用。

          2.一单操作文本涉及具体的知道编码表是,必须使用转换流

    代码实例:

     (1)、读取键盘输入的每一行内容,并希尔到文本中,知道遇到over行结束

public static void main(String[] args) throws IOException {  
       
        //字节流-->字符流  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        BufferedWriter bw = new BufferedWriter(new FileWriter("is2.txt"));  
        String line = null;  
        while((line = br.readLine())!=null){  
            if("over".equals(line)){  
                break;  
            }  
            bw.write(line);  
            bw.newLine();  
            bw.flush();           
        }  
        bw.close();  
        br.close();  }  

     (2)、字符流bufferedReader转为字节流System.out

public static void main(String[] args) throws IOException {  
  
        BufferedReader br = new BufferedReader(new FileReader("is2.txt"));  
        //字符流-->字节流        
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));  
        String line = null;  
        while ((line = br.readLine())!=null) {  
            bw.write(line);  
            bw.newLine();  
            bw.flush();  
        }  
        bw.close();  
        br.close();  
 }  

(3)、指定编码输入出去文件

//1.采用指定的编码读取文本文件
public static void main(String[] args) throws IOException {  
  
        //在IO流中,如果想指定编码读写数据,只能使用转换流。  
        //采用指定编码从文本文件中读取内容  
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\a.txt"), "UTF-8"));  
        String line = null;  
        while ((line=br.readLine())!=null) {  
            System.out.println(line);  
        }  
        br.close();  
    }  
// 2.采用指定的编码输出文本文件
public static void main(String[] args) throws IOException {  
  
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\a.txt"), "UTF-8"));  
        bw.write("I am 君山");  
        bw.close();  
    }  

三、缓冲流

       缓冲流是一个包装流,目的是缓存作用,加快读取和写入数据的速度。

  字节缓冲流:BufferedInputStream、BufferedOutputStream

  字符缓冲流:BufferedReader、BufferedWriter

       注:我们在将字符输入输出流、字节输入输出流的时候,读取操作,通常都会定义一个字节或字符数组,将读取/写入的数据先存放到这个数组里面,然后在取数组里面的数据。这比我们一个一个的读取/写入数据要快很多,而这也就是缓冲流的由来。只不过缓冲流里面定义了一个 数组用来存储我们读取/写入的数据,当内部定义的数组满了(注意:我们操作的时候外部还是会定义一个小的数组,小数组放入到内部数组中),就会进行下一步操作。 

       

//字节缓冲输入流
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("io"+File.separator+"a.txt"));
        //定义一个字节数组,用来存储数据
        byte[] buffer = new byte[1024];
        int len = -1;//定义一个整数,表示读取的字节数
        while((len=bis.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        //关闭流资源
        bis.close();//当定义缓存数组满的时候自动flush()
         
        //字节缓冲输出流
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("io"+File.separator+"a.txt"));
        bos.write("ABCD".getBytes());
        bos.close();

//字符缓冲输入流
        BufferedReader br = new BufferedReader(
                new FileReader("io"+File.separator+"a.txt"));
        char[] buffer = new char[10];
        int len = -1;
        while((len=br.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        br.close();
         
        //字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(
                new FileWriter("io"+File.separator+"a.txt"));
        bw.write("ABCD");
        bw.close();

其他详细资料:点击打开链接

 

相关标签: IO java IO流