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.装饰模式怎样实现:三步。
- JAVA之IO③
- JAVA之IO流
- JAVA之IO流(
- java之IO
- Java--(IO)之RandomAccessFile
- java基础之io
- java基础之IO
- java基础之IO
- Java之IO流
- java之IO
- java io之InputStream
- java IO之InputStream
- java IO之OutputStream
- java基础之IO
- java.io之文件
- Java之IO初识
- java之IO流
- Java之文件IO
- 路由之路由表查找算法概述-哈希/LC-Trie树/256-way-mtrie树
- innerHTML和.setTimeout()用法小结
- java多线程
- 用VC来学汇编
- Apache下FastCGI开发(重写文章)
- JAVA之IO③
- PRML学习笔记—第一章——1.3模型选择
- CSS选择器
- 压缩感知(Compressive Sensing)学习之(二)
- 我的IT成长路
- AJAX的介绍
- 光流跟踪总结
- VS删除成员变量
- linux 基本操作学习1