字节流

字节输出流OutputStream(抽象类)

常用方法:

实例:

public static void main(String[] args) throws IOException {
        //FileOutputStream的构造方法:如果文件存在,则覆盖,如果不存在,则创建
        // \r\n  换行
        FileOutputStream fos=new FileOutputStream("x:\\test\\bian.txt",true);
        /*fos.write(49);
        fos.write(48);
        fos.write(48);*/
        /*byte[] bytes={-65,-66,-67,-68};
        fos.write(bytes,1,2);*/
        fos.write("xuezhiqian\r\n".getBytes()); //字符串转字节
        /*new String(bytes);*/    //字节转字符串
        fos.close();
    }

FileOutputStream类(文件输出流,OutputStream的子类)

FileOutputStream类写入数据到文件中

代码实现:
public static void main(String[] args){
    FileOutputStream fos=null;
        try {
            fos = new FileOutputStream("x:\\test\\bb.txt");
            fos.write(12);
        } catch (IOException e) {
            throw new RuntimeException("输入失败");
        }finally{
            try {
                if(fos!=null)
                fos.close();
            } catch (IOException e) {
                throw new RuntimeException("关闭失败");
            }
        }

 给文件中续写和换行

构造方法:

代码实现:

public static void main(String[] args) throws IOException {
        //FileOutputStream的构造方法:如果文件存在,则覆盖,如果不存在,则创建
        // \r\n  换行
        FileOutputStream fos=new FileOutputStream("x:\\test\\bian.txt",true);
        /*fos.write(49);
        fos.write(48);
        fos.write(48);*/
        /*byte[] bytes={-65,-66,-67,-68};
        fos.write(bytes,1,2);*/
        fos.write("xuezhiqian\r\n".getBytes()); //字符串转字节
        /*new String(bytes);*/    //字节转字符串
        fos.close();
    }

 

IO异常的处理

代码实现:

public class FileOutputStreamDemo3 {
    public static void main(String[] args) {
        File file = new File("c:\\file.txt");
        //定义FileOutputStream的引用
        FileOutputStream fos = null;
        try {
            //创建FileOutputStream对象
            fos = new FileOutputStream(file);
            //写出数据
            fos.write("abcde".getBytes());
        } catch (IOException e) {
            System.out.println(e.toString() + "----");
throw new RuntimeException("文件写入失败,重试");

        } finally {
            //一定要判断fos是否为null,只有不为null时,才可以关闭资源
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    throw new RuntimeException("关闭资源失败");
                }
            }
        }
    }
}

     字节输入流InputStream

常用方法:

FileInputStream类

 

构造方法:

FileInputStream类读取数据read方法

代码实现:

public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("x:\\test\\test.txt");
        int len=0;
        while((len=fis.read())!=-1){
            System.out.println((char)len);
        }
        /*int a=fis.read();
        System.out.println((char)a);
        int b=fis.read();
        System.out.println((char)b);
        int c=fis.read();
        System.out.println((char)c);
        int d=fis.read();
        System.out.println((char)d);
        int e=fis.read();
        System.out.println((char)e);
        int f=fis.read();
        System.out.println((char)f);*/
        /*char ch=97;
        System.out.println(ch);*/
        fis.close();
    }

}

 读取数据read(byte[])方法

代码实现:

public class InputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("x:\\test\\test.txt");
        byte[] bytes=new byte[2];
        int len=0;
        while((len=fis.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
    /*    //第一次读
        int len=fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));
        //第二次读
        len=fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));
        //第三次读
        len=fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));
        //第4次读
        len=fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));*/
        fis.close();
    }

}

字节流复制文件

代码实现:

public class CopyDemo {
    public static void main(String[] args) throws IOException {
        long time1=System.currentTimeMillis();
        //1.明确数据源(要复制哪个文件)
        FileInputStream fis=new FileInputStream("C:\\Program Files\\java\\eclipse.zip");
        //2.明确目的地(要复制到哪个文件)
        FileOutputStream fos=new FileOutputStream("x:\\test\\d\\java.txt");
        //3.复制
        int len=0;
        while((len=fis.read())!=-1){
            fos.write(len);
        }
        long time2=System.currentTimeMillis();
        System.out.println(time2-time1);
        //4.释放资源
        fis.close();
        fos.close();
    }

}

缓冲数组方式复制文件

代码实现:

