关闭

黑马程序员——IO流总结之二

136人阅读 评论(0) 收藏 举报
---------------------- android培训java培训、期待与您交流! ----------------------

String[] list() File[] listFiles()的区别:

      String[] list()这个方法返回的是当前目录下的文件以及文件夹名称,他只有名称

      File[] listFiles() 这个方法往回返的是当前目录下的文件以及文件夹的对象, 这里边得到的是对象我们可以通过getName()获得名称也可以getPath获取路径,在开发用这个比较好,里边的信息都能获得到。

递归思想:

      因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。

递归要注意:

1,限定条件。

2,要注意递归的次数。尽量避免内存溢出。

class File

{

      public static void main(String[] args)

      {

           要注意的是:递归的话必须在这里建立对象。

           File dir= new File("D:\\myjava");

           int num = getSum(100);如果这里等于一万就内存溢出。因为栈内存满了

           System.out.println("num="+num);

      }

      public static int getSum(int num)

      {

           if (num==1)

                 return 1;

           return num+getSum(num-1);

      }

}

主函数调用 showA();   这就是递归

void showA()

{

      showB();

      System.out.println("A");

}

void showB()

{

      showC();

      System.out.println("B");

}

void showC()

{

      System.out.println("C");

}

Properties

      Propertieshashtable的子类。也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。不需要泛型。是集合中和IO技术相结合的集合容器。该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式:键=值。

        凡是文档中前边加井号的都是注释信息不会被Properties加载。Properties加载的信息必须是键值对。

能够读取对象的读写流

用了ObjectOutputStream就必须用ObjectInputStream 读出来他们俩要成对出现,这可以直接对对象进行读写。

这个对象必须被序列化。静态是不能被序列化的。

ObjectOutputStreamoos = new ObjectOutputStream(new FileOutputStream("obj.txt"));

           oos.writeObject(newPerson("lisi",30));把对象写入到硬盘上,是数据持久化

ObjectInputStreamois = new ObjectInputStream(new FileInputStream("obj.txt"));

           Person p = (Person)ois.readObject();从硬盘上读取对象,并取出对象,很方便

           System.out.println(p);

他们俩要成对出现,用了ObjectOutputStream 就必须用ObjectInputStream 读出来

随即读写流:

     随机读取访问,优点是可以分段读写数据。

      raf.seek();调整对象中的指针位置来进行指定的数据读取和写入,数据分段用处很大。

      RandomAccessFileraf = new RandomAccessFile("ran.txt","r");

     该类不是算是IO体系中子类。而是直接继承自Object。但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。其实完成读写的原理就是内部封装了字节输入流和输出流。

 

用于操作字节数组的流对象。

       ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。

       ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。

数据源

     ByteArrayInputStream bis = newByteArrayInputStream("美女".getBytes());

数据目的  发现源和目的都在内存中

      ByteArrayOutputStream bos = newByteArrayOutputStream();

可以用于操作基本数据类型的数据的流对象:DataInputStreamDataOutputStream

      DataInputStreamdis = new DataInputStream(new FileInputStream("abcd.txt"));

      DataOutputStreamdos = new DataOutputStream(new FileOutputStream("utfdate.txt"));

      这里边有操作基本数据类型的功能读IntInt等等,那么他的作用在于,把基本数据类型和流相结合,他能操作基本数据类型,所以构造函数要传递一个流进来。要传字节流因为Data* 他是字节流的小弟。

编码:字符串变成字节数组

解码:字节数组变成字符串

String -->byte[]: str.getBytes();指定编码表str.getBytes(charsetName);

byte[] -->String: new String(byte[]);指定编码表new String(byte[]charsetName); new一个对象就行了

      知识点:当用GBK或者UTF-8编码,而用ISO8859-1解码失败的时候,是可以通过重新对失败的文件进行在进行编码,之后再解码一次就OK了。

      但是当用GBK或者UTF-8编码,而用UTF-8或者Gbk解码失败的时候,不能通过重新对失败的文件进行在进行编码,因为这两种编码集都识别中文。utf-8gbk都识别中文,但是同一个中文在这两个表中的代表的编码是不一样的,gbk编码是两个字节代表一个字。u8编码是三个字节代表一个字。

       经过半天的总结,终于把这一块给重新复习了下,体会到了什么叫做温故而知新,其实及时总结会巩固学习过的知识,希望自己以后养成写技术博客的习惯。初学者的总结,欢迎指点,拍砖也行!

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3748次
    • 积分:118
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论