黑马程序员_java学习日记_IO流

来源:互联网 发布:怎么登陆支付宝知托付 编辑:程序博客网 时间:2024/05/16 06:36
 

----------------------- android培训、java培训java学习型技术博客、期待与您交流! ----------------------

 

IO(input output)流

IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,这些流对象都在IO包中;
流按操作数据分为两种:字节流和字符流
按流向分为:输入流和输出流

字节流的抽象基类:

InputStream,OutputStream

字符流的抽象基类:

Reader,Writer
注:由这四个类派生出来的子类名称都是以其父类名称作为子类名的后缀的

如: InputStream的子类FileInputStream
    Reader 的子类FileReader

Writer类是一个抽象类不能被实例化。它提供了一些抽象方法需子类实现
abstract  void close()
          关闭此流,但要先刷新它。
abstract  void flush()
          刷新该流的缓冲。
 void write(char[] cbuf)
          写入字符数组。
abstract  void write(char[] cbuf, int off, int len)
          写入字符数组的某一部分。
 void write(int c)
          写入单个字符。
 void write(String str)
          写入字符串。
 void write(String str, int off, int len)
          写入字符串的某一部分。

FileWriter字符流类:该类直接继承与OutputStreamWriter
的子类,OutputStreamWriter直接继承于Writer

构造方法摘要
FileWriter(File file)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)
          构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName)
          根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

FileWriter类没有无参数构造函数,创建一个FileWriter对象就必须要明确要操作的文件,而且该文件会被创建到指定目

录下。如果该目录下已经同名文件,同名文件将被覆盖。

 调用Write()方法是向流中写数据,流存在与内存中有一定大小的缓冲区,当写入的数据没能把缓冲区写满时,这些数据

就会一直存在于流中而不会写入磁盘上的文件中,要想让其写入文件中可以调用flush()方法,该方法的作用就是刷新缓

冲区,将其中的数据写到文件中,也可以调用close()方法,该方法的作用是关闭流资源,在关闭流之前会刷新缓冲区,

将缓冲区中的数据写入到相应的文件中去。

write(),flush(),close(),这三个方法都会抛出IOException异常,要求我们必须声明抛出或者处理。

标准的IO异常处理:

demo:
import java.io.*;
class IOExceptionDemo{

public static void main(String [] args){
  FileWriter fw = null;//定义在异常处理代码块外面
    try{

     fw = new FileWriter("qiufeng.txt");//会引发异常
     fw.write("haha");//会引发异常
  }catch(IOException e){
  System.out.println(e);
  }finally{
   if(fw!=null)//判断fw是否为空
     try{
      fw.close();//会引发异常
    
     }catch(IOException e){
      System.out.println(e.toString());
     }
  }
 }
}
  


Reader:字符输入流的基类,是一个抽象类

直接已知子类:
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处

定义的一些方法,以提供更高的效率和/或其他功能。

创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件是已经存在的,如果不存在,会发生异常

FileNotFoundException

调用read()方法读取其中的内容,读到流的末尾返回-1;


字符流缓冲区:

缓冲区的出现提高了对数据的读写效率。对于应的有两个类:

 BufferedWriter
 BufferedReader

缓冲区要集合流才可以使用。在流的基础上对流的功能进行加强

在创建缓冲区之前,必须要先有流对象。


BufferedWriter

只要将需要的给提高效率的流对象作为参数传递给缓冲区的构造函数即可。
关闭该缓冲区就是在关闭缓冲区中的流对象。
所以不需要再对流对象进行关闭。

该缓冲区类提供了一个跨平台的的换行符。newLine();

BufferedReader 

1.创建一个文件读取流对象
  FileReader fr = new FileReader("bufreader.txt");
2.为了提高效率。加入缓冲技术,将字符流对象做为参数传递给缓冲对象的构造函数

BufferedReader bfr = new BufferedReader(fr);

3.缓冲区提供了一个一次读一行的方法readline(),方便对文本数据的读取,当返回null时表示读到文件的末尾,它只返

