------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
IO流
一、IO流的概述
IO是input和output的简写,代表着输入和输出,他用来处理设备之间的数据传输,而java中对数据的操作就是通过流的方式,java用于操作流的对象都在IO包中。流按照造作数据分为两种:字符流和字节流;流按照流向也分为两种:输入流和输出流。
二、字符流
字符流的两个基类分别为:Reader和Writer。
FileWriter:字符流中的文件输出流。
使用FileWriter往文件中写数据:
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定的目录下,如果该目录下已有同名文件,将被//覆盖。
FileWriter fw=new FileWriter("demo.txt");
//或
FileWriter fw=new FileWriter("demo.txt",true);
//使用后者传递一个true参数则不会覆盖已有文件,而是将数据添加到文件末尾处。
//调用write方法,将字符串写入流中。
fw.write("abcde");
//刷新流对象中缓冲中的数据,将数据写入目的地中。
fw.flush();
//关闭流资源,关闭前刷新缓冲中的数据。
fw.close();
FileReader:字符流中的文件输入流
使用FileReader读取文件中的数据:
//创建一个FileReader对象,和指定名称的文件相关联,要保证该文件时已经存在的。
FileReader fr=new FileReader("demo.txt");
//调用读取流对象的读取方法。
fr.read();//读取单个字符,返回int型数字,独到末尾时返回-1
//或
fr.fead(char[] cbuf);//数组长度个数的字符,存入数组,返回读取的个数
//使用循环读取多个字符
int ch=0;
while(true)
{
if((ch=fr.read())!=-1)
System.out.print((char)ch);
}
//使用数组的方式读取字符
char[] buf =new char[1024];
int num=0;
while((num==fr.read(buf))!=-1)
{
System.out.print(new String(buf,0,num));
}
//关闭流资源。
fr.close();
三、字符流的缓冲区
缓冲区的出现是为了提高流的操作效率,所以在创建缓冲区之前必须要先有流对象。
BufferedWriter的使用方法:
//创建字符流对象
FileWriter fw=new FileWriter("buf.txt"):
//为了提高字符写入流的效率,需要加入缓冲技术,将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw=new BufferedWriter(fw);
//使用缓冲区的写入方法写入流。
bufw.write("abcde");
//使用缓冲区的刷新方法,将数据写入文件中。
bufw.flush();
//关闭缓冲区和流,释放资源。
bufw.close();
//扩展:使用缓冲区的newLine()方法可以实现换行功能。
BufferedReader的使用方法:
//创建一个读取流对象和文件相关联。
FileReader fr=new FileReader("buf.txt");
//为了提高效率,加入缓冲技术,将字符读取流作为参数传递给缓冲对象的构造函数。
BufferedReader bufr=new BufferedReader(fr);
//使用缓冲区的readLine()方法和循环读取数据
String line=null;
while((line=bufr.readLine())!=null)
{
System.out.println(line)
}
//关闭缓冲区和流,释放资源。
bufw.close();
四、装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能进行扩展,自定义的该类就成为装饰类。
五、字节流
字节流的两个基类分别为:InputStream和OutputStream
FileOutputStream:字节流中的输出文件流
使用FileOutputStream往文件中写数据:
//创建一个FileOutputStream对象。该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定的目录下,如果该目录下已有同名文件,将被覆盖。
FileOutputStream fos=new FileOutputStream("demo.txt");
//调用write方法,使用getBytes方法将字符串转为byt类型数组后写入流中。
fos.write("abcde".getBytes());
//关闭流资源。
fos.close();
使用FileInputStream读取文件中的数据:
//创建一个FileInputStream对象,和指定名称的文件相关联,要保证该文件时已经存在的。
FileInputStream fis=new FileInputStream("demo.txt");
//调用读取流对象的读取方法。
fid.resd();//读取单个字符,返回int型数字,独到末尾时返回-1
fis.fead(byte[] bt);//数组长度个数的字节,存入数组,返回读取的个数
//使用循环读取多个字节
int ch=0;
while(true)
{
if((ch=fis.read())!=-1)
System.out.print((char)ch);
}
//使用数组的方式读取字符
byte[] buf =new byte[1024];
int num=0;
while((num=fis.read(buf))!=-1)
{
System.out.print(new String(buf,0,num));
}
//使用字节流特有的方法读取字符
byte[] buf =new byte[fis.available()];
fis.read(buf);
System.out.print(new String(buf));
//关闭流资源。
fis.close();
六、字节流的缓冲区
缓冲区的出现是为了提高流的操作效率,所以在创建缓冲区之前必须要先有流对象。字节流的缓冲区为BufferedInputStream和BufferedOutputStream,这两者的用法与字符流缓冲区用法一致,创建缓冲区对象,将字节流对象传入缓冲区,然后操作缓冲区对象实现字节流的缓冲输入或输出。