黑马程序员——IO流字节流

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


 

字节流读取流

字节流基类

InputStream

OutputStream

/*

写入文件

*/

import java.io.OutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class Test{

    public static void main(String...args)throws IOException{

        OutputStream os = newFileOutputStream("1111.Java");

        os.write("戒风".getBytes());

        os.close();

        System.out.println("ok!!!!");

    }

}

/*

第一种读取文件的方法。

对于操作文本文件不支持使用此做法。

*/

import java.io.InputStream;

import java.io.FileInputStream;

import java.io.IOException;

public class Test{

    public static void main(String...args) throws IOException{

        InputStream is =new FileInputStream("1111.java");

        for(int by = 0;(by=is.read())!=-1;){

            System.out.print(by);

        }

        is.close();

        System.out.println("ok!!!!");

    }

}

/*

第二种读取文件的方法。对于操作文本文件支持使用此做法。

*/

import java.io.InputStream;

import java.io.FileInputStream;

import java.io.IOException;

public class Test{

    public static void main(String...args) throws IOException{

        InputStream is = newFileInputStream("C:\\1.Java");

        byte [] buf = new byte[1024];

        for(int len = 0;(len=is.read(buf))!=-1;){

            System.out.print(new String(buf,0,len));

        }

        is.close();

        System.out.println("ok!!!!");

    }

}

InputStream

int

available()
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。

/*

第三种方式,如果内存太大会报错。

*/

import java.io.InputStream;

import java.io.FileInputStream;

import java.io.IOException;

public class Test{

    public static void main(String...args) throws IOException{

        InputStream is =new FileInputStream("C:\\1.Java");

        byte[] buf =new byte[is.available()];

        is.read(buf);

        System.out.println(new String(buf));

        is.close();

    }

}

IO(拷贝图片)

/*

思路:
1
、用字节读取流对象和图片关联
2
、用字节写入流对象创建一个图片文件。用于存储获取到的图片数据
3
、通过循环读写,完成数据的存储
4
、关闭资源

*/

import java.io.InputStream;

import java.io.FileInputStream;

import java.io.OutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class Test{

    public static void main(String...args){

        InputStream is =null;

        OutputStream os =null;

        try{

            is =new FileInputStream("C:\\1.jpg");

            os =new FileOutputStream("D:\\1.jpg");

            byte []buf =new byte[1024];

            for(int len=0;(len=is.read(buf))!=-1;){

                os.write(buf,0,len);

            }

        }

        catch(IOException e){

            System.out.println("读写错误");

        }

        finally{

            try{

                if(is!=null)

                is.close();

            }

            catch(IOException e){

                System.out.println("读取流关闭失败");

            }

            finally{

                try{

                    if(os!=null)

                    os.close();

                }

                catch(IOException e){

                    System.out.println("写入流关闭失败");

                }

            }

            System.out.println("ok!!!");

       }

    }

}

字节流缓冲区

BufferedInputStream

BufferedOutputStream

import java.io.IOException;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

public class Test{

    public static void main(String...args)throws IOException{

        BufferedInputStream is = newBufferedInputStream

        (new FileInputStream("C:\\1.mp3"));

        BufferedOutputStream os = newBufferedOutputStream

        (new FileOutputStream("D:\\1.mp3"));

        for(int by = 0;(by=is.read())!=-1;){

            os.write(by);

        }

        is.close();

        os.close();

        System.out.println("ok!!!");

    }

}

IO(自定义字节流的缓冲区-readwrite的特点)

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

class MyBufferedInputStream{

    private InputStream in;

    private byte[] buf =new byte[1024];

    private int pos;

    private int count;

    MyBufferedInputStream(InputStream in){

        this.in=in;

    }

    public int myRead()throws IOException{

        if(count==0){

            count=in.read(buf);

            if(count<0)

            return -1;

            pos=0;

            byte b = buf[pos];

            pos++;

            count--;

            return b&255;

        }

        else if(count>0){

            byte b = buf[pos];

            pos++;

            count--;

            return b&0xff;

        }

        return -1;

    }

    public void myClose()throws IOException{

        in.close();

    }

}

public class Test{

