黑马程序员——第十二篇:字节流、字符流

  ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a

  href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

1、字节流进行文件复制

  1:字节输入流,读取数据源字节

    FileInputStream 读取1个字节

  2:字节输出流,写入数据目的字节

FileOutputStream 1个字节

2. FileInputStream读取文件

  int read() 每次读取1个字节,返回int

  文件结尾返回-1

 

  read()方法重载形式

 

  1int read(byte[] b)

   方法中传递字节数组,流对象,将读取到的字节存储数组中

   实现缓冲区作用,提高效率

 

   int 返回值作用

   数组里面存储的又是什么

 

   InputStream,读取字节数组方式

   int fis.read(bytes) 返回每次读取,存储数组的有效个数

   OutputStream,写字节数组

 

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

写字节数组,0开始,写几个,有效个数

2:程序Demo 用字节数组复制文件

 

public class CopyFile_1 {

    public static void main(String[] args) {

       FileInputStream fis = null;

       FileOutputStream fos = null;

       try {

           fis = new FileInputStream("E:\\t.jpg");

           fos = new FileOutputStream("d:\\t.jpg");

           // 定义字节数组,长度1024整数倍

           byte[] bytes = new byte[1024];

           int len = 0;

           while ((len = fis.read(bytes)) != -1) {

              // fos流写字节数组

              fos.write(bytes, 0, len);

           }

       } catch (IOException ex) {

           ex.printStackTrace();

           throw new RuntimeException("复制失败");

       } finally {

           try {

              if (fis != null)

                  fis.close();

           } catch (IOException ex) {

              throw new RuntimeException("释放资源失败");

           } finally {

              try {

                  if (fos != null)

                     fos.close();

              } catch (IOException ex) {

                  throw new RuntimeException("释放资源失败");

              }

           }

       }

    }

}

3. IO中的缓冲流对象

   读写数组,速度比读写单个字节快

 

   JDK设计的时候,也考虑到效率问题,因此开发好了缓冲区流对象,

   提高效率

 

   1. BufferedOutputStream

     字节输出流缓冲区对象,目的提高字节输出流的写入效率

 

     BufferedOutputStream继承OutputStream

     写的方法write,已经不需要学习了

 

     构造方法:

       BufferedOutputStream(OutputStream out)

       传递的是OutputStream任意子类对象,可以传递任何字节输出流

       为什么要传递字节输出流,BufferedOutputStream提高效率

       提高谁的效率,构造方法中,传递的是谁,就提高谁

 

       BufferedOutputStream(new FileOutputStream())

 

      原理,自身有字节数组,我们写的数据,直接写在他的数组中

      一次性写入文件中

 

   2. BufferedInputStream

     字节输入流对象,目的提高字节输入流的读取效率

 

     BufferedInputStream继承InputStream

     读取方法,不需要学习,读取单个字节,读取字节数组

 

     构造方法:

       BufferedInputStream(InputStream in)

       传递的是InputStream任意子类对象,可以传递任意的字节输入流

       传递的是谁,就对谁提高效率

 

       new BufferedInputStream(new FileInputStream())

3. 程序Demo:缓冲字节流复制文件

public class CopyFile_2 {

    public static void main(String[] args) {

       // 创建2个缓冲区流的变量,=null

       BufferedInputStream bis = null;

       BufferedOutputStream bos = null;

       try {

           // 创建字节流缓冲区对象,传递字节流

           bis = new BufferedInputStream(new FileInputStream("e:\\t.jpg"));

 

           // 创建字节输出流缓冲区对象,传递字节输出流

           bos = new BufferedOutputStream(new FileOutputStream("d:\\t.jpg"));

 

           // 读写单个字节

           int len = 0;

           while ((len = bis.read()) != -1) {

              bos.write(len);

           }

       } catch (IOException ex) {

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

       } finally {

           try {

              if (bis != null)

                  bis.close();

           } catch (IOException ex) {

              throw new RuntimeException("释放资源失败");

           } finally {

              try {

                  if (bos != null)

                     bos.close();

              } catch (IOException ex) {

                  throw new RuntimeException("释放资源失败");

              }

           }

       }

    }

}

4、字符编码

  1. 编码表的由来

    计算机电信号,变成数字信号,01

    让算计机直接识别人类文件

    美国,制定编码表,让人类的文字对应数字

    97 字母 a

    98 字母 b

    47 数字 0

 

    ASCII编码表: 数字,字母,符号

 

  2. 简体中文编码表

    数字对应汉字

    两个数字,两个字节对应1个汉字,汉字采用负数表示

    汉字两个字节,第一个字节肯定是负数,第二个字节可能是正数,可能是负数

    出现第一张简体中文编码表  GB2312, Windows 95-98  Windows3.X

    汉字存储量少,4000个汉字

 

    编码扩容,汉字数量20000, GBK 2000-10

    Windows中文版系统,默认编码表都是GBK

 

    再一次扩容, GB18030

 

   3. Big5

    大五码, 繁体中文编码表,香港,澳门,台湾

 

   4. ISO8859-1编码表

    拉丁文编码表

    编码表中没有中文

    JavaWeb,程序运行在互联网的世界

    网络服务器软件, Apache Tomcat(拉丁文)

  

   5. Unicode万国码

     国际标准化组织,让一张码表融合全球所有语言

     Unicode采用2个字节存储1个汉字,

     Java中的char,就是Unicode

  

   6. UTF-8编码表

     万国码,汉字采用3个字节存储

 

     ,GBK,UTF-8

 

     开发中文版程序的困难

 

     浏览器混乱:

      IE FireFox Chrome Safari Opera

