---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
IO流是用来处理设备之间的数据传输,java对数据的操作就是通过流的方式。
流按操作数据分为两种:字节流和字符流
流按流向分为:输入流和输出流
一、字符流
字符流的抽象基类:Writer ,Reader。由这两个类派生出来的子类都是以其父名作为后缀。
1、FileWriter 专门用于操作文件的writer对象。
(1)创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定的目录下。如果该目录下已有同名文件,将被覆盖。
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。要处理IO异常。
(2)write方法:将字符串写入到流中
(3) flush方法 :将流中的数据写入指定文件中,刷新后流可以继续使用。
(4) Close方法:把流中数据写到指定文件中,关闭流资源。后面就不能再使用流。
(5) FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来 构造 FileWriter 对象。
2、FileReader 对象
创建一个文件的读取流对象,和指定文件相关联,要保证文件存在。
(1) FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader
(2) read()读取单个字符。会自动往下读。
read(char[] cbuf) 将字符读入数组。
3、字符流缓冲区(BufferedWriter 和 BufferedReader)
1、为了提高流的操作效率。所以提出了字符缓冲区技术。
怎么应用缓冲区?
(1)创建流对象
(2)将流对象作为参数传递给缓冲区的构造函数即可
(3)刷新缓冲区
(4)关闭
2、BufferedReader提供了一个跨平台的换行方法。newLine()。
3、BufferedReader方法提供了了特有的方法:ReaderLine();按行读,没有就返回null,方便与对文件和数据的读取。
4、readLine的原理:这个 方法是基于read方法的,就是把回车符之前的数据都一个一个的写到一个数组里面,然后返回这行数据。
4、装饰设计模式
把对已有对象进行功能增强的时候,就可以定义类将已有对象传入,基于已有功能,并提供加强功能,那么定义的类就是装饰类
装饰类是通过构造方法接收被装饰的对象。
继承与装饰的区别?
避免继承类的臃肿,降低类与类之间的关系。因为装饰类是基于已有对象的功能并提供更强功能,所以装饰类与被装饰类一般是属于一个体系中的。
下面是一个文本复制的列子:
import java.io.*;
public class BufferedText
{
public static void main(String[] args)
{
BufferedReader br=null;
BufferedWriter bf=null;
try
{
br=new BufferedReader(new FileReader("D:\\BufferedReaderDemo.java"));//定义一个读取流并关联文件
bf=new BufferedWriter(new FileWriter("D:\\BufferedReaderDemo_copy.txt"));//定义一个输入流
String line=null;
while((line=br.readLine())!=null)//按行读。
{
bf.write(line);
bf.newLine();//换行
}
}
catch(IOException e)
{
}
finally
{
try{
if(br!=null)
br.close();//关闭流资源
}
catch(IOException e)
{
}
try{
if(bf!=null)
bf.close();
}
catch(IOException e)
{
}
}
}
}
二、字节流
操作字节数据的文件。比如图片,音频等。
字符流的抽象基类:InputStream ,OutputStream。由这两个类派生出来的子类都是以其父名作为后缀。
字节流缓冲区:BufferedInputStream、BufferedOutputStream。
字节流的操作方式跟字节流一样。这边就不过多介绍。
三、转换流
为了让字节流能够使用字符流缓冲区的readLine方法,提高效率,我们就可以使用转换流把字节流转换成字符流。
1、InputStreamReader 字节通向字符的桥梁
2、OutputStreamWriter字符通向字节的桥梁
System.out 标准输出流
System.in 标准输入流
把源文件在控制台输出:
分析:
* 源: Reader 纯文本 FileReader
* 设备:硬盘
* 提高效率:BufferedRead
* BufferedRead bfr=new BufferedRead(new FileReader("D:\\BufferedReaderDemo.java"));
* 目的:Writer OutputStream
* 文本:FileWriter
* 设备:控制台 System.out操作的是字节流 所以要用到转换流 OutputStreamWriter
* 提高效率;BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(System.out))
import java.io.*;
public class SytemInDemo
{
public static void main(String[] args) throws FileNotFoundException
{
BufferedReader bfr=null;
BufferedWriter bfw=null;
try
{
bfr=new BufferedReader(new FileReader("D:\\BufferedReaderDemo.java"));
bfw=new BufferedWriter(new OutputStreamWriter(System.out));
//bfw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\OUPdRMO.TXT")));
String line=null;
while((line=bfr.readLine())!=null)
{
if(line.equals("over"))
break;
/*System.out.println(line);*/
bfw.write(line);
bfw.newLine();
bfw.flush();
}
}
catch(IOException e)
{}
finally
{
try{
bfr.close();
}
catch(IOException e)
{}
try{
bfw.close();
}
catch(IOException e)
{}
}
}
}
四、File类
1、基本概念
用于将文件或文件夹封装成对象,方便对文件和文件夹的操作。
它与流的区别就是流只能操作数据,不能操作文件夹
2、常见方法
(1)创建:createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建 一个新的空文件。
mkdir()
创建此抽象路径名指定的目录。
mkdirs() 创建多级目录
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
(2)删除 :boolean delete() 删除此抽象路径名表示的文件或目录。
(3)判断:返回值都是boolean型的
canExecute()
测试应用程序是否可以执行此抽象路径名表示的文件。
canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。
canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。
isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
isAbsolute()
测试此抽象路径名是否为绝对路径名。
isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。
exists()
测试此抽象路径名表示的文件或目录是否存在。
要判断一个目录是否是目录,判断是都是文件都要先判断它们是都存在。
(4)获取:getName()返回由此抽象路径名表示的文件或目录的名称。
getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
getPath()
将此抽象路径名转换为一个路径名字符串。
length()
返回由此抽象路径名表示的文件的长度。
getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
listFiles()把获取到的封装成一个File对象,便于操作
2、递归
函数自身调用自身就是递归。要限定条件,避免溢出。
public static void show(File dir)
{
File[] ff=dir.listFiles();
for(File file:ff)
{
if(!(file.isHidden())&&file.isDirectory())
show(file);//递归调用
else
System.out.println(file);
System.out.println(file);
}
}
五、properties类
1、基本概念:
它是Hashtable的子类。也就是说它具备Map集合的特点。而且它里面存储的键值都是字符串,是集合中与IO技术相结合的集合容器。
2、方法
(1)setProperty(String key, String value)
调用 Hashtable 的方法 put。
(2)getProperty(String key)
用指定的键在此属性列表中搜索属性。
(3)load(InputStream inStream)
把流中的数据加载进集合
(4)store(OutputStream out, String comments)
将集合中的元素加载进指定的文件中
(5)list(PrintWriter out)
将属性列表输出到指定的输出流。
六、打印流
1、PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException。
它的构造函数可以接收的对象有file对象,String路径和字节输出流
2、PrintWriter 向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。不同的是该类构造函数可以接收字节输出流。
3、下面就是实现把文本文件输出到控制台的方法
public static void method()throws IOException
{
BufferedReader bfw=new BufferedReader(new FileReader("D:\\hah.txt"));
PrintWriter pw=new PrintWriter(System.out);
String line=null;
while((line=bfw.readLine())!=null)
{
//pw.write(line);
pw.println(line);
}
pw.close();
bfw.close();
}
}
总结:
学号IO只要会分析相应的源和目的以及操作的文件类型,就可以选择相应的输入流和输出流,这样IO操作的问题就不会有太大的问题。不过还是有一些小地方要注意,比如使用BufferedWriter的时候要记得刷新缓冲区,键盘录入的时候要记得有结束标记等
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net