Io流

来源:互联网 发布:什么是java多线程 编辑:程序博客网 时间:2024/06/06 05:08
缓冲区的原理:
1,使用了底层流对象从具体设备获取数据,并将存储到缓冲区中的数组内。
2,可以通过缓冲区的read方法,从缓冲区中来获取具体的字符数据。
3,如果用read()方法读取字符数据,并存储到另一个容器中,直到读取到了换行符时,另一个容器中临时存储的数据准成字符串返回,就形成了readline()功能。

IO流,字符流

装饰设计模式:
需求:提高读取文本的效率,使用缓冲技术,提供一个读取文本更高效的读取方法。覆盖TextReader中的方法。建立高效的read方法。
 
解决问题:解决给一组类增加功能,避免继承的臃肿,提高灵活性。 

解决前:继承体系:
Reader--TextReader--BufferedTextReader
Reader--MediaReader--BufferMediaReader

解决后:
Reader
---TextReader
---MediaReader
-------BufferedReader

注意:装饰类和被装饰类,必须所属于同一个体系。通常装饰类都会提供构造函数接收被装饰类的对象。
装饰类通常不单独存在。

举例:
房子:(居住功能)
-----毛坯楼房  居住(){普通}
-----毛坯平房
-----田园风光房

class  田园风光房() extends 房子{
田园风光房(房子){
}
  居住(){
田园风光的居住,惬意!
}
}
毛坯楼房   x = new 毛坯楼房();
x.居住();普通
田园风光房 y = new 田园风光房(x);
y.居住();普通+惬意。

键盘录入::
字节流:
FileInputStream   FileOutputStream 
BufferInputStream  BufferOutputStream
字符流:
FileReader  FileWriter
InputStreamReader  OutputStreamWriter
BufferedReader  BufferedWriter

所学对象都是用于操作文件中的数据对象,可以进行字符编码转换的。

将键盘录入的数据存储到文件中。

System.in:获取键盘录入的输入流对象。
该流可以不用关闭。
InputStream in = System.in;
System的read方法:从输入流读取数据下一个字节,返回0到255范围内的int字节值,如果已经到达流末尾而没有可用的字节,则返回-1;在输入数据可用,检测到流末尾或者抛出异常前,此方法一直阻塞。

IO流中对象的使用规律总结:
解决问题时(处理设备上的数据时)到底该用哪一个对象?
1,明确要操作的数据是数据源还是数据目的。
若是数据源:则能用的:InputStream  Reader。(读数据)
若是目的:OutputStream  writer(写数据)
先根据需求,明确了要读还是要写。
2,要操作的数据的设备上的数据是字节还是文本?
源数据为字节:InputStream
源数据为文本:reader
目的数据为字节:OutputStream
目的数据问文本:Writer
3,已经明确体系开始寻找要使用的对象:
明确数据所在具体设备?
源设备:
硬盘:文件,File开头。
内存:数组,字符串,常用。
键盘:System.in
网络:Socket(插座)
目的设备:
硬盘:文件,File开头。
内存:数组,字符串,常用。
屏幕:System.Out
网络:Socket
完全可以明确具体要使用哪个流对象。
4,是否需要额外功能?
额外功能:
是否需要转换?需要,则用转换流。InputStreamReader,OutputStream
高效?需要则用缓冲区对象。BufferedXXX
有多个源吗?序列流。SequenceInputStream
对象需要序列化吗?ObjectInputStream,ObjectOutputStream
需要操作基本类型数据保证字节原样性吗?DataOutputStream  DataInputStream。
--------------------------------
源和目的都是内存的流对象:
字节流:ByteArrayInputStream, ByteArrayOutputStream
字符流:
CharArrayReader   CharArrayWriter
StringReader   StringWriter
原理其实通过流的read,write方法对数组以及字符串进行操作。
关闭这些流都是无效的,因为并未调用系统资源,不需要抛出IOException。
---------------------------------
需求0:将字符串写入到文件中。
明确1:
源:字符串String,可以不使用IO,定义好字符串就可以了。
目的:文件,使用IO,写入,应使用输出流。OutputStream,Writer。
明确2:源数据:是文本数据 reader。目的:Writer。
明确3:目的设备:(文件)硬盘,File开头的流对象且应是Writer体系中的。明确FileWriter:FileWriter fw = new FileWriter("a.txt");
fw.write(String);
明确4:需要高效:使用缓冲区对象:
BufferedWriter bw = new BufferedWriter(new FileWriter(“a.txt”));
bw.write(String);
bw.newLine();
bw.flush();

需求1:复制一个文本文件。
1,源:InputStream  Reader
  目的:OutputStream writer
2,是纯文本数据吗?是的
  源:reader
  目的:writer
若仅做复制动作,则不需要考虑数据是字节,还是文本。直接使用字节流。
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
如在复制中,需要对文本中的字符数据进行操作,必须使用字符流。
3,具体的设备:
源:硬盘。File开头对象FileReader
目的设备:硬盘:File开头对象FileWriter。
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
4:需要额外功能吗?
需要,高效。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
String line = bufr.readLine();
line = line.replace("nba","美国职业篮球大联盟");
bufw.write(line);
bufw.flush();
bufw.close();


需求2,读取键盘录入数据将数据存储到文件中。
1,源:InputStream,Reader,目的:OutputStream  Writer
2,文本数据,源:reader,目的:Writer。
3,具体设备:源:键盘(System.in),目的:硬盘(FileWriter)。
InputStream in = System.in;
FileWriter fw = new FileWriter("a.txt");
Byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
fw.write(str);
4,需要额外功能:
需要转换:因为明确源的体系是Reader,具体设备时System.in(字节流),需要转换功能,将字节流转换成字符流。字节---》字符。
InputStreamReader isr = new InputStreamReader(System.in);
FiltWriter fw = new FileWriter("a.txt");
需要高效:BufferReader bufr = new BufferReader(new InputStreamReader(System.in));
BufferWriter bufw = new BufferWriter(new FileWriter("a.txt"));

需求三:读取文本文件打印到屏幕上。
1,源:InputStream Reader。目的:OutputStream writer。
2,文本数据:源:reader,目的:Writer,
3,具体设备:源:硬盘,FileReader。目的:System.out;
FileReader fr = new FileReader("a.txt");
PrintStream out = System.out;
out.println();
4,额外功能:BufferReader bufr = new BufferReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferWriter(new OutputStreamWriter(System.out));

需求四:读取文件中文本数据,将数据按照utf-8方式存储到文件中。
1,源:InputStream   Reader,目的:OutputStream  Writer 
2,纯文本:Reader   目的:Writer;
3,具体设备:源:硬盘,FileReader。目的:硬盘:FileWriter。
FileReader Fr= new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
但不符合题中转换格式的要求:所以必须使用额外功能。
4,需要:转换:源数据不需要转,目的数据需要转。
FileReader fr = new FileReader("a.txt");//源数据不需要转换
OutputStreamWriter osw= new OutputStreamWriter(new FileWriter("b.txt"),"utf-8");
需要缓冲区:BufferReader bufr = new BufferReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8"));

0 0