JAVA之IO③

来源:互联网 发布:手机淘宝口令 编辑:程序博客网 时间:2024/06/06 02:17


1.转换流:
转换流的作用与使用
OutputStreamWriter:把字节输出流对象转成字符输出流对象
InputStreamReader:把字节输入流对象转成字符输入流对象
FileWriter和FileReader分别是OutputStreamWriter和InputStreamReader的直接子类,
而不是Writer和Reader的直接子类,区别于FileInputStream 和InputStream。


字符编码 new InputStreamReader(InputStream is);  这个采用的是系统默认编码 
new InputStreamReader(InputStream is,String charsetname); 可以指定编码

常用字符编码:
iso8859-1
utf-8
gbk
gb2312
gb18030
big5
---------------------------------
Writer
|--------OutputStreamWriter
|----------FileWriter

OutputStreamWriter
构造
new OutputStreamWriter(OutputStream os); 使用系统编码来进行写操作
new OutputStreamWriter(OutputSTream os,String charsetname); 使用指定的编码进行写操作.

-----------------------------------------------------------------------------------
关于编码:

关于乱码:出现原因,在不同的编码表中汉字它的码值不一样。

怎样获取一个码值:
gbk   utf-8

将一个字符------>变成byte[]    编码.
将一个byte[]----->字符         解码

在开发中处理编码
1.编码   getBytes(String charsetname);
2.解码    new String(byte[] b,String charsetname);

gbk编码是使用两个负数代表一个字符。
utf-8是使用三个负数来描述一个字符。

URL编码
URLEncoder.encode(String s,String charsetname); 编码
URLDecoder.decode(String s,String charsetname);解码


-------------------------------------------------------------------------
System.out.println();
System: 类
out:是System类中的一个静态属性 
println();

out:它的类型是PringStream

PrintStream它是一个字节输出流。
out它是一个字节输出流,它的目的地是控制台(也可以说是我们的屏幕)

在System类中还有一个属性 in.

它是InputStream类型的。

System.in它就是从键盘去读取信息。

总结:
System.in-----从标准输入设备(键盘)读取信息.
System.out----向标准输出设备(屏幕)输出信息

System.in它是InputStream类型.
System.out它是OutputStream类型.

这两个流就可以被转换流包装.

PrintStream它是一个打印流.可以向控制台上输出信息.
它的println()与write方法的区别.
1.println自动刷新   write需要手动刷新
2.println直接调用toString得到要打印的信息.
 write()它时行了操作  new String(code)


              将读取到的信息保存到一个文件中。通过OutputStreamWriter完成。
 
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("a.txt"));
 


2.通过InputStreamReader从这个文件中读取信息.
 
InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"));
               通过OutputStreamWriter向控制台输出读取到的信息。  
OutputStreamWriter osw=new OutputStreamWriter(System.out);

--------------------------------------------------
缓冲流---它也是一个复合流
缓冲流自带缓冲区。

BufferedReader 它是一个可以包装Reader的缓冲流。
构造
new BufferedReader(Reader r); 对Reader流进行了包装.
new BufferedReader(Reader r,int sz); 可以指定缓冲区大小.但是在开发中一般使用默认就可以。

其它方法
readLine(); 一次可以读取一行信息。
声明  public String readLine();
读取到的信息不包含\r \n.
如果返回值为null,代表读取末尾。

BufferedWrite
可以对字符输出流进行包装。
构造:
new BufferedWriter(Writer w)
new BufferedWriter(Writer w,int sz);

其它方法
newLine();写入一个换行符.



在java.io包下还有关于字节的缓冲流.
BufferedInputStream
BufferedOutputStream

------------------------------------------------------------------
关于复合流的总结:

转换流 InputStreamReader  OutputStreamWriter
作用:
1.在字节与字符之间转换
2.可以指定编码
缓冲流 BufferedReader BufferedWriter   BufferedInputStream  BufferedOutputStream.
作用:
内部自带缓冲区,我们可以通过缓冲流完成高效果读写操作。



复合流也叫包装流,它们是不能直接对源,目的地操作。它们是需要包装一个流,它们可以对流的功能进行改变。

-----------------------------------------------------------------------------------
PrintStream     PrintWriter
这两个流是打印流.
PrintStream永远不会产生IOException。

1.它们是用打印操作。它输出的目的地是根据参数来指定的.
两种目的地: File   OutputStream 
2.它们提供 print  println  printf方法。

关于在PrintStream中print方法与write方法的区别与联系

Print方法它的底层也是通过write方法完成,但是操作的流是一个BufferedWriter.
并且自动将缓冲区进行了刷新。

print方法会将参数按照原样输出.因为将参数 String.valueOf()。
而我们的write它在使用时,如果传递的是int值,会将其当成unicode码操作.
将字符显示在控制台上。

总结:
PrintStream
所有的print方法  print  println都会自动刷新.
write方法,如果参数是int类型不会刷新   参数如果是byte[] 可以刷新.

PrintStream,如果在使用时,  new PrintStream("a.txt");   new PrintStream(File file);
这时它底层使用的是FIleOutputStream完成的操作,它不需要进行刷新.

PrintWriter
如果在使用它时
new PrintWriter("a.txt");文件. 它的底层使用的是字符流,没有进行刷新。

new PrintWriter(Writer w,boolean autoflush);
如果在使用的是  println printf 是这样的方法,autoflush值为true,可以自动刷新.


PrintWriter总结:
1.如果调用println,创建PrintWriter时指定autoflush为ture,可以自动刷新.
2.print方法它是将信息原样输出. print(int num)
 write方法还是需要根据码值,得到对应的字符。  write(int code)
 
-------------------------------------------------
对于刷新问题:如果记不住,只要使用输出流操作,就手动刷新。


重要: print(97)----------------->97  
     write(97)----------------->a
-------------------------------------------------------------------------------------------------------
装饰设计模式
它解决的问题:可以对功能进行增强。

在前面的学习中,如果要对功能进行增强,通过继承重写来完成。


class Car{
void run(){}
}

class Bmw extends Car{
void run(){

}
}

class Benz extends Car{
void run(){

}
}

class Golf extends Car{
void run(){

}
}

对run行为进行增强,给其添加GPS.
可以通过创建子类,来对行为进行增强.
class GPSBmw extends Bmw{
void run(){
进行功能增强.
}
}

class GPSBenz extends Benz{
void run(){
进行功能增强.
}
}

class GPSColf extends Golf{
void run(){
进行功能增强.
}
}

以上方式对行为进行了增强,但是问题:每要增强一个就需要创建一个子类,进行重写。
那么就会产生类爆炸。不方便维护。

对于上面的问题,我们可以采用装饰模式解决。

步骤:
1.装饰类与被装饰类应该继承同一个父类或实现同一个接口。
2.在装饰类中应该保存一个被装饰类的引用。
3.对要进行功能增强的方法进行重写。

这是BufferedReader的伪代码。
public class BufferedReader{
private Reader in;

public BufferedReader(Reader in){
this.in=in;
}

public void read(){
.....
......
....
in.read();
}
}

我们学过的缓冲流BufferedReader,其实就是使用装饰模式,对所有的Reader流可以进行功能增强。

对于装饰模式要求掌握:
1.装饰模式的作用:功能增强.
2.装饰模式怎样实现:三步。


0 0