5. 字符串的编码和解码

  1. 字符串的编码

    将看的懂的,变成看不懂的

    字符串转成字节数组

 

  2. 字符串的解码

    将看不懂,变成看的懂的

    字节数组变成字符串

 

    编码: String类方法getBytes()

    解码: String类构造方法

6、字符流

  读写纯文本文件,中文也行

  1. OutputStreamWriter 转换流

   OutputStreamWriter 继承Writer

   写的方法 write 字符,字符数组,字符数组一个部分,写字符串

 

   作用: 字符流向字节的桥梁, 字符转成字节

 

   构造方法:

     OutputStreamWriter(OutputStream out)

     传递任意的字节输出流

     OutputStreamWriter,将数据变成字节,写入传递的字节流中

 

     new OutputStreamWriter(new FileOutputStream())

 

     OutputStreamWriter(OutputStream out,String 编码表名)

 

   发现现象: 字节流,还是字符流,写数据方法都是write

   区别: 字节流写的是byte

         字符流写的是char, String

         程序Demo:(字符流写出数据):

分析步骤:

/*

 * OutputStreamWriter 写数据

 * 1. 创建转换流对象,传递字节输出流

 * 2. 调用转换流对象方法write写数据字符,字符串,字符数组

 *  

 * 3. 刷新, 所有的字符流输出的,必须刷新flush

 *  

 * 4. 关闭资源

 *   close() 先刷新,在关流

 *  

 *   注意: 字符输出流,写数据

 *   写一次,刷新一次

 *   write flush

 */

    /*

     * OutputStreamWriter写数据,默认编码GBK

     */

    public static void writeGBK() throws IOException {

       // 创建转换流对象,封装字节输出流

       OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c:\\gbk.txt"));

       // 写字符串

       osw.write("你好");

       osw.close();

    }

 

    /*

     * OutputStreamWriter写数据,采用UTF-8编码表转换流构造方法中,加编码表名字

     */

    public static void writeUTF8() throws IOException {

       // 创建转换流对象,封装字节输出流

       OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c:\\utf.txt"), "UTF-8");

       // 写字符串

       osw.write("你好");

       osw.close();

    }

 

   2. InputStreamReader 转换流

     InputStreamReader继承Reader

     读取的方法read,读取单个字符,读取字符数组

 

     作用: 字节流向字符的桥梁

 

     构造方法:

       InputStreamReader(InputStream in)

       传递任意字节输入流,转换流从传递字节输入流中,读取数据

       自己会进行自己的判断,如果是负数字节,让字节流再次读取

 

       new InputStreamReader( new FileInputStream())

 

       InputStreamReader(InputStream in,String 编码表名字)

         程序Demo:(字符数组读入文件)

    public static void method_1()throws IOException{

       //创建字节输入流,包装文件

       FileInputStream fis = new FileInputStream("c:\\1.txt");

       //创建转换流对象,传递字节输入流

       InputStreamReader isr = new InputStreamReader(fis);

       //定义字符数组

       char[] cbuf = new char[1024];

       int len = 0 ;

       while((len = isr.read(cbuf))!=-1){

           System.out.println(new String(cbuf,0,len));

       }

       isr.close();

    }

        

     * 转换流,InputStreamRrader读取文件

     * 采用UTF-8编码表

     * 转换流的构造方法中,写字符串编码表名字

     */

    public static void readUTF()throws IOException{

       //创建转换流对象 ,传递字节输入流,指定编码表名字

       InputStreamReader isr = new

InputStreamReader(new FileInputStream("c:\\utf.txt"),"utf-8");

       char[] cbuf = new char[1024];

       int len = 0 ;

       while((len = isr.read(cbuf))!=-1){

           System.out.println(new String(cbuf,0,len));

       }

       isr.close();

    }

7. 转换流的便捷类

  1. OutputStreamWriter

   子类  FileWriter, 继承OutputStreamWriter

   FileWriterOutputStreamWriter类便捷写法

 

   前提: 操作的文件必须是操作系统中的默认编码表才可以

 

   FileWriter 构造方法

     FileWriter(File file)传递File对象,写入目的

     FileWriter(String filename)传递字符串文件名

         程序Demo:(转换流便捷类写出文件)

 

public class FileWriterDemo {