public static void main(String[] args) throws IOException {
        long time1=System.currentTimeMillis();
        // 1.明确数据源
        FileInputStream fis=new FileInputStream("C:\\Program Files\\java\\eclipse.zip");
        //2.明确目的地
        FileOutputStream fos=new FileOutputStream("x:\\test\\eclipse.zip");
        //3.复制
        int len=0;//获取读取字节的有效长度
        byte[] bytes=new byte[1024];
        while((len=fis.read(bytes))!=-1){
            fos.write(bytes, 0, len);
        }
        long time2=System.currentTimeMillis();
        System.out.println(time2-time1);
        //4.释放资源
        fis.close();
        fos.close();
    }
}

 字符流

 字符输入流Reader

基础方法:

代码实现:

public class ReaderDemo {

    public static void main(String[] args) throws IOException {
        //通过字符数组的方式读
        FileReader fr=new FileReader("x:\\test\\test.txt");
        int len=0;
        char[] ch=new char[1024];
        while((len=fr.read(ch))!=-1){
            System.out.println(new String(ch,0,len));
        }
        fr.close();
        //method1(fr);
    }
    public static void method1(FileReader fr) throws IOException{
        //通过一个字符一个字符的方法读
        int len=0;
        while((len=fr.read())!=-1){
            System.out.print((char)len);
        }
        fr.close();
    }

}

  FileReader类

构造方法:

使用FileReader读取包含中文的文件

代码实现:

public class CharStreamDemo {
    public static void main(String[] args) throws IOException {
        //给文件中写中文
        writeCNText();
        //读取文件中的中文
        readCNText();
    }    
    //读取中文
    public static void readCNText() throws IOException {
        FileReader fr = new FileReader("D:\\test\\cn.txt");
        int ch = 0;
        while((ch = fr.read())!=-1){
            //输出的字符对应的编码值
            System.out.println(ch);
            //输出字符本身
            System.out.println((char)ch);
        }
    }
    //写中文
    public static void writeCNText() throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\test\\cn.txt");
        fos.write("欢迎你".getBytes());
        fos.close();
    }
}

      字符输出流Writer

基础方法:

 

    FileWriter类

 构造方法:

代码实现:

public class WriterDemo {
    public static void main(String[] args) throws IOException {
      //写入中文字符 
     FileWriter fw=new FileWriter("x:\\test\\test.txt"); 
     fw.write("段子手薛之谦");//被写在缓冲区 
     fw.flush();//可刷新多次 
     //fw.close();//具有一次刷新功能 
     }
 }

flush()和close()的区别

close是在关闭之前刷新一次

flush是一边存一边刷

字符流复制文件

代码实现:

public class JpgCopy1 {
    //字符流复制文件
    public static void main(String[] args) throws IOException {
        //1.明确数据源
        FileReader fr=new FileReader("X:\\test\\img1.jpg");
        //2.明确目的地
        FileWriter fw=new FileWriter("x:\\test\\a\\img1.jpg");
        //3.复制
        int len=0;
        char[] ch=new char[1024];
        while((len=fr.read(ch))!=-1){
            fw.write(ch, 0, len);
        }
        //4.释放资源
        fr.close();
        fw.close();
    }

}

转换流

 OutputStreamWriter类(OutputStreamWriter 是字符流通向字节流的桥梁)

代码实现:

public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("x:\\test\\utf8.txt",true);
        OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
        osw.write("这是utf-8编码");
        osw.close();
    }
}

  InputStreamReader类(InputStreamReader 是字节流通向字符流的桥梁)

代码实现:

public class InputStreamReaderDemo {

    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("x:\\test\\utf8.txt");
        InputStreamReader isr=new InputStreamReader(fis,"utf-8");
        char[] ch=new char[1024];
        int len=0;
        while((len=isr.read(ch))!=-1){
            System.out.println(new String(ch,1,len-1));
        }
        isr.close();
    }

}

    转换流和子类区别

OutputStreamWriter:

            |--FileWriter:

InputStreamReader:

   |--FileReader;

 

OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

 

FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,

而直接用子类就完成操作了,简化了代码。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

 

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

 

FileReader fr = new FileReader("a.txt");

这三句代码的功能是一样的,其中第三句最为便捷。

 

注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?

 

条件:

1、操作的是文件。2、使用默认编码。

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

   缓冲流

      字节缓冲流

 字节缓冲输出流BufferedOutputStream

 字节缓冲输入流 BufferedInputStream

 使用基本的流与高效的流完成复制文件

 }

  字符缓冲流

{

    字符缓冲输出流 BufferedWriter

    字符缓冲输入流 BufferedReader

    使用字符缓冲流完成文本文件的复制

}

