黑马程序员——Java的IO流小结

来源:互联网 发布:厦门网络大学 编辑:程序博客网 时间:2024/06/05 00:46

---------------------- android培训、java培训、期待与您交流! ----------------------

当java程序需要从数据源读取数据时,我们就需要一个流来连接想要的数据用来读取,想输出数据时则还需要一个流来写。IO流分为字节流和字符流,字节流由InputStream和OutputStream处理,而字符流由Reader和Writer处理。数据可能来自文件,内存或者网路。

字符流的概述,所有的字符流操作类都继承自Reader或者Writer这两个抽象类。

输入流:CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。
StringReader:从内存中的字符串读入数据,以对数据进行流式读取。
FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码

输出流:CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。
StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
FileWriter:把数据写入文件。

为了提高IO流对数据的读写效率,在流的基础上增强流的功能,就出现了字符流缓冲区,在创建缓冲区之前必须要先有流对象。相对应的类BufferedReader和BufferedWrite。

FileWrite fw=new FileWrite("1.txt")

BufferedWrite bw=new BufferedWrite(fw);  

将流对象传递给一个缓冲区构造函数即可。而且只要使用缓冲区一定要记得刷新,关闭缓冲区时也会同时关闭流对象。这里提供了一个换行方法叫做newLine().输入一个换行符。

文件读取流的缓冲区定义方法。

FileReader fr=new FileReader("1.txt");

BufferedReader br=new BufferedReader(fr);

readLine()方法是用于读取一行的数据并返回一个String类型的数据,而且只返回有效数据不返回行终止符,当读到末尾时返回null;


这里讲述了一种设计模式:装饰设计模式,当一个类对象需要升级时,不再修改源代码,而是定义一个类通过构造方法接收被装饰的对象(原类对象),基于原来的功能提供增强的功能。避免了继承的臃肿并且给予更强大的功能。


字节流,字节流读写操作类都继承自InputStream和OutputStream。

InputStream:read()从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。如果因已到达流末尾而没有可用的字节,则返回值 -1。

OutputStream:write(int b)将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。

字节流同样使用了缓冲区

FileOutputStream fos=new FileOutputStream("1.txt");

BufferedOutputStream bufos=new BufferedOutputStream(fos);

FileInputStream fis=new FileInputStream("1.txt");

BufferedInputStream bufis=new BufferedInputStream(fis);

字节流通向字符流的桥梁就是读写转换流,利用缓冲区定义读写转换流

BufferedReader br=new BufferedReader(new InputStreamReade(System.in))

BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(Sysmte,out))

通过字节流复制文件

class CopyPic 
{
public static void main(String[] args) 
{
FileOutputStream fos =null;//定义写入流
FileInputStream fis =null;//定义读取流
try
{ //为两个流连接对象
fis = new FileInputStream("d:\\5.jpg");
fos = new FileOutputStream("d:\\7.jpg");
byte[] buf =new byte[1024];//定义一个数组作为缓冲区接收数据
int len =0;
while((len=fis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
}
catch (IOException e)
{
System.out.println("复制文件失败");
}
finally
{ //由于关闭两个流的操作可能引发IO异常,所以每个close方法都单独进行一次异常处理
try
{
if (fis!=null)
fis.close();
}
catch (IOException e)
{
System.out.println("读取失败");
}
try
{
if (fos!=null)
fos.close();
}
catch (IOException e)
{
System.out.println("写入失败");
}
}
}
}



---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
原创粉丝点击