黑马程序员_IO学习总结

来源:互联网 发布:apktool mac 编辑:程序博客网 时间:2024/05/16 07:37

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

 

1  IO流简介

 特点:
流是用来处理数据的。 处理数据时,一定要先明确数据源,与数据目的 地(数据汇)。
数据源可以是文件,可以是键盘。 数据目的地可以是文件、显示器或者其他设备。 而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理.转换处理等。
IO流用来处理设备之间的数据传输 ,Java对数据的操作是通过流的方式 ,Java用于操作流的对象都在IO包中 。
分类:
流按操作数据分为两种:字节流与字符流。
流按流向分为:输入流,输出流。
IO流常用基类:
字节流的抽象基类:
InputStream ,OutputStream。
字符流的抽象基类:
Reader ,Writer。
注:由这四个类派生出来的子类名称都是 以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。

2  字符流

字符流的特点
那么数据的最常见体现形式是:操作文本文件。
Wrter基类:
FileWriter(String fileName):
创建一个FileWriter对象,定义文件路径时,可以用“/”或者“\\”。该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。其实该步就是在明确数据要存放的目的地。
FileWriter(String fileName, boolean append):
例子:FileWriter fw = new FileWriter("demo.txt",true):传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
常用方法:
write:调用write方法,将数据写入到流中。
flush:刷新流对象中的缓冲中的数据,将数据刷到目的地中。
close:关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
/r/n:为windows系统的文本的换行符。
IO异常的处理方式:
注意:FileWriter fw = null定义在try块外面,不能定义在try里面,否则在finally中无法关系该资源。finally中必须判断if(fw!=null),然后fw.close()。
reader基类:
FileReader(String fileName):
创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException。
常用方法
read():一次读一个字符。而且会自动往下读。如果读完了返回-1,(用于判断是否读完)。
read(char[] cbuf, int off, int len):定义一个字符数组char[]用于存储读到字符,没有读完,返回读到的字符个数。如果读完了返回-1。
close():关闭流资源。

3 字符流缓冲区 

特点:
缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强。 
常用类 :
BufferedWriter(FileWriter out):
只要将需要被提高效率的流对象out作为参数传递给缓冲区的构造函数即可。
特有方法:
newLine() :写入一个行分隔符,即换行符,这是一个跨平台的换行符。

BufferedReader(FileReader in) :只要将需要被提高效率的流对象in作为参数传递给缓冲区的构造函数即可。
特有方法:
readLine:一次读一行,返回读到的字符串,当返回null时,表示读到文件末尾。注意:返回的时候只返回回车符之前的数据内容。并不返回回车符,即读到回车符才能结束。
BufferedWriter子类LineNumberReader:
特有方法:
getLineNumber(): 获得当前行号。
setLineNumber(int lineNumber) :设置当前行号。  

4  字节流  

特点:操作图片,影音等数据,这时就要用到字节流。
常用类:
InputStream  OutputStream
FileOutputStream:
write(byte[] b):只能写入字节数据。与字符流write的区别,注意没有刷新,而是读一个字节操作一次。
FileInputStream:
available() :读取一个文件的字节数。用于定义一个刚刚好的缓冲区。不用在循环了。byte[] buf = new byte[fis.available()]。
read(byte[] cbuf, int off, int len):定义一个字节数组btye[]用于存储读到字符,没有读完,返回读到的字符个数。如果读完了返回-1。

5 字节流缓冲区

特点:同样是提高了字节流的读写效率
常用类:
BufferedOutputStream       BufferedInputStream

6 键盘录入

System.out的类型是PrintStream对应的是标准输出设备,控制台。
System.in的类型是InputStream,对应的标准输入设备:键盘。
标准输入输出流示例
例:获取键盘录入数据,然后将数据流向显示器,那么显示器就是目 的地。
通过System类的setIn,setOut方法对默认设备进行改变。
 System.setIn(new FileInputStream(“1.txt”));//将源改成文件1.txt。
 System.setOut(new PrintStream(“2.txt”));//将目的改成文件2.txt