    public static void main(String...args) throws IOException{

        long start = System.currentTimeMillis();

        copy();

        long end = System.currentTimeMillis();

        System.out.println(end-start);

    }

    public static void copy()throws IOException{

        MyBufferedInputStream bufis = newMyBufferedInputStream

        (new FileInputStream("C:\\1.avi"));

        BufferedOutputStream bufos = newBufferedOutputStream

        (new FileOutputStream("C:\\2.avi"));

        for(int len=0;(len=bufis.myRead())!=-1;){

            bufos.write(len);

        }

        bufis.myClose();

        bufos.close();

    }

}

字节流键盘读取

IO(读取键盘录入)

System.out:对应的是标准输出设备:控制台

System.in:对应的是标准输入设备 :键盘

/*
需求,通过键盘录入数据。
当录入一行数据后,就将改行数据进行打印,如果录入数据是over,那么停止录入
*/

import java.io.IOException;

import java.io.InputStream;

public class Test{

    public static void main(String...agrs)throws IOException{

        InputStream in =System.in;

        StringBuilder sb = newStringBuilder();

        while(true){

            int ch =in.read();

            if(ch=='\r')

            continue;

            if(ch=='\n'){

                String s=sb.toString();

                if("over".equals(s))

                break;

                System.out.println(s);

                sb.delete(0,sb.length());

            }

            else{

                sb.append((char)ch);

            }

        }

    }

}

IO(读取转换流)

通过键盘录入一行数据,并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法来完成键盘录入的一行数据的读取呢?

/*

需求,通过键盘录入数据。

当录入一行数据后,就将该行数据进行打印,如果录入数据是over,那么停止录入

*/

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.BufferedReader;

import java.io.IOException;

public class Test{

    public static void main(String...args)throws IOException{

        BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in)) ;

        for(String line =null;(line=bufr.readLine())!=null;) {

            if("over".equals(line))

            break;

            System.out.println(line);

        }

        bufr.close();

    }

}

IO(写入转换流)

/*

需求,通过键盘录入数据。

当录入一行数据后,就将该行数据进行打印,如果录入数据是over,那么停止录入

*/

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.IOException;

public class Test{

    public static void main(String...args)throws IOException{

        BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));

        BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(System.out));

        for(String line = null;(line=bufr.readLine())!=null;){

            if("over".equals(line))

            break;

            bufw.write(line);

            bufw.newLine();

            bufw.flush();

        }

        bufr.close();

        bufw.close();

    }

}

IO(流操作规律)

1、 源:键盘

目的:控制台

/*
需求,通过键盘录入数据。
如果录入数据是over,那么停止录入,否则就打印*/

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.IOException;

public class Test{

    public static void main(String...args)throws IOException{

        BufferedReader bufr = newBufferedReader(new InputStreamReader(System.in));

        BufferedWriter bufw = newBufferedWriter(new OutputStreamWriter(System.out));

        for(String line = null;(line=bufr.readLine())!=null;){

            if("over".equals(line))

            break;

            bufw.write(line.toUpperCase());

            bufw.newLine();

            bufw.flush();

        }

        bufr.close();

        bufw.close();

    }

}

2、 源:键盘

目的:文件

/*

需求:将键盘录入的数据输出到一个文本文件中,

如果录入数据是over,那么停止录入,否则就输入到文件中

*/

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.IOException;

import java.io.FileOutputStream;

public class Test{

    public static void main(String...args)throws IOException{

        BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));

        BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\1.Java")));

        for(String line = null;(line=bufr.readLine())!=null;){

            if("over".equals(line))

            break;

            bufw.write(line);

            bufw.newLine();

            bufw.flush();

        }

        bufr.close();

        bufw.close();

    }

}

3、 源:文件

目的:控制台

/*

需求:想要讲一个文件的数据打印在控制而台上

*/

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.FileInputStream;

public class Test{

    public static void main(String...args)throws IOException{

        BufferedReader bufr =new BufferedReader(new InputStreamReader

        (new FileInputStream("C:\\1.Java")));

        BufferedWriter bufw =new BufferedWriter

        (new OutputStreamWriter(System.out));

        for(String line =null;(line=bufr.readLine())!=null;){

            bufw.write(line);

            bufw.newLine();

            bufw.flush();

        }

        bufr.close();

        bufw.close();

    }

}