回终止符之前的字符,不包括换行符;

String str = null;
while((str= bfr.readLine())!=null)
{
System.out.println(str);
}
4.关闭该缓冲区

fr.close();

 

流操作规律:
          1.明确源和目的
           源:输入流。InputStream Reader
           目的:输出流。OutputStream Writer

           2.操作的数据是否是纯文本
             是:字符流
             不是:字节流。
            3.当明确体系后在明确要使用那个具体的对象。
            通过设备来进行区分:
            源设备:内存,硬盘,键盘
            目的设备:内存,硬盘,控制台。


File 类:用来将文件或者文件夹封装成对象的类,方便了对文件与文件夹的操作,File对象可以作为参数传递给流的构

造函数。

其中有一个字段static String separator  是与平台无关的目录分隔符


方法:

1.创建

   boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false ,和输出流不一样,

输出流对象一建立就创建文件,而且文件如果已经存在会被覆盖。

  boolean mkdir():创建文件夹。
 boolean mkdirs():创建多级文件夹。

2.删除。
  boolean delete():删除失败返回false.如果文件正在被使用,则删除不了返回false
  void deleteOnExit():在程序退出时删除指定文件。

3.判断。
  boolean exists():判断文件是否存在。
  isFile():判断是否是文件
  isDirectory():判断是否是目录
 isHidden():判断文件是否隐藏
  isAbsolute():判断是否是绝对路径


4.获取信息

String getName():获取文件名称

String getPath():获取路径  相对路径

String getParent():获取父目录,如果File对象是相对路径返回null ,如果有上次目录就返回上一层目录

String getAbsolutePath():获取绝对路径

其他方法:

 boolean renameTo(File dest)  重新命名此抽象路径名表示的文件。

   long length()       返回由此抽象路径名表示的文件的长度。
 
String[] list()      返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

 File[] listFiles()   返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 


SequenceInputStream类:InputStream的子类,将两个或多个InputStrem对象转换成单一的InputStrem

PipedInputStream管道流:连接PipedInputStream构成管道,常用于线程之间的通信

DataInputStrem 和DataOutputStream :可以操作基本类型的数据

RandomAccessFile类:该类是一个独立的IO包中的类,它不是InputStream或者OutputStream继承体系层次结构中的一部

分,除了实现了DataInput和DataOutput接口之外,它和这两个层次结构没有任何关联,它是独立的,直接继承Object.从

本质上来说,RandomAccessFile的工作方式类似与把DataInputStream和DataOutputStream组合起来使用,还添加了一些

方法,其中方法getFilePointer()用于查找当前文件所处的位置,seek()用于在文件内移至新的位置,length()用于判断

文件的最大尺寸。另外,其构造器还需要第二个参数用来指示我们只是“随即读”(r)还是“即读又写”(rw).它并不支持

只写文件。

ObjectInputStream和ObjectOutputStream:用于对象序列化,对象的持久化存储。可以被序列化的对象必须实现

Serialiable,如果不想对对象内的某个字段不想被序列化,可以用transient 关键字修饰


字符编码:
字符流的出现为了方便操作字符,字节流向字符流的转换是通过InputStreamReader和OutputStreamWriter实现的,在这

两个对象进行构造的时候可以加入字符集。

编码表:

计算机只能识别二进制数据,其实就是两个不同的电信号状态,高电平(1)和低电平(0),为了方便计算机识别各个国

家的文字。就将各个国家的文字用数字来表示,并形成一一对应,这样就构成了一张表,就是编码表。

常见的编码表:

ASCII:美国标准信息交换码。用一个字节的7位就可以表示。

ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示。

GB2312:中国的中文编码表。

GBK:中国的中文编码表升级,融合了更多的中文字符号。

Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode

UTF-8:最多用三个字节来表示一个字符

编码:字符串变为字节数组 String -->str.getBytes[]

解码:字节数组变成字符串  byte[] --> String new String(byte[])

----------------------- android培训、java培训java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

原创粉丝点击