因为是字节流处理的是文本数据,可以转换成字符流,操作更方便。
BfferedReader bufr =
       new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =
       new BufferedWriter(new OutputStreamWriter(System.out));    

7 创建IO流步骤 

第一步:明确源和目的。
源:输入流。InputStream  Reader
目的:输出流。OutputStream  Writer。
第二步:操作的数据是否是纯文本。
是:字符流。
不是:字节流。
第三步:当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。
第4步:是否需要提高效率:
是!使用缓冲区。  

8 File类

特点:
用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作 。 File对象可以作为参数传递给流的构造函 数。
常用方法:
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。      
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回false。
void deleteOnExit();在程序退出时删除指定文件。
boolean exists() :文件是否存在.注意:在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
File.separator :跨平台的目录分隔符。
isFile():是不是文件
isDirectory();是不是目录
isHidden();文件属性是不是隐藏
isAbsolute();该文件是不是用绝对路径创建的
getName():文件的名字
getPath():文件的路径
getParent():该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null
getAbsolutePath() :获取文件的绝对路径
long lastModified() :返回此抽象路径名表示的文件最后一次被修改的时间。
long length() :返回文件的长度。
File[] listFiles() :返回电脑盘符。
list():列出当前目录下的所有文件和目录的名称,包含隐藏文件。注意:调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
listFiles() :返回当前目录下的所有文件和目录的文件对象
小练习:(获取当前目录下的所以bmp文件名)
File dir = new File("d:\\java1223\\day18");
String[] arr = dir.list(new FilenameFilter()
 {       //accept用于文件过滤,当返回T是文件存入arr数组中。
   public boolean accept(File dir,String name)
   {
    if(name.endsWith(".bmp"))
     return true;
    else
    return false;
    return name.endsWith(".bmp");

   }
  });
 
9 Properties   

特点:
是hashtable的子类。也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串,是集合中和IO技术相结合的集合容器。
可以用于键值对形式的配置文件,那么在加载数据时,需要数据有固定格式:键=值。
常用方法:
setProperty(String key, String value) :添加键值对进入容器。
String getProperty(String key) :根据键获取值。
Set<String> stringPropertyNames() :获取容器中的所有值,并存入set集合。
load(InputStream inStream) :将in中的键值对数据放入Properties容器中。
list(PrintStream out) :列出集合目路到指定文件中。
store(OutputStream out, String comments) :将集合中的元素存储到指定文件中。 

10 IO包中的其他流对象  

打印流:PrintWriter与PrintStream ,该流提供了打印方法,可以将各种数据类型的数据都原样打印。
PrintStream构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
PrintWriter构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。(比PrintStream多了一个,更常用)
特有方法:
PrintWriter(OutputStream out, boolean autoFlush) :当autoFlush为T的时候,就自动刷新。
println(数据):将数据打印+换行。
序列流 :SequenceInputStream , 对多个流进行合并。
SequenceInputStream(InputStream s1, InputStream s2) :将按顺序读取这两个参数,先读取 s1,然后读取 s2。将这2个文件进行合并。
操作对象 : ObjectInputStream与ObjectOutputStream ,被操作的对象需要实现Serializable 。用于将对象持久化存储。
管道流:   PipedInputStream和PipedOutputStream 。输入输出可以直接进行连接,通过结合线程使用。
RandomAccessFile:

特点:
该类不是算是IO体系中子类。而是直接继承自Object。但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。其实完成读写的原理就是内部封装了字节输入流和输出流。通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,,读写rw等。
如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。如果模式rw。操作的文件不在,会自动创建。如果存则不会覆盖。
DataInputStream与DataOutputStream:可以用于操作基本数据类型的数据的流对象。
用于操作字节数组的流对象:
ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。
ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。这就是数据目的地。  注意:因为这两个流对象都操作的数组,并没有使用系统资源。所以,不用进行close关闭。

 

 

 

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

 

 

详细请查看:http://edu.csdn.net/heima/
原创粉丝点击