面向对象IO简单总结下

流操作的基本规律:最痛苦的就是流对象有很多,不知道该用那一个。

通过明确来完成。

(1)、明确源和目的

源:输入流 InputStream Reader

目的:输出流OutputStream Writer

(2)、操作的数据是否是纯文本

是:字符流 ReaderWriter

不是:字节流 InputStream OutputStream

(3)、当体系明确后,再明确要使用那个具体的对象

通过设备来进行区分:

源设备:内存 硬盘 键盘

目的设备:内存 硬盘 控制台

/*

需求:将一个文本文件中数据存储到另一个文件中。复制文件

*/

源:因为是源,所以使用读取流。InputStreamReader

是否是纯文本文件:是,所以使用 Reader

接下来明确要使用该体系中的那个对象:

明确设备,硬盘,一个文件。

Reader体系中可以操作文件的是,FileReader

是否需要提高效率?

BufferedReader

目的:因为是目的,所以使用写入流。OutputStream Writer

是否是纯文本文件:是,所以使用 Writer

接下来明确要使用该体系中的那个对象:

明确目的,硬盘,一个文件。

Writer 体系中可以操作文件的是,FileWriter

是否需要提高效率?需要。BufferedWriter

/*

需求:将键盘录入的数据保存到一个文件中

这个需求中有源和目的都存在,那么分别分析

*/

源:因为是源,所以使用读取流。InputStreamReader

是否是纯文本文件:是,所以使用 Reader

接下来明确要使用该体系中的那个对象:

明确设备,键盘。对应的对象是System.in

不是选择Reader吗?System.in 对应的不是字节流吗?

为了操作键盘的文字数据方便,字节流可以转换成字符流,按照字符串操作最方便。

既然明确了Reader 就将 System.in 转换成Reader

用到了Reader 体系中的转换流,InputSteamReader

需要提高效率吗?需要,BufferedReader

目的:因为是目的,所以使用写入流。OutputStreamWriter

是否是纯文本文件:是,所以使用 Writer

接下来明确要使用该体系中的那个对象:

明确目的,硬盘,一个文件。

Writer体系中可以操作文件的是,FileWriter

是否需要提高效率?需要。BufferedWriter

扩展

想要把录入的数据按照指定的编码表(UTF-8),将数据存到文件中,使用转换流,里面可以指定编码。

目的:OutputStream Writer

是否是纯文本?是,Writer

接下来明确要使用该体系中的那个对象:

明确目的,硬盘,一个文件。

Writer体系中可以操作文件的是,FileWriter

但是存储时,需要加入指定的编码表,而指定的编码表,只有转换流可以指定。

所以要使用的对象是OutputStreamWriter.

而该转换流对象要接收一个字节输出流。

而且还可以操作文件的字节输出流,FileOutputStream

是否需要提高效率?需要。BufferedWriter

所以,记住,转化流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。

IO(改变标准输入输出设备)

System

static void

setIn(InputStream in)
重新分配标准输入流。

static void

setOut(PrintStream out)
重新分配标准输出流。

IO(异常的日志信息)

import java.util.Date;

import java.text.SimpleDateFormat;

import java.io.PrintStream;

import java.io.IOException;

public class Test{

    public static void main(String...args) {

        try{

            int arr[] = new int[2];

            System.out.println(arr[3]);

        }catch(Exception e){

            try{

                Date d = new Date();

                SimpleDateFormat sdf = newSimpleDateFormat("yyyyMMdd E HH:mm:ss");

                String date = sdf.format(d);

                PrintStream ps = new PrintStream("c:\\execption.txt");

                ps.println(date);

                System.setOut(ps);

            }

            catch(IOException ex){

                throw new RuntimeException("日志文件创建失败");

            }

            e.printStackTrace(System.out);

        }

    }

}

IO(系统信息)

import java.util.Properties;

import java.io.PrintStream;

import java.io.IOException;

public class Test{

    public static void main(String...args) throws IOException{

        Properties popr = System.getProperties();

        popr.list(new PrintStream("C:\\1.properties"));

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值