黑马程序员 java基础24天 字节流

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! -------------------------

一.字节流

OutputStream和  InputStream

 

二.FileOutputStream  和  FileInputStream

类 FileInputStream

常用构造方法摘要

FileInputStream(File file)

          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 

FileInputStream(String name)

          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

常用方法摘要

int     available( ) :获取文件大小

void    close( ) :关闭流资源

int      read( )  从此输入流中读取一个数据字节。结束int为-1;

int      read(byte[] b)

              从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。结束int为-1;

int      read(byte[] b, int off, int len)

              从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

 

类 FileOutputStream

常用构造方法摘要

FileOutputStream(File file)

          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

FileOutputStream(String name)

          创建一个向具有指定名称的文件中写入数据的输出文件流。

 

常用方法摘要

void     close()   关闭此文件输出流并释放与此流有关的所有系统资源。

void     write(byte[] b)

            将 b.length 个字节从指定 byte 数组写入此文件输出流中。

void    write(byte[]b, int off, int len)

            将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

void    write(int b)

            将指定字节写入此文件输出流。

 

代码示例:

编写一个复制图片的程序

思路:

1.用字符读取流对象和图片关联

2.用字节写入流对象创建一个图片文件,用于存储获取到的图片的数据

3.通过循环续写,完成数据的存储

4.关闭资源

   public static void copyPic_2() {

                     FileInputStreamfis = null;

                     FileOutputStreamfos = null;

                     byte[] buf = new byte[1024];//定义一个缓冲区

                     intnum = 0;

                     try{

                            fis = newFileInputStream("E:\\caoyun.jpg");//定义输入流

                         fos= new FileOutputStream("E:\\Copy_caoyun.jpg");//定义输出流

 

                         while ((num = fis.read(buf))!=-1){//读出文件

                                fos.write(buf,0,num);//写入文件

                         }

                     }

                     catch(IOException e){

                            thrownew RuntimeException("复制文件失败!");

                     }

                     finally{

                            try{

                                   if(fis!= null)

                  fis.close();

                            }catch(IOException e){

               throw new RuntimeException("复制文件失败!");

                            }

                            try{

                                   if(fos!= null)

                                   fos.close();

                            }catch(IOException e){

                                   thrownew RuntimeException("复制文件失败!");

                            }

                     }

                   }

 

三、字节流的缓冲区

BufferedInputStream

在创建 BufferedInputStream 时,会创建一个内部缓冲区数组

常用构造方法摘要

BufferedInputStream(InputStream in)

创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。


BufferedOutputStream

常用构造方法摘要

BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流

【字节流缓冲区的原理】

例如BufferesOutputStream这个缓冲区,其内部封装了一个数组,而数据是通过传入的OutputStream的子类对象的read方法一个一个读取,并将数据保存在这个数组中的,而缓冲区的read方法,则将这个数组中数据一个一个的读入,就类似与一个杯子先接好一杯水,在传递给人,人再一次性的喝掉。

在返回数据的时候要要注意与上255,保留给数据的有效八位。当数据数据读取完了之后就直接返回-1

 

四.转换流

InputStreamReader和 OutputStreamWriter

是字节流通向字符流的桥梁

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

readLine方法是字符流BufferedReader类中方法,而键盘录入的read的方法是字节流InputStream的方法。那么能不能将字节流?

代码示例:

 public static void show_1()throws IOException{

              //获取键盘录入对象

              //InputStreamin = System.in;

              //字节流转化为字节流

              //InputStreamReaderisr = new InputStreamReader(in);

              //为了提高效率,将字符串进行缓冲区技术高效操作

              //BufferedReaderbufr = new BufferedReader(isr);

       //【键盘录入最常见写法】

              BufferedReader bufr =

                       new BufferedReader(newInputStreamReader(System.in));

//【读取字节流转换为字符流】

              BufferedWriterbufw =

                       new BufferedWriter(newOutputStreamWriter(System.out));

//【输出字节流转换为字符流】

       String line = null;

              while((line= bufr.readLine())!=null)

              {

                     if("over".equalsIgnoreCase(line))

                            break;

                     bufw.write(line.toUpperCase());

                     bufw.newLine();

                     bufw.flush();

              }

              bufr.close();

              bufw.close();

       }

五.流操作规律

(1)源和目的的明确

1.需求:将键盘输入的信息,显示在控制台上

源:键盘录入

目的:控制台

 

2.需求:想把键盘录入的数据存储在一个文件中

源:键盘

目的:一个文件

 

3.需求:想要将一个文件的数据打印在控制台上

源:文件

目的:控制台

(2)流操作的基本规律:通过三个明确来完成

1.明确源和目的

   源:输入流:InputStream  Reader

   目的:输出流:OutputStream  Writer

2.操作的数据是否是纯文本

   是:字符流

   否:字节流

3.当体系明确后,在明确使用那个具体的对象

   通过设备来进行区分

   源设备:内存,硬盘,键盘(System.in)

   目的设备:内存,硬盘,控制台(System.out)

 

扩展一下,可以把录入的数据按照指定的编码表,存在硬盘上。

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

 

示例

需求:要将键盘录入的信息在控制台上显示。

 

1.明确源和目的:

  源:键盘;   目的:控制台

2.使用操作文本,但是,源和目的的流对象已经确定一个是System.in,一个是System.out

  他们都是字节流对象。所以,就需要转换流,将其转换为字符流

3.是不是要提高效率,简化书写,要!则需要使用缓冲区技术

可得:

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

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

 

六.改变标准输入输出设备

System.setIn( InputStream in );

System.setOut( PrintStream out );




------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值