黑马程序员- IO流(下)

本文详细介绍了Java中的IO流概念,包括字符流与字节流之间的转换方法,如使用OutputStreamWriter和InputStreamReader。此外,还讲解了如何利用FileInputStream和FileOutputStream进行文件的读写操作,并提供了多个实例演示如何实现文件的复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3转换流

3.1OutputStreamWriter

  是字符通向字节流的桥梁。 本身是字符流 。
  当我们操作的是字节对象时,我们用到字节流

  String a="abf";



       FileOutputStream fos=new FileOutputStream("2345.txt");
       fos.write(a.getBytes());
       fos.close();
       System.out.print("chenggong");

``而当我们需要将字符数据写到字节流对象中去的时候我们就需要用到转换流,因为一般的字节流只能写字节数据。
public class OutputStreamWritertext{
public static void main(String arg[]) throws IOException{
String a=”abf”;

     OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("2345.txt"));

       osw.write(a);//直接写的是字符串
        osw.close();
       System.out.print("chenggong");

}
}

3.2 InputStreamReader

InputStreamReader : 是字节流通向字符流的桥梁。 本身是字符流。 使用指定的 charset
读取字节并将其解码为字符。它使用的字符集可以由名称指定或显示给定,或者接受平台默认的字符集。

键盘录入字符,打印在控台
`
public class InputStreamReader {
public static void main(String arg[]) throws IOException{
InputStreamReader isr=new InputStreamReader(System.in);
int line =0;
char[] a=new char[3];
while ((line=isr.read(a))!=-1) {
System.out.print(a);

    }
     isr.close();

}
}

输入端是字节流 ,可是我们读取的时候可以按照字符流来读取,实现了字节流到字符流的跨越


4字节流
====

4.1InputStream
---
   此抽象类表示字节输入流 字节输入流的所有类的超类。
   直 接 类 已 知 子 类 : : AudioInputStream,    ByteArrayInputStream, FileInputStream,
FilterInputStream, InputStream, ObjectInput

4.2FileInputStream
------------------
   方法 :
        read()  一次读取一个字节  
        FileInputStream fis = new FileInputStream("aaa.txt");   
        int b;                                                
        while((b = fis.read()) != -1) {                 
          System.out.println(b);                 //打印每一个字节
}

fis.close();                                            //关闭流释放资源

4.3      FileOutputStream
     方法 :
           write() 一次写出一个字节  

这里写代码片
FileOutputStream fos = new FileOutputStream(“test.txt”);
//fos.write(97); //虽然写出的是一个int数,但是在写出的时候会将前面的24个0去掉,所以写出的一个byte
fos.write(98);
fos.write(99);
fos.close();

练习1 : 拷贝图片

FileInputStream fis = new FileInputStream("故乡.mp3");   
FileOutputStream fos = new FileOutputStream("copy.mp3");

int b;
while((b = fis.read()) != -1) {
    fos.write(b);
}

fis.close();
fos.close();

int read(byte[] b):一次读取一个字节数组
write(byte[] b):一次写出一个字节数组
available()获取读的文件所有的字节个数

练习 2 用读取数组的方式拷贝图片

FileInputStream fis = new FileInputStream("故乡.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
byte[] arr = new byte[fis.available()];      
fis.read(arr);                          
fos.write(arr);                   
fis.close();
fos.close();

练习三 :用自定义字节数组 复制图片

FileInputStream fis = new FileInputStream("故乡.mp3"); FileOutputStream fos = new FileOutputStream("copy.mp3"); int len; 
byte[] arr = new byte[1024 * 8];        //自定义字节数组
while((len = fis.read(arr)) != -1) { //fos.write(arr); fos.write(arr, 0, len);        //写出字节数组写出有效个字节个数 }
fis.close();
 fos.close();




5 装饰者模式
-------
装饰设计模式是一种思想,简单理解是构造函数(已有类对象)传递,进行功能增强。
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,
提供加强功能。那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象;并基于被装饰的对象的功能,提供更强
的功能。
eg:以人吃饭为例,吃饭功能增强就是装饰设计模式思想。请参考 PersonDemo.java
装饰 设计模式的思想类似于继承,但有 区别 :
1  装饰设计模式比继承灵活性更强。避免了继承体系臃肿。而且降低了类与类之间的关
系。
2 装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中(也就是属于同一父类或同一接口) 。
 3 装饰设计模式是从继承体系结构变成了组成体系结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值