【黑马程序员】-----java基础----IO

来源:互联网 发布:上海ug编程培训班 编辑:程序博客网 时间:2024/05/22 14:05

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


IO流技术用于处理设备上的数据。

IO流的分类:

1:输入流(读)和输出流(写)。 

2:因为处理的数据不同,分为字节流和字符流。

IO流体系:


FileWriter:文本写入流

写入流使用过程中的一些细节问题:

1、window中的换行符:\r\n两个符号组成。 linux:\n。 

2:续写数据,只要在构造函数中传入新的参数true。 

3、目录分割符:window \\  /

public static void main(String[] args) {   

    FileWriter fw = null;   

    try {    

        fw = new FileWriter("demo.txt",true);    

        fw.write("abcde"); 
    } 

    catch (IOException e ){    

        System.out.println(e.toString()+"....");   

    }

    finally{    

        if(fw!=null)     

            try{     

                fw.close();     

            } 
            catch (IOException e){      

                System.out.println("close:"+e.toString()); 

            } 
    } 

}


FileReader:文本写入流。使用Reader体系,读取一个文本文件中的数据。返回 -1 ,标志读到结尾。 

public static void main(String[] args) throws IOException {   

    //创建可以读取文本文件的流对象,FileReader让创建好的流对象和指定的文件相关联。  

    FileReader fr = new FileReader("demo.txt");

    //第一种读取方式   

    int ch = 0; 

    while((ch = fr.read())!= -1) {  //条件是没有读到结尾    

        System.out.println((char)ch); //调用读取流的read方法,读取一个字符。  

    } 

    fr.close(); 


public static void main(String[] args) throws IOException {   

    FileReader fr = new FileReader("demo.txt"); //创建读取流对象和指定文件关联。  
 
    //因为要使用read(char[])方法,将读取到字符存入数组。所以要创建一个字符数组,一般数组的长度都是1024的整数倍。   

    char[] buf = new char[1024];   

    int len = 0;

    while(( len=fr.read(buf)) != -1) { 

        System.out.println(new String(buf,0,len));   

    } 
    fr.close(); 


缓冲流:(BufferedWriter、BufferedReader、BufferedInputStream、BufferedOutputStream)

缓冲流是在流技术中加入缓冲技术,从而达到高效读写的特种流。

缓冲区是提高效率用的,是给字符输出流提高效率用的,那就意味着,缓冲区对象建立时,必须要先有流对象。明确要提高具体的流对象的效率。

BufferedWriter使用案例:

FileWriter fw = new FileWriter("bufdemo.txt"); 

 BufferedWriter bufw = new BufferedWriter(fw);//让缓冲区和指定流相关联。  

for(int x=0; x<4; x++){   

    bufw.write(x+"abc"); 

    bufw.newLine(); //写入一个换行符,这个换行符可以依据平台的不同写入不同的换行符。   

    bufw.flush();//对缓冲区进行刷新,可以让数据到目的地中。 

bufw.close();//关闭缓冲区,其实就是在关闭具体的流。


BufferedReader使用案例:  

FileReader fr = new FileReader("bufdemo.txt");  

BufferedReader bufr  = new BufferedReader(fr);  

String line = null; 

while((line=bufr.readLine())!=null){  //readLine方法返回的时候是不带换行符的。

System.out.println(line); 

}  

bufr.close();


获取键盘录入:BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));


流的操作规律:

1、明确源和目的。  

源:就是需要读取,可以使用两个体系:InputStream、Reader;  

目的:就是需要写入,可以使用两个体系:OutputStream、Writer; 

2、操作的数据是否是纯文本数据?  

如果是:源:Reader      目的:Writer   

如果不是:源:InputStream         目的:OutputStream 

3、虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?  明确操作的数据设备。

源对应的设备:硬盘(File),内存(数组),键盘(System.in)

目的对应的设备:硬盘(File),内存(数组),控制台(System.out)。 

4、需要在基本操作上附加其他功能吗?比如缓冲。  如果需要就进行装饰。


转换流:(InputStreamReader、OutputStreamWriter)

转换流特有功能:转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。

转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流。  

想要操作文本文件,必须要进行编码转换,而编码转换动作转换流都完成了。所以操作文件的流对象只要继承自转换流就可以读取一个字符了。 

但是子类有一个局限性,就是子类中使用的编码是固定的,是本机默认的编码表,对于简体中文版的系统默认码表是GBK。 

FileReader fr = new FileReader("a.txt"); 

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"gbk"); 

