黑马程序员-----IO流(2)字节流和转换流

来源:互联网 发布:狗语翻译器软件 编辑:程序博客网 时间:2024/05/29 08:12

——- android培训、java培训、期待与您交流! ———-

一、字节流

1、 字节流:
字节读取流:InputStream
字节写入流:OutputStream
字节读取流缓冲区:Buffered OutputStream
字节读取流缓冲区:Buffered InputStream
注:字节流和字符流用法差不多,只不过一个是对字节操作,一个是对字符进行操作

2、演示:往一个文件中,写入字节流并读取出来

package com.shan;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/** * 需求:字节流File读写操作演示(FileInputStream和FileOutputStream) * @param args */public class Demo13 {    public static void main(String[] args) throws IOException {        writeFile();        readFile_1();        readFile_2();        readFile_3();    }    public static void writeFile() throws IOException  //文件里写入字节数据    {        FileOutputStream  fos=new FileOutputStream("fos.txt");        fos.write("abcdefghijklmn".getBytes());        fos.flush();        fos.close();    }    public static void readFile_1() throws IOException //一个字节一个字节的读取    {        FileInputStream  fis=new FileInputStream("fos.txt");        int ch=0;        while((ch=fis.read())!=-1)        {            System.out.print((char)ch);        }        fis.close();    }    public static void readFile_2() throws IOException   //把字节存入字节数组中,按一个字节数组的长度读取    {        FileInputStream  fis=new FileInputStream("fos.txt");        byte[] buf=new byte[1024];        int len=0;        while((len=fis.read(buf))!=-1)        {            System.out.println(new String(buf,0,len));        }        fis.close();    }    public static void readFile_3() throws IOException    {        FileInputStream  fis=new FileInputStream("fos.txt");        byte[] buf=new byte[fis.available()];  //定义一个长度刚刚好的字节数组。不用循环了        fis.read(buf);        System.out.println(new String(buf));                fis.close();    }}

3、 拷贝图片(用字节流来进行操作)

package com.shan;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/** * 需求:拷贝一个图片文件 * @param args */public class Demo14 {    public static void main(String[] args) {        FileOutputStream fos=null;        FileInputStream fis=null;        try        {            fis=new FileInputStream("1.jpg");            fos=new FileOutputStream("2.jpg");            int len=0;            byte[] buf=new byte[1024];            while((len=fis.read(buf))!=-1)            {                fos.write(buf, 0, len);            }                           }        catch(IOException e)        {            throw new RuntimeException("复制图片失败!");        }        finally        {            try            {                if(fis!=null)                fis.close();            }            catch(IOException e)            {                throw new RuntimeException("读取关闭失败!");            }            try            {                if(fos!=null)                fos.close();            }            catch(IOException e)            {                throw new RuntimeException("写入关闭失败!");            }        }    }}

4、 通过缓冲区演示MP3的复制(用字节流来进行操作)

 package com.shan;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/** * 需求:演示MP3的复制,通过缓冲区 * @param args */public class Demo15 {    public static void main(String[] args) throws IOException {        copyMp3();    }    public static void copyMp3() throws IOException    {        BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("1.mp3"));        BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("2.mp3"));        byte[] buf=new byte[1024];        int len=0;        while((len=bufis.read(buf))!=-1)        {            bufos.write(buf, 0, len);        }        bufis.close();        bufos.close();    }}

5、 读取键盘录入
1) System.in:对应的是标准输入设备:键盘
2) System.out:对应的是标准输出设备:控制台
3) 最常见的键盘录入的写法:

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

例子:通过键盘录入数据,当录入一行数据后,就将该行数据进行打印,如果录入的值是“over”,那么就停止录入。

package com.shan;import java.io.IOException;import java.io.InputStream;/** * 需求:通过键盘录入数据,当录入一行数据后,就将该行数据进行打印,如果录入的值是“over”,那么就停止录入。 * @param args */public class Demo16 {    public static void main(String[] args) throws IOException {        InputStream in=System.in;        StringBuilder sb=new StringBuilder();        while(true)        {            int ch=in.read();            if(ch=='\r')             continue;            if(ch=='\n')            {                String s=sb.toString();                if("over".equals(in))                break;                System.out.println(s.toUpperCase());                sb.delete(0, sb.length());            }            else                sb.append((char)ch);        }    }}

二、转换流(字符和字节之间的桥梁)
1、读取转换流:InputStreamReader
2、写入转换流:OutputStreamWriter

3、示例演示:通过读取转换流来读取键盘录入的数据:

package com.shan;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;/** * 需求:通过读取转换流来读取键盘录入的数据  (读取转换流:InputStreamReader) * @param args */public class Demo17 {    public static void main(String[] args) throws IOException {        //获取键盘录入的数据        InputStream  in=System.in;        //将字节流对象转成字符流对象,使用转换流        InputStreamReader isr=new InputStreamReader(in);        //为了提高效率,使用BufferedReader缓冲区提高效率        BufferedReader bufr=new BufferedReader(isr);        String line=null;        while((line=bufr.readLine())!=null)        {            if("over".equals(line))                         break;            System.out.println(line.toUpperCase());                 }        bufr.close();    }}

4、 通过写入转换流来获取键盘录入的数据并大写打印出来
(写入转换流:OutputStreamWriter)

package com.shan;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/** * 需求:通过写入转换流来获取键盘录入的数据并大写打印出来   (写入转换流:OutputStreamWriter) * @param args */public class Demo18 {    public static void main(String[] args) throws IOException {        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));        String line=null;        while((line=bufr.readLine())!=null)        {            if("over".equals(line))            break;            bufw.write(line.toUpperCase());            bufw.newLine();            bufw.flush();        }        bufr.close();        bufw.close();    }}

5、 转换流什么时候使用?
转换流是字符和字节之间的桥梁,通常,涉及到字符编码需要转换时需要用到转换流

6、总结:(流操作的基本规律)
1) 明确源和目的
源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
2) 操作的数据是否是文本
是:字符流
不是:字节流
3) 当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分
源设备:内存、硬盘、键盘等
目的设备:内存、硬盘、控制台等

例如:将键盘录入的数据保存到一个文件中
(分析需求)源:因为是读取流,键盘录入的数据都是文本数据,所以使用Reader    因为System.in对应的是字节流,为了操作键盘的文本数据方便,所以将其转换成字符流,所以用到了读取转换流:InputStreamReader    因为需要提高效率,所以加入缓冲技术,用到了:BufferedReader    操作源的代码就可以确定,如下所示:    InputStreamReader  isr=new InputStreamReader(System.in);BufferedReader  bufr=new BufferedReader(isr);目的:      OutputStream     Writer是否是纯文本?是!就选择Writer设备:硬盘。一个文本文件, 使用FileWriter需要提高效率,所以使用BufferedWriter目的的代码就可以确定,如下所示:FileWriter  fw=new FileWriter(c.txt);BufferedWriter  bufw=new BufferedWriter(fw);

——- android培训、java培训、期待与您交流! ———-

0 0
原创粉丝点击