在java中,我们会经常碰到流这种概念,那么,流到底是什么呢?
在文件操作中,我们肯定会碰到inputstream 和 outputstream , reader和 writer这些非常抽象的类。在我们的计算机世界中,我们的数据对象都可以称作流。比如,我们传文件时,文件可以理解成一种流上传到计算机。下载时,文件也可以理解成一种流。相对程序而言,从程序中向外为outputstream,比如,向文件中写东西。从外部向程序内部传送,则成为inputstream。同理,writer,和reader也是相同的。
其中,inputstream 和 outputstream 为字节流,reader和 writer为字符流。
理解了概念,再来深入点吧。
Inputstream的派生类,fileinputstream, OutputStream的派生类,fileoutputstream,都是对文件操作的流。举个简单的例子吧。
File file = new File("D:/hello.txt");
FileInputStream inputStream = new FileInputStream(file);
while(true)
{
int n = inputStream.read();
if(n==0)
{
continue;
}
if (n==-1)
{
break;
}
System.out.println((char)n);//ABCD
}
Read方法,其中,inputstream.read()每次读取一个字节,并且转换为int 型返回。当然,还read也重载了其他方法,inputstream.read(byte[] buff),一次读取buff.length大小的数据,并且存放在buff中。
OutputStream使用不做演示。
这两种流已经实现了基本的功能,但是效率相对缓慢,每次读取或者写入都会操作文件。于是,更高效的流便产生了。BufferedInputStream和BufferedOutputStream。他们的内部都会产生一个内部缓冲区,提高了效率。
这里,借用别人的例子来说明下内部缓冲区:
你喝水的时候,不会是渴的时候才去饮水机一口一口的喝,而是用杯子接好,一口气喝完。正如文件操作一样,频繁的对文件操作必然会降低效率,BufferedInputStream内部的缓冲区会读取一部分当做储备;
举个简单的例子
File file = new File("D:/hello.txt");
FileInputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[]buff = new byte[1024];
while(true)
{
int n = bufferedInputStream.read(buff);
if(n==0)
{
continue;
}
if (n==-1)
{
break;
}
System.out.println(new String(buff,0,4));//ABCD
}
inputStream.close();
bufferedInputStream.close();
这次,我们用了bufferedinputstream.read(byte[ ]buff]) 这个函数,将数据读取到buff。
如果文件很大的话,此方法效率会很高;
说完了字节流,现在讲一下字符流,至于怎么理解,那就很简单了。字符流里面是字符为单位的,。。。我们可以将一个字节流转换成字符流。比如,可以将inputstream转换成inputstreamreader。
举个例子:此例子中,用reader读取了文件中的内容:ABCD.
File file = new File("D:/hello.txt");
FileInputStream inputStream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(inputStream);
while(true)
{
int n = reader.read();
if(n==0)
{
continue;
}
if (n==-1)
{
break;
}
System.out.println((char)n);//ABCD
}
inputStream.close();
同样,为了解决效率问题,我们将使用BufferedReader
File file = new File("D:/hello.txt");
FileInputStream inputStream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(inputStream);
BufferedReader reader2 = new BufferedReader(reader);
char[] buff = new char[1024];
while(true)
{
int n =reader2.read(buff);
if(n==0)
{
continue;
}
if (n==-1)
{
break;
}
System.out.println(new String(buff,0,n)); //ABCD
}
inputStream.close();