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

一、缓冲流和装饰模式

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

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

BufferedReader 的构造函数有两个:

---- BufferedReader(Reader in)

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

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

二、装饰设计模式

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

public class Teste3 {
public static void main(String[] args) {
Japan japan=new Japan();
NiceJapan niceJapan=new NiceJapan(japan);
niceJapan.speak();
}
}
class Japan{
void speak(){
System.out.println("我们都是好学生");
}
}
class NiceJapan{
NiceJapan(Japan japan){
this.japan=japan;
}
private Japan japan; //组合
void speak(){
System.out.println("清清嗓子");//其他动作
System.out.println("晃晃脑袋");
japan.speak();
System.out.println("磕几个头");
System.out.println("发几声惨叫");
}
}

三、字节流概述

在不考虑负数的情况下,每个字节中的数据,都是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 数组中。

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

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

补充:

前面,字符流有包装类

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。

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

五、 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 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中

//例子,使用 ByteArrayOutputStream
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
byteOut.write("这是放在虚拟内存中的数据".getBytes()); byte[] byteArray=byteOut.toByteArray();
String str=new String(byteArray);
System.out.println(str);
//加强
从输入流中,读取字符,然后把字符变成大写,写入到输出流中
public static void main(String[] args) throws IOException {
/* 示例1 用 ByteArrayInputStream 和 ByteArrayOutputStream
ByteArrayInputStream in=new ByteArrayInputStream("abcdef".getBytes());
ByteArrayOutputStream out=new ByteArrayOutputStream();
transform(in,out); byte [] contents=out.toByteArray();
String str=new String(contents);
System.out.println(str); */ // 示例2 用键盘输入输出流
transform(System.in,System.out); // 示例3 用文件输入输出流
InputStream in =new FileInputStream("c:/1.txt");
OutputStream out =new FileOutputStream("e:/big.txt"); transform(in,out); } static void transform(InputStream in,OutputStream out) throws IOException{
int ch=0;
while((ch=in.read())!=-1){
out.write(Character.toUpperCase(ch));
}
}

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. ABP 框架 数据库底层迁移 Mysql 集群

    技术交流,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 背景 笔者 目前架构的IOT 项目是使用abp 框架作为后台, ...

  2. VisualSVN 破解方法

    第一步,首先准备反汇编工具 ildasm.exe,找到VisualSVN的安装路径,一般先备份,在备份里面操作. 第二步,转储 , 得到同名的il文件:VisualSVN.Core.L.il,用记事本 ...

  3. 如何获取SQL中Print语句输出内容

    SqlConnection cn = new SqlConnection("server=my\\my2005;database=rdwhdata2005;user id=zjh;passw ...

  4. Mac 下查看端口是否被占用

    1. lsof -i :8080 2. netstat -anp tcp | grep 8080 3. nc -w 10 -n -z 127.0.0.1 8070-8090

  5. html-文件上传设置accept类型延时问题

       今天在做文件上传时,采用了jQuery的upload插件,使用过程中发现了一个很有意思也很头疼的问题. 上传按钮,第一次点击时瞬间就可以打开文件选择框,之后再点击则需要等待恐怖的8s以上. 百度 ...

  6. 组件基础(插槽slot)—Vue学习笔记

    刚开始我们淡淡提过<slot></slot>现在深入了解一下. slot可以进行父组件传值到子组件. 比如:我们将hiboy通过<slot>传递到组件中. < ...

  7. 条件变量 sync.Cond

    sync.Cond 条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用. sync.Cond 条件变量用来协调想要访问共享资源的那些线程,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻 ...

  8. 上台阶问题(递归,DFS)

    题目 一共39层台阶.如果我每一步迈上1个台阶或者两个台阶,先迈左脚,再迈右脚,然后左右交换,最后一步迈右脚,也就是一共要走偶数步,那么,上完39级台阶,有多少种不同的方法? 思路 采用递归的思想,边 ...

  9. Python多线程-Event(事件对象)

    Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...

  10. Linux驱动:I2C驱动编写要点

    继续上一篇博文没讲完的内容“针对 RepStart 型i2c设备的驱动模型”,其中涉及的内容有:i2c_client 的注册.i2c_driver 的注册.驱动程序的编写. 一.i2c 设备的注册分析 ...