整体代码实现:

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //method1();
        //method2();
        copy();
    }
    //缓冲字符输出流
    //bw.newLine();可以实现平台无关性
    //win 换行 \r\n
    //Linux 换行 \n
    public static void method1() throws IOException{
        FileWriter fw=new FileWriter("x:\\test\\test.txt",true);
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write("你好吗".toCharArray());
        bw.flush();
        bw.newLine();//换行
        bw.write("我不好");
        bw.flush();
        bw.newLine();
        bw.write(100);
        bw.close();
    }
    //缓冲字符输入流
    public static void method2() throws IOException{
        FileReader fr=new FileReader("x:\\test\\test.txt");
        BufferedReader bfr=new BufferedReader(fr);
        String line=null;
        int count=0;
        while((line=bfr.readLine())!=null){
            count++;
            System.out.println(count+"    "+line);
        }
        /*System.out.println(bfr.readLine());
        System.out.println(bfr.readLine());
        System.out.println(bfr.readLine());
        System.out.println(bfr.readLine());*/
        
        bfr.close();
    }
    //缓冲字符流的复制
    public static void copy() throws IOException{
        //1.明确数据源
        FileReader fr=new FileReader("x:\\test\\test.txt");
        BufferedReader br=new BufferedReader(fr);
        //2.确定目的地
        FileWriter fw=new FileWriter("x:\\test\\d\\copy.txt");
        BufferedWriter bw=new BufferedWriter(fw);
        //3.复制
        String line=null;
        while((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
            
        }
        br.close();
        bw.close();
    }

}
public class Demo02 {
    public static void main(String[] args) throws IOException {
         //method1();
         method2();
    }
    //缓冲字节输出流
    public static void method1() throws IOException{
        FileOutputStream fos=new FileOutputStream("x:\\test\\test.txt",true);
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        //bos.write(100);
        bos.write("你好啊".getBytes());
        bos.close();
    }
    //缓冲字节输入流
    public static void method2() throws IOException{
        FileInputStream fis=new FileInputStream("x:\\test\\test.txt");
        BufferedInputStream bis=new BufferedInputStream(fis);
        int len=0;
        while((len=bis.read())!=-1){
            System.out.print((char)len);
        }
        bis.close();
    }

}

整体练习:

public class Demo01 {
    public static void main(String[] args) throws IOException {
        method1();//31159
        method2();//52
        method3();//105
        method4();//3
    }
    public static void method1() throws IOException {
        //字节流read() 
        long time1=System.currentTimeMillis();
        FileInputStream fis=new FileInputStream("x:\\test\\mysql-connector-java-5.1.37-bin.jar");
        FileOutputStream fos=new FileOutputStream("x:\\test\\a\\mysql-connector-java-5.1.37-bin.jar");
        int len=0;
        while((len=fis.read())!=-1){
            fos.write(len);
        }
        long time2=System.currentTimeMillis();
        System.out.println(time2-time1);
        fis.close();
        fos.close();
    }
    public static void method2() throws IOException{
        //字节流read(byte[])
        long time1=System.currentTimeMillis();
        FileInputStream fis=new FileInputStream("x:\\test\\mysql-connector-java-5.1.37-bin.jar");
        BufferedInputStream bis=new BufferedInputStream(fis);
        FileOutputStream fos=new FileOutputStream("x:\\test\\kkk.jar");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=fis.read(bytes))!=-1){
            fos.write(bytes, 0, len);
        }
        long time2=System.currentTimeMillis();
        System.out.println(time2-time1);
        fis.close();
        fos.close();
    }
    //缓冲字节输出流
        public static void method3() throws IOException{
        
            long time1=System.currentTimeMillis();
            FileInputStream fis=new FileInputStream("x:\\test\\mysql-connector-java-5.1.37-bin.jar");
            BufferedInputStream bis=new BufferedInputStream(fis);
            FileOutputStream fos=new FileOutputStream("x:\\test\\ggg.jar");
            BufferedOutputStream bos=new BufferedOutputStream(fos);
            int len=0;
            while((len=bis.read())!=-1){
                bos.write(len);
            }
            long time2=System.currentTimeMillis();
            System.out.println(time2-time1);
            bis.close();
            bos.close();
        }
        //缓冲字节输入流
        public static void method4() throws IOException{
            long time1=System.currentTimeMillis();
            FileInputStream fis=new FileInputStream("x:\\test\\mysql-connector-java-5.1.37-bin.jar");
            BufferedInputStream bis=new BufferedInputStream(fis);
            FileOutputStream fos=new FileOutputStream("x:\\test\\mysql-connector-java-5.1.37-bin.jar");
            BufferedOutputStream bos=new BufferedOutputStream(fos);
            int len=0;
            byte[] bytes=new byte[1024];
            while((len=bis.read(bytes))!=-1){
                bos.write(bytes, 0, len);
            }
            long time2=System.currentTimeMillis();
            System.out.println(time2-time1);
            bis.close();
            bos.close();
        }
    
    }