-----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
Java的I/O系统涉及流的概念,一个读取字节序列的对象被称为输入流,一个写入字节序列的对象称为输出流,程序读入数据,首先打开一个输入流,流以对象的形式存在,数据文件或网络链接信息包装在流对象内部,流对象一旦启动,程序可以从输入流依次读入数据,当程序要输出数据时,就打开一个输出流对象,该对象知道数据的目标文件位置,并将数据依次写入。在Java.io包中有各种流对象,按处理的对象不同可以分为字符流和字节流。
Java提供了两个处理字节数据的接口InputStream和OutputStream,并提供read()每个实现该类的子类都必须重写该方法,InputStream表示从不同的输入源输入数据的类,可以是字节数组,String对象,类的序列化对象,不同的数据有相应的实现类来操作,其中有2个最常用的子类FileInputStream和FileOutputStream,实现方式如下:
class StreamDemo
{
public static void main(String[] args)throws IOException
{
FileInputStream fis=new FileInputStream("0.jpg");
FileOutputStream fos=new FileOutputStream("1.jpg");
int ch;
while((ch=fis.read())!=-1)
{
fos.write((char)ch);
}
byte[] buf=new byte[1024];
int line;
while((line=fis.read(buf))!=-1)
{
fos.write(buf,0,line);
}//第一种读取字节的方式
/*第二种读取发送,一次读一个数组
byte[] buf=new byte[fis.available()];
fis.read(buf);
fos.write(buf);
sop(new String(buf));*/
}}
在Java的IO技术中引用了装饰模式,通过缓冲区提高读取字节的效率,实现方式如下:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("0.jpg"));
BufferedOutputStream fos=new BufferedOutputStream(new FileOutputStream("1.jpg"));
为了能简单读取字符数据,Java提供了两个字符流,Reader和Writer接口,两个常用的子类是FileReader和FileWriter,实现方式如下:
public class IODemo {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new FileReader("MainClass.java"));
BufferedWriter wr = new BufferedWriter(new FileWriter("Copy1.txt"));
String line;
while((line=br.ReadLine())!=null){//字符缓冲区提供一次读一行的方法
System.out.println(line);
wr.write(line);
wr.newLine();//字符缓冲区提供换行的方法,支持跨平台
}
br.close();//数据读写完毕后,流对象必须关闭,避免占用系统资源
wr.close();
其实字符流底层就是用字节流实现。
在Java的IO技术中引用了装饰模式,通过缓冲区提高读取字节的效率,实现方式如下:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("0.jpg"));
BufferedOutputStream fos=new BufferedOutputStream(new FileOutputStream("1.jpg"));
缓冲区的实现原理其实就是在其内部封装一个数组,用一次读写批量数据的方式提高读写效率,在此,简单模拟一个缓冲区,实现相同的功能,
class MyBufferedReader extends Reader{
private Reader r;
MyBufferedReader(Reader r){
this.r = r;
}
public void close() throws IOException {
r.close();
}
public int read(char[] cbuf, int off, int len) throws IOException {
return r.read(cbuf, off, len);
}
public String MyReadLine()throws IOException{
int ch;
String line;
char[] a = new char[1024];
while((ch = r.read(a))!=-1){
return new String(a,0,ch);
}
return null;
}
}
那么如何实现字符流与字节流的转换呢,Java也定义的一种方式就是转换流,他们都是字符流的子类,InputStreamReader(将字节流读到字符流中)和OutputStreamWriter(将字符流写入到字节流中),因为键盘录入的是字节流,所以可用以下实现方式:
BufferedReader bfr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw =
new BufferedWriter(new OutputStreamWriter(System.out));
为了解决各种数据的读写,Java中还提供了其他的流对象,如InpuStream的子类ByteArrayInputStream(字节数组读取流),pipedInputStream(管道流),SequenceInputStream(序列化输入流),StringbufferInputStream(字符串缓冲输入流),ObjectInputStream(对象输入流),FilterInputStream(过滤器输入流),以及对应的输出流;
实际上Java的IO流处理底层都调用了windows系统资源,所以当读写程序结束后必须调用close方法关闭流,节省资源。
-----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
详情请查看:http://edu.csdn.net/heima