接着上一篇,继续做学习笔记。学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了。添加、修改、删除啥的,几行代码就可以搞定了。这只是我一个初学者的一点小心思,IO背后的大用处,相信还有很多很多。继续学习ing....

一、缓冲流和装饰模式

缓冲流(包装类),缓冲区的出现提高了对数据读写的效率,它可以用来对流进行包装,在流的基础上对流的功能进行了增强。和底层系统提供的缓冲区有什么区别?底层直接和目标设备交换数据,包装类中,通过被包装的对象。

BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

BufferedReader 的构造函数有两个:

---- BufferedReader(Reader in)

---- BufferedReader(Reader in, int sz) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。

  1. //例子 BufferedWriter 的使用
  2. FileWriter w=new FileWriter("2.txt");
  3. BufferedWriter bw=new BufferedWriter(w);
  4. bw.write("这是一行内容");
  5. bw.newLine(); //这是包装类提供的功能
  6. bw.write("这又是一行内容");
  7. bw.flush(); //用缓冲流,不要忘了flush()
  8. bw.close(); //它就相当于关闭 w,这么写了以后,就不用再写 w.close() 了
  1. //例子 BufferedReader 的使用
  2. public static void main(String[] args)throws IOException {
  3. List<String> nameList= demo2();
  4. for(String s:nameList)
  5. {
  6. System.out.println(s);
  7. }
  8. }
  9.  
  10. static List<String> demo2() throws IOException {
  11. List<String> nameList=new ArrayList<String>();
  12. FileReader r=new FileReader("C:/名单.txt");
  13. BufferedReader br=new BufferedReader(r);
  14. String str=null;
  15. while( (str=br.readLine())!=null ){
  16. nameList.add(str);
  17. }
  18. br.close();
  19. return nameList;
  20. }

二、装饰设计模式

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。当要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有对象的功能,并提供加强功能。那么自定义的该类就称为装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

  1. public class Teste3 {
  2. public static void main(String[] args) {
  3. Japan japan=new Japan();
  4. NiceJapan niceJapan=new NiceJapan(japan);
  5. niceJapan.speak();
  6. }
  7. }
  8. class Japan{
  9. void speak(){
  10. System.out.println("我们都是好学生");
  11. }
  12. }
  13. class NiceJapan{
  14. NiceJapan(Japan japan){
  15. this.japan=japan;
  16. }
  17. private Japan japan; //组合
  18. void speak(){
  19. System.out.println("清清嗓子");//其他动作
  20. System.out.println("晃晃脑袋");
  21. japan.speak();
  22. System.out.println("磕几个头");
  23. System.out.println("发几声惨叫");
  24. }
  25. }

三、字节流概述

在不考虑负数的情况下,每个字节中的数据,都是0-255之间的值(因为一个字节为8位,最大为255)

如果一个文件中的每个字节或每相邻的几个字节的数据都可以表示成某个字符,则可以将这个文件称为文本文件,其实这是二进制的一个特例。

