我是靠谱客的博主 香蕉仙人掌,最近开发中收集的这篇文章主要介绍黑马程序员——第十二篇:字节流、字符流,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  ------- <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();

    }

}



 

最后

以上就是香蕉仙人掌为你收集整理的黑马程序员——第十二篇:字节流、字符流的全部内容,希望文章能够帮你解决黑马程序员——第十二篇:字节流、字符流所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部