A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fmi110 高级黑马   /  2015-8-9 23:45  /  332 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

IO

  1.         InputStream 常用方法:
  2.                 int available(); 返回此输入流(关联的文件)的字节数
  3.                 void close();
  4.                 int read(); 读取一个字节。返回 0 到 255 范围内的 int 字节值。
  5.                         读到末尾时返回 -1
  6.                 int read(byte[] b);读取字节数组长度的字节数
  7.                 int read(byte[] b,int offset,int len);
  8.                 long skip(long n);

  9. 装饰设计模式增强后的类:
  10.                 BufferedInputStream(InputStream in)
  11.                 BufferedOutputStream(OutputStream out)

  12. 练习:复制一张图片
  13. class StreamDemo
  14. {
  15.         public static void main(String[] s) throws IOException
  16.         {
  17.                 //读取流
  18.                 BufferedInputStream bufin = new BufferedInputStream(new InputStream("1.jpg"));
  19.                 //输出流
  20.                 BufferedOutputStream bufout = new BufferedOutputStream(new OutputStream("copy.jpg"));

  21.                 int by;//注意是  int 型

  22.                 while((by=bufin.read())!=-1)
  23.                 {
  24.                         bufout.write(by);
  25.                 }
  26.                 bufout.close();
  27.                 bufin.close();
  28.         }
  29. }

  30. 字节流的 read() 方法读取一个字节,但是返回的并不是byte类型,而是int类型的原因:

  31.         因为read方法读到文件末尾时,返回 -1 作为结束的标志。
  32.         而数据流中很容易出现多个连续1的情况,而连续8个1,就是-1,
  33.         此时将导致读取提前结束。

  34.         所以将读到的一个字节提升为int类型,但是只保留原字节,并将高位的字节填0
  35.         具体操作: by&255  或 by&&0xff

  36. 对于write()方法,虽然返回的是一个int型,但是实际它只写入低8位的一个字节,其余的丢弃。

  37. 简单的说,read()对读到的数据进行了提升,而write对操作的数据进行转换。


  38. 转换流:
  39.         特点:
  40.                 1、是字节流和字符流之间的桥梁
  41.                 2、该流对象中可以对读取到的字节数据进行指定编码表的编码转换

  42.         什么时候使用?
  43.                 1、字节和字符之间有转换动作时
  44.                 2、流操作的数据需要进行指定编码类型的编码时

  45.         具体的类:

  46.                 InputStreamReader:字节到字符的桥梁
  47.                 OutputStreamWriter:字符到字节的桥梁

  48.         这两个流的对象是字符流体系的成员。

  49.         它们有转换作用,同时本身又时字符流,所以在构造的时候,需要传递字节流对象

  50.         InputStreamReader 构造函数

  51.                 InputStreamReader(InputStream in)
  52.                         使用默认的字符集
  53.                 InputStreamReader(InputStream in, Charset cs)
  54.                         创建使用给定字符集的 InputStreamReader
  55.                 InputStreamReader(InputStream in, CharsetDecoder dec)
  56.                         创建使用给定字符集解码器的 InputStreamReader
  57.                 InputStreamReader(InputStream in, String charsetName)
  58.                         创建使用指定字符集的 InputStreamReader。

  59.                         String getEncoding();返回流使用的字符编码的名称

  60. 操作文本的字符流对象是转换流的子类
  61.        
  62.         Reader
  63.                 |--InputStreamReader
  64.                         |--FileReader  //构造函数中,并不能指定编码类型

  65.         Writer
  66.                 |--OutputStreamWriter
  67.                         |--FileWriter

  68.         转换流中的read 方法,已经融入了编码表,
  69.         在底层调用字节流的read方法时将获取一个或者多个字节数据进行临时存储,
  70.         并去对照指定的编码表,如果编码表没有指定,
  71.         则去查询默认的编码表。这样转换流的read方法就返回对应的字符。

  72.         转换流已经完成了编码转换的动作,对于直接操作文本文件的FileReader而言,就不
  73.         用在重新定义了,
  74.         只要继承该转换流,获取其方法,就可以直接操作文本文件中的字符数据了

  75. 注意:
  76.         在使用FileReader操作文本数据时,该对象使用的是默认的编码表
  77.         如果要指定编码表时,必须使用转换流。

  78.         FileReader fr = new FileReader("1.txt");//使用默认的编码表 GBK

  79.         InputStreamReader ins = new InputStreamReader(new FileInputStream("1.txt"),"GBK");

  80.         指定使用utf-8编码表
  81.         InputStreamReader ins = new InputStreamReader(new FileInputStream("1.txt"),"utf-8");
复制代码


8 个回复

正序浏览
好详细,加油,不错
回复 使用道具 举报
。。。。。。。。。。。。。。。。
回复 使用道具 举报
赞一个。总结的不错
回复 使用道具 举报
赞一个  赞一个   
回复 使用道具 举报
棒棒哒!!!
回复 使用道具 举报
还长好长
回复 使用道具 举报
自己看一下 复习
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马