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

——- 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值