黑马程序员-Java语言基础 – IO流 第20-21天

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

 

File类概述

      ·文件和目录路径名的抽象表示形式。

      ·用来将文件或者文件夹封装成对象

      ·方便对文件与文件夹的属性信息进行操作。

      ·File对象可以作为参数传递给流的构造函数。

 

File类常见方法:

1、创建

      booleancreatNewFile();在指定位置创建文件,如果该文件已经存在,则不创建。返回false。创建成功并返回true。

和输出流(写)不一样。输出流对象一建立就会创建文件。而且文件已经存在,会覆盖。          boolean mkdir:创建文件夹

      boolean mkdirs:创建多级目录

File.separator:跨系统平台的目录分隔符

 

2、删除

      boolean delete():删除失败返回false。

      void deleteOnexit();在程序退出时删除指定文件。

 

3、判断[day20-3]

      boolean exists():文件是否存在。

      canExecut()://是否可以执行。

      isFile();

      isDirectory();

      isHidden();//是否隐藏。

      isAbsolute();

在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在。

通过exits判断。

 

4、获取信息。

      getName();

      getPath();//封装什么,获取什么。

      getParent();//该方法返回的是绝对路径中的文件父目录,如果获取的是相对路径则返回null,如果相对路径中有上级目录则返回上级目录。

      getAbsolutePath();//返回绝对路径

      getAbsoluteFile();//返回绝对路径,但是将路径封装成对象。

      long lastModified();//最后修改时间。

      long length();//返回文件的长度。

     

文件列表:[day20-05]

static File[] listRoots();//返回根目录。获取盘符。

String[] list();//调用list方法的File对象必须是封装了一个目录,该目录必须存在。

File.list();//返回目录下的文件夹和文件名。

 

·FilenameFilter接口:

只有一个方法:boolean accept(File dir, String name);

 

 

递归:

      函数自己调用自己的表现形式或者编程手法。

应用场景:

      当某一功能要重复使用时。(如列出目录下所有内容,删除带内容的目录等)

递归要注意:递归详解[day20-07]

      1、 限定条件,递归时一定要明确结束条件。

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

 

Properties类

      properties是hashtable的子类。

      具备Map集合的特点,而且里面存储的键值对都是字符串。

      是集合中和IO技术相结合的集合容器。

      特点:可用于键值对形式的配置文件。(可以实现应用程序数据的共享)

 

Object setProperty(String key, String value);//调用 Hashtable的方法put。

String getProperty();

Set<String> stringPropertyNames();

 

 

 

IO包中的其他类

 

打印流:PrintWriter  PrintStream

该流提供了打印的方法,可以将各种数据类型的数据都原样打印。

 

字节打印流

PrintStream

构造函数可以接收参数类型。

1、file对象:File

2、字符串路径:String

3、字节输出流:OutputStream

 

字符打印流(web常用)

PrintWriter构造函数可以接收:

1、file对象:File

2、字符串路径:String

3、字节输出流:OutputStream

4、字符输出流:Writer

 

序列流[day20-15]

      SequenceInputStream:用于对多个流进行合并。

 

操作对象

      ObjectInputStream与ObjectOutputStream(成对出现)

      被操作的对象需要实现Serializable(标记接口,没有方法的接口);

      对象的序列化:

      ObjectOutputStream的方法:

      write();//写入一个字节(最低8位)。

      writeInt();//写入一个32位的int值。

      writeObject();//将指定对象写入ObjectOutputStream

      ObjectInputStream的方法:

      readObject();

      序列号:serialVersionUID(默认根据成员计算出来的)

      自定义序列号:public static final long serialVersionUID = xxx

      静态成员变量是不能被序列化的。

      成员变量如果不想被序列化,可以使用transient修饰。

      一般被序列化后的文件使用“.object”文件名。

 

管道流

      PipedInputStream和PipedOutputStream

      输入输出可以直接进行连接,通过结合线程使用。涉及多线程技术。

      PipedInputStream的方法:connect(PipedOutputStream src);

 

 

RandomAccessFile

      该类不算是IO体系中子类而是直接继承自Object

 

      但是它是IO包成员,因为它具备读和写的功能。

      内部封装了一个数组,而通过指针对数组元素进行操作,可以通过getFilePointer获取指针位置,同时可以通过seek改变指针位置。

其实完成读写的原理就是内部封装了字节输入流和输出流。

 

通过构造函数,可以看出该类只能操作文件。而且操作文件还有模式:只读r.读写:rw.

RandomAccessFile(File file,String mode)

RandomAccessFile(String name,String mode)

方法:

      write()与writeInt():前者只写一个字节8位。使用后者writeInt()写四个字节32位。

      如果模式为只读 r、不会创建文件。会去读取一个已存在的文件,如果该文件不存在,则会出现异常。模式若是只读,可以屏蔽掉写的动作。

      如果为rw:操作的文件不存在,会自动创建。如果存在,不会覆盖。

而且该对象的构造函数要操作的文件不存在,会自动创建。如果存在,不会覆盖。至增添内容。

操作指针: seek:raf.seek(8*1);指定的数据写入,数据分段写入。实际可用。

 

 

操作基本数据类型

DataStream类      DataInputStream与 DataOutputStream

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

 

DataInputStream方法:

      readInt();

      readBoolean();

      readDouble();

      readUTF();

DataOutputStream方法:

      writeInt();//写入四个字节的int数据。

      writeBoolean();

      writeDouble();

      writeUTF();//与readUTF()成对出现。

 

操作字节数组

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

      用流的读写思想来操作数组。

      ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个字节数组。包含一个内部缓冲区,关闭此流无效,在构造时需要接收数据源(字节数组)。

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

      其中的数据会被写入一个字节数组,缓冲区会随着数据的不断写入而自动增长(可变长度)。可使用toByteArray()和toString()获取数据,关闭此流无效。

      因为这两个流对象都操作数组,并没有使用系统资源,所以不用进行close关闭动作。

在流操作规律讲解时:[day21-05]

      源设备:

           键盘 System.in;硬盘 FileStream;内存 ArrayStream(数组流);

      目的设备:

         控制台System.out;硬盘 FileStream;内存ArrayStream;

 

操作字符数组

·CharArrayReader与CharArrayWrite

 

操作字符串

·StringReader与StringWriter

 

 

字符编码[day21-06]

·字符流的出现为了方便操作字符。

·更重要是的加入了编码转换。

·通过子类转换流来完成。

InputStreamReader

OutputStreamWriter

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

 

编码表的由来:

·计算机只能识别二进制数据,早期由来是电信号。

·为了方便应用计算机,让它可以识别各个国家的文字。

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

 

常见的编码表:

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

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

GB2312:中国的中文编码表。

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

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

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

 

转换流的编码应用:

·可以将字符以指定编码格式存储。

·可以对文本数据指定编码格式来解读。

·指定编码表的动作由构造函数完成。

 

编码:字符串(String)-->字节数组(byte[])

str.getBytes(charsetName);  String --> byte[]:  str.getBytes(charsetName);

 

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

new String(byte[],charsetName);

byte[] --> String : new String(byte[],charsetName);       

另外有:String.valueOf(char[] data)

数组变成字符串:Arrays.toString();

 

[day21-09] Test 学生成绩练习中强性逆转比较器:Collections.reverseOrder();

Comparator<Student> cmp = Collections.reverseOrder();//强性逆转比较器。

 


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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值