    public static void main(String[] args) throws IOException {

       FileWriter fw = new FileWriter("c:\\abc.txt");

       fw.write("你好吗");

       fw.flush();

 

       char[] arr = "今天还行是吧,好像没什么事情".toCharArray();

       fw.write(arr);

       fw.flush();

 

       fw.write(arr, 3, 4);

       fw.flush();

       fw.close();

    }

}

 

  2. InputStreamReader

   子类 FileReader,继承InputStreamReader

   FileReader类是InputStreamReader类便捷写法

 

   前提: 操作的文件必须是操作系统中的默认编码表才可以

 

   构造方法

     FileReader(File file)传递File对象,读取数据源

     FileReader(String filename) 传递字符串文件名,读取数据源

   读取方法:

     read() 1个字符,

     read(char[] c)字符数组

程序Demo:(转换流读入文件)

 

public class FileReaderDemo {

    public static void main(String[] args)throws IOException {

       FileReader fr = new FileReader("c:\\abc.txt");

       int len = 0 ;

       char[] cbuf = new char[1024];

       while((len = fr.read(cbuf))!=-1){

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

       }

       fr.close();

    }

}



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mopria Print Service 2.3推出新的移动打印功能,支持用户使用 安卓设备的“分享”功能进行打印 拓展移动打印功能,方便用户使用其最喜爱的应用程序中的“分享”选项打印照片、文本 、网页等 加州圣拉蒙 – 2017年11月15日– 致力于推动全行业移动打印标准的全球非盈利性会员制组织 Mopria®联盟今日发布Mopria Print Service 2.3,以扩大移动打印支持,允许用户使用诸多最喜爱的 应用程序中的“分享”功能进行打印。此外,Mopria Print Service 2.3还与Android 8.0 Oreo™兼容,后 者的默认打印解决方案采用Mopria核心技术,支持通过1亿多台经Mopria认证的打印机实现轻松移 动打印。所有安卓设备可在Google Play™商店下载其最新版。 Mopria Print Service 2.3利用Facebook、Flipboard、LinkedIn、Twitter和Pinterest等诸多 备受欢迎的应用中现有的“分享”功能,使用户能够轻松打印。当使用“分享”功能时,用户 将看到其中包含Mopria Print Service选项,该选项位于电子邮件和消息选项下方。“分享” 图标位于醒目位置,用户只需选择Mopria Print Service选项、选择打印机、调整设置并 打印即可。 该新版本还支持沿多个方向打孔、折边、装订等分页装订选项,同时提供新界面,新增一 项便于用户快速查看可供使用的打印机并确定其状态的功能。该新界面提供便捷的起点, 方便用户添加或隐藏打印机、访问Mopria设置、排除打印故障以及查看经Mopria认证的 打印机列表。该新界面包含教程,已将这一用户请求最多的功能添加至该项服务中,为新 用户提供移动打印流程指导及建议。 Mopria联盟指导委员会主席Brent Richtsmeier表示:“我们将继续为Mopria Print Service 添加功能,旨在使安卓设备的移动打印体验尽可能轻松便捷。利用全球最受欢迎的应用中 的分享功能中新增的打印选项,用户将重新发现移动打印的便利。” 自发布以来,Mopria Print Service已支持通过安卓智能手机和平板电脑连接经Mopria认 证的打印机实现打印。Mopria Print Service允许用户轻松自定义彩色打印、打印份数、 双面打印、纸张尺寸、页面打印范围、介质类型和打印方向等打印设置,同时还可以定制 用户身份验证、点针式打印和会计功能等工作场所功能,而且不需要安装特定打印机品牌 的应用程序。 自创始人佳能、惠普、三星和施乐成立Mopria联盟以来的四年里,该非盈利性会员制组 织成员已增加至21个,他们代表着全球打印机行业。除创始公司之外,Mopria联盟目前 包括:Adobe、柯尼卡美能达、高通、利盟、京瓷、东芝、Brother、爱普生、富士施乐 、微软、NEC、Pantum、理光、YSoft、夏普、戴尔和致伸科技(Primax)。 Mopria技术目前设备安装数量已超过7亿台,预计不出一年便会超过10亿台。在继续努力 使移动打印变得轻松便捷的同时,Mopria联盟还将进一步专注于云打印和扫描标准化。 Mopria联盟的目标在于促使这些解决方案为消费者和企业用户变得更加方便可及、直观 简便。如需获取经Mopria认证的打印机和打印附件的最新列表,敬请访问: http://mopria.org/certified-products。 关于Mopria®联盟 Mopria®联盟是一个非盈利性会员制组织,由全球领先的科技公司组成,其成立初衷为简 化智能手机、平板电脑和其他设备的打印操作。该联盟制定并推广一系列技术标准,旨在 提供连接不同设备和移动操作系统的直观体验。这些标准的普及使用户能够与各种品牌的 打印机进行无缝交互。此外,对新移动设备或打印机而言,将无需进行应用程序的下载和 安装。利用支持Mopria的移动设备寻找经Mopria认证的打印机和附件实现轻松打印,可 在www.mopria.org了解详情或者在Google Play商店下载最新版Mopria软件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值