(你可以打开一个记事本,然后把一张图片拉进去,会发现一大堆的乱码,它就是二进制的特例,图片上的信息有的能与码表对上就被显示出来,有的不能就乱了。这是因为,字节流操作的时候,操作单位都是以字节为单位进行的操作的对象不一定有码表对应。

概述:

1.所有字节输入流类都是抽象类InputStream的子类

int read() 从源中读取一个字节的数据,返回字节值

int read(byte b[])从源中试图读取b.length个字节到b中,返回实际读取的字节目

void close()关闭输入流

2.所有字节输出流类都是抽象类OutputStream的子类

void write(int n) 向输出流写入单个字节。

void write(byte b[])向输出流写入一个字节数组

void flush()把缓冲区中内容输出并清空缓冲区(刷新)

void close()关闭输出流

3.例子,使用字节流进行文件的读写

FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。

FileOutputStream 的write方法的几种重载形式如下:

//void write(byte[] b)  //注意返回类型是void

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

//void write(int b)     将指定字节写入此文件输出流。

//FileInputStream 的read方法的几种重载形式如下

//int read()   从此输入流中读取一个数据字节。 返回读到的字节,到尾返回-1

//int read(byte[] b)  从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中 返回读的字节数,到尾返回-1

//int read(byte[] b, int off, int len)  从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

//对于字节流来说,每次读到的就是一个字节,如果是英文,正好一个英文对应一个字节,如果中文,就可能对应两个字节

  1. static void demo1() throws IOException{
  2. OutputStream out=new FileOutputStream("c:/file1.txt");
  3. out.write("abcEnlish中国".getBytes()); //字节流不刷新也能写出去
  4. out.close();
  5.  
  6. InputStream in=new FileInputStream("c:/file1.txt");
  7. int ch=0;
  8. while((ch=in.read())!=-1 ){
  9. System.out.println((char)ch); //可以发现,如果是英文,能显示出来,但中文会乱码
  10. }
  11. in.close();
  12.  
  13. }
  1. //例子,用字节数组进行接收
  2. static void demo1()throws IOException {
  3. InputStream in=new FileInputStream("c:/名单.txt");
  4. byte [] buff=new byte[3]; //
  5. int len=0;
  6. while( (len=in.read(buff)) !=-1 ){
  7. String str=new String(buff,0,len);
  8. System.out.println(str); //有乱码
  9. }
  10. }
  1. //例子 available 的利用
  2. static void demo2()throws IOException{
  3. InputStream in=new FileInputStream("c:/名单.txt");
  4. byte [] buff=new byte[in.available()]; //in.available();当前流中还有多少个字节可读
  5. in.read(buff);
  6. System.out.println(new String(buff));
  7. in.close();
  8. }
  1. //例子.图片的复制
  2. static void demo3()throws IOException {
  3. InputStream in=new FileInputStream("C:\\image\\lengtu.jpg");
  4. byte [] buff=new byte[in.available()];
  5. in.read(buff);
  6.  
  7. OutputStream out=new FileOutputStream("E:/tuzi.jpg");
  8. out.write(buff);
  9. in.close();
  10. out.close();
  11. }

补充:

前面,字符流有包装类

BufferedReader,  BufferedWriter

字节流也有包装类

BufferedInputStream, BufferedOutputStream

四、转换流  InputStreamReader , OutputStreamWriter

把字节输入流转为字符输入流:

InputStreamReader

public class  InputStreamReader extends Reader

把字节输出流转为字符输出流:

OutputStreamWriter

public class OutputStreamWriter extends Writer

1) InputStreamReader

它有四个构造函数:

InputStreamReader(InputStream in)

InputStreamReader(InputStream in, Charset cs)

InputStreamReader(InputStream in, CharsetDecoder dec)  //CharsetDecoder 解码器

InputStreamReader(InputStream in, String charsetName)

2) OutputStreamWriter

它有四个构造函数:

OutputStreamWriter(OutputStream out) //创建使用默认字符编码的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, CharsetEncoder enc) // 创建使用给定字符集的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName) // 创建使用给定字符集编码器的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName) // 创建使用指定字符集的 OutputStreamWriter。

  1. //例子,用缓冲流包装转换流,转换流转换字节流
  2. InputStream in=new FileInputStream("c:/1.txt");
  3. InputStreamReader inputReader=new InputStreamReader(in);
  4. BufferedReader br=new BufferedReader(inputReader);
  5. String str=null;
  6. while((str=br.readLine())!=null){
  7. System.out.println(str);
  8. }
  1. //例子 从键盘读入数据,转成大写打印出来
  2. public static void main(String[] args) throws IOException {
  3. BufferedReader br=new BufferedReader( new InputStreamReader(System.in));
  4. String msg=null;
  5. while((msg=br.readLine())!=null){
  6. System.out.println(msg.toUpperCase());
  7. }
  8. }

五、 ByteArrayInputStream 与ByteArrayOutputStream

它是用来以IO流的方式,完成对字节数组内容的读写,支持类似内存虚拟文件或内存映象文件的功能。

关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。

//ByteArrayInputStream(byte[] buff)

//ByteArrayInputStream(byte[] buff,int offset,int length)

//ByteArrayOutStream () //没有传参,则默认创建一个32字节的缓冲区,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和toString()获取数据。

//ByteArrayOutStream(int size) 根据指定大小创建缓冲区