以上两句代码功能一致,如果仅仅使用平台默认码表,就使用FileReader fr = new FileReader("a.txt"); //因为简化;如果需要制定码表,必须用转换流。 

转换流 = 字节流+编码表。转换流的子类File = 字节流 + 默认编码表。凡是操作设备上的文本数据,涉及编码转换,必须使用转换流。


File类:将文件系统中的文件和文件夹封装成了对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。

方法摘要: 

1、创建。  boolean createNewFile():在指定目录下创建文件,如果该文件已存在,则不创建。而对操作文件的输出流而言,输出流对象已建立,就会创建文件,如果文件已存在,会覆盖。

除非续写。  

                     boolean mkdir():创建此抽象路径名指定的目录。  

                     boolean mkdirs():创建多级目录。  
2、删除。 boolean delete():删除此抽象路径名表示的文件或目录。  

                   void deleteOnExit():在虚拟机退出时删除。 

3:获取.。long length():获取文件大小。

                   String getName():返回由此抽象路径名表示的文件或目录的名称。  

                   String getPath():将此抽象路径名转换为一个路径名字符串。 

                   String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。 

                   String getParent():返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回 null。 

                   long lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。 

                   File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。 

                   File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。 

4、判断。 boolean exists():判断文件或者文件夹是否存在。 

                   boolean isDirectory():测试此抽象路径名表示的文件是否是一个目录。  

                   boolean isFile():测试此抽象路径名表示的文件是否是一个标准文件。  

                   boolean isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。  

                   boolean isAbsolute():测试此抽象路径名是否为绝对路径名。 

5、重命名。boolean renameTo(File dest):可以实现移动的效果。剪切+重命名。 

                      String[] list():列出指定目录下的当前的文件和文件夹的名称。包含隐藏文件。 

                      如果调用list方法的File 对象中封装的是一个文件,那么list方法返回数组为null。如果封装的对象不存在也会返回null。只有封装的对象存在并且是文件夹时,这个方法才有效。


Properties:Hashtable的子类,IO和集合结合的产物。

特点:1、可以持久化存储数据。2、键值都是字符串。3、一般用于配置文件。


PrintStream:打印流。可以操作目的:1:File对象。2:字符串路径。3:字节输出流。

特点:

1、提供了更多的功能,比如打印方法。可以直接打印任意类型的数据。 

2、它有一个自动刷新机制,创建该对象,指定参数,对于指定方法可以自动刷新。 

3、它使用的本机默认的字符编码.  

4、该流的print方法不抛出IOException。

PrintWriter:具备了PrintStream的特点同时,还有自身特点: 

该对象的目的地有四个:1:File对象。2:字符串路径。3:字节输出流。4:字符输出流。


SequenceInputStream:序列流,作用就是将多个读取流合并成一个读取流。实现数据合并。

该对象的构造函数参数是枚举,想要获取枚举,需要有Vector集合,但不高效。需用ArrayList,但ArrayList中没有枚举,只有自己去创建枚举对象。


RandomAccessFile: 

特点: 

1、该对象即可读取,又可写入。 

2、该对象中的定义了一个大型的byte数组,通过定义指针来操作这个数组。 

3、可以通过该对象的getFilePointer()获取指针的位置,通过seek()方法设置指针的位置。 

4、该对象操作的源和目的必须是文件。  

5、其实该对象内部封装了字节读取流和字节写入流。 

注意:实现随机访问,最好是数据有规律。


管道流:(PipedInputStream、PipedOutputStream、PipedReader、PipedWriter)管道读取流和管道写入流可以像管道一样对接上,管道读取流就可以读取管道写入流写入的数据。

用于多线程技术。


对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。

注意:静态数据不能被序列化,因为静态数据不在堆内存中,是存储在静态方法区中。  

如何将非静态的数据不进行序列化?用transient 关键字修饰此变量即可。 

Serializable:用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员

的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的

类都进行手动显示的UID的指定。


DataOutputStream、DataInputStream:专门用于操作基本数据类型数据的对象。


ByteArrayInputStream:源:内存  

ByteArrayOutputStream:目的:内存。  

这两个流对象不涉及底层资源调用,操作的都是内存中数组,所以不需要关闭。

0 0