//ByteArrayOutStream 的  byte[] toByteArray() 创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中

  1. //例子,使用 ByteArrayOutputStream
  2. ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
  3. byteOut.write("这是放在虚拟内存中的数据".getBytes());
  4.  
  5. byte[] byteArray=byteOut.toByteArray();
  6. String str=new String(byteArray);
  7. System.out.println(str);
  1. //加强
  2. 从输入流中,读取字符,然后把字符变成大写,写入到输出流中
  3. public static void main(String[] args) throws IOException {
  4. /* 示例1 用 ByteArrayInputStream 和 ByteArrayOutputStream
  5. ByteArrayInputStream in=new ByteArrayInputStream("abcdef".getBytes());
  6. ByteArrayOutputStream out=new ByteArrayOutputStream();
  7. transform(in,out);
  8.  
  9. byte [] contents=out.toByteArray();
  10. String str=new String(contents);
  11. System.out.println(str); */
  12.  
  13. // 示例2 用键盘输入输出流
  14. transform(System.in,System.out);
  15.  
  16. // 示例3 用文件输入输出流
  17. InputStream in =new FileInputStream("c:/1.txt");
  18. OutputStream out =new FileOutputStream("e:/big.txt");
  19.  
  20. transform(in,out);
  21.  
  22. }
  23.  
  24. static void transform(InputStream in,OutputStream out) throws IOException{
  25. int ch=0;
  26. while((ch=in.read())!=-1){
  27. out.write(Character.toUpperCase(ch));
  28. }
  29. }

Java基础——iO(二)的更多相关文章

  1. Java基础---IO(二)--File类、Properties类、打印流、序列流(合并流)

    第一讲     File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作 3)File类的实例是不 ...

  2. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  3. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  4. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  5. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  6. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  7. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  8. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  9. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  10. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

随机推荐

  1. ASP .Net C# ---CSV导入导出

    CSV和Excel大致相同  复制下来 数据传到方法里面就可以了 /// <summary> /// DataTable数据写入CSV文件 /// </summary> /// ...

  2. C# Winform右下角弹窗方式

    [方法一] 第一步:winform项目创建完成后,添加一个窗口,命名为:Messages .(加上最开始的Form1,一共为两个窗口),双击主窗口进入后台代码 . 第二步:在Messages 窗口中添 ...

  3. JS中图片飞飞效果

    当鼠标在界面上移动的时候,后面有一连串的图片跟随者一起飘动,效果如下: 实现的基本思想:准备五个img标签,为了方便控制都放在一个div里面,设置div的定位方式为 fixed,设置成这中定位方式主要 ...

  4. linux03

    linux day31.正则表达式 \* ------重复0无数次 \+ ------重复1 无数次 ^ -------开头 $ -------结尾 | ------或 & ----- 与 ( ...

  5. 伪装为 吃鸡账号获取器 的QQ木马分析

    本文作者:i春秋作家坏猫叔叔 0×01 起因随着吃鸡热潮的来临,各种各样的吃鸡辅助和账号交易也在互联网的灰色地带迅速繁殖滋生.其中有真有假,也不乏心怀鬼胎的“放马人”.吃过晚饭后在一个论坛看到了这样一 ...

  6. Unable to preventDefault inside passive event listener due to target being treated as passive?

    使用滚动时候,新版google浏览器,会弹出如下的警告. 解决方法,可以加上* { touch-action: none; } 这句样式去掉. 其原因:https://developers.googl ...

  7. 组件基础(参数校验和动态组件、v-once)—Vue学习笔记

    最最最后一点关于组件传值的问题. 提醒:本篇内容请使用Vue.js开发版!(附带完成的警告和提示) 1.组件的参数校验 父组件向子组件传值,子组件可以决定传值的一些限制. 比如,子组件指向接收Stri ...

  8. Docker三剑客之Docker Compose

    一.什么是Docker Compose Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/comp ...

  9. 通过XMLHttpRequest和jQuery两种方式实现ajax

    一.XMLHttpRequest实现获取数据 不使用jQuery实现页面不刷新获取内容的方式,我们这里采用XMLHttpRequest原生代码实现:js代码如下: //1.获取a节点,并为其添加Onc ...

  10. 匿名类、包、权限修饰符_DAY10

    1:内部类(理解) (1)把类定义在一个类的内部. (2)特点:   A:内部类可以直接使用外部类的成员,包括私有.   B:外部类要使用内部类成员,必须创建对象使用.    例子: public c ...