黑马程序员_基础学习笔记(14)

黑马程序员---比向东---第二十天

File类:用于将文件或者文件夹封装成对象

    方便于文件与文件夹得属性信息进行操作

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

File类的常见方法:

    1 创建

      boolean createNewFile();

      在指定位置创建文件,如果该文件已经存在,则不创建并返回false

      和输出流不一样,输出流对象一建立创建,文件存在便会覆盖。

      boolean mkdir() 创建文件夹,一次只能创建一个一级目录

      boolean mkdirs() 创建多级目录(文件夹)

    2 删除

      boolean delete()  删除失败返回false

      void deleteOnExit()在程序退出时删除指定文件

    3 判断

      boolean canExecute()  判断文件是否可以执行

      boolean exists()   是否存在

      boolean isFile()    判断文件是否存在

      boolean isDirectory() 判断文件路径(文件夹)是否存在

      boolean isHidden()    判断隐藏文件是否存在

      isAbsolute()          判断绝对路径

    4 获取

      String getName();

      String getPath()  获取相对路径

      String getParent()  获取绝对路径下的文件父目录,如果是相对路径返回null

      FilegetAbsoluteFile()   返回的绝对路径被封装成对象

      String getAbsolutePath()

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

      long int length()返回由此抽象路径名表示的文件的长度。

递归:

    列出指定目录下文件或者文件夹,包含子目录中的内容

    也就是列出指定目录下所有内容

 因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可

 在列出过程中出现的还是目录的话,还可以再次调用本功能

 也就是函数自身调用自身。

 这种表现形式,或者编程手法,称为递归。

 

 递归要注意

    1 限定条件

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

Properties

properties是hashtable的子类

也就是说具备map集合的特点,而且它里面存储的键值对都是字符串

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

该对象的特点:可以用于键值对形势的配置文件。

在加载数据时,需要有固定格式一般是 键=

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

打印流

printStream  字节打印流

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

     1 file对象File 2字符串路径String   3 字节输出流OutputStream

printWriter   字符打印流

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

     1 file对象File 2字符串路径String   3 字节输出流OutputStream

     4 字符输出流 Writer

      publicPrintWriter(OutputStream(Writer) out, boolean autoFlush)

                  

通过现有的 OutputStream 创建新的 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。

参数:

out - 输出流

autoFlush- boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区

黑马程序员---比向东---第二十一天

序列流

SequenceInputStream  对多个流进行合并

 把多个源合并成一个源,在把合并后的源—>目的

 

SequenceInputStream(Enumeration<? extends InputStream> e)
          通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。

可以把多个源先存储到Vector集合中,在把

new Vector<FileInputStream >.elements();  即集合中的所有元素,一块当做参数传递给它的构造方法中(合并源);

SequenceInputStream(InputStream s1, InputStream s2)
          通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。

 

操作对象 ObjectInputStream   ObjectOutputStream

被操作的对象必须要实现Serializable(标记接口)

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义

被static所修饰时,不能被序列化,被transient修饰时,也不会被序列化

管道流

PipedInputStream  PipedOutputStream输入输出可以直接进行连接,通过结合线程使用。

管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏

RandomAccessFile随机访问文件,自身具备读写的方法

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

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

1 如果模式为只读r 则不会创建文件,会去读取一个已存在的文件,如果该

文件不存在,则会报异常

2 如果模式为rw模式,该对象的构造函数要操作的文件不存在,会自动创建,

如果存在,则不会覆盖。

skipBytes(int x)  跳过指定的字节数,不能往回跳

seek(int x)     调整指针的位置,从x字节开始读或写数据,向前或后都可以调整

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

如果用writeUTF()写那么只能用readUTF()读,因为此UTF-8 是4个字节的

是修改后的编码表。而之前的UTF-8单位是3个字节的

用于操作字节(字符,字符串)数组的流对象

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

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

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

源设备:键盘 System.in 硬盘FileStream内存ArrayStream

目的设备:控制台System.out 硬盘FileStream 内存ArrayStream.

编码表的转换

字符流的出现为了方便操作字符,但更重要的是假如了编码转换 

通过子类转换流来完成InputStreamOutputStream,在两个流对象在构造的时候

可以加入字符集

常见的编码表:

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

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

    GBK2312: 中国的中文码表,2个8位来表示,最高位为-1

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

   Unicode:国际标准码,融合了多种文字。所有语言都用2个字节来表示

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

    转码图例


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

   String-->byte[]: str.getBytes(charsetName);无参数按照默认GBK编码

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

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

注意:如果用GBK编码,用UTF-8解码,在编码用UTF-8得到字节数据

     再用GBK解码。得到结果还是会出现乱码,因为GBK,和UTF-8都识别

      中文的缘故,所谓的编码解码解错码表的前提是:解码的码表不支持中文

  

   //编码(如果遍错了,得到的对应的数字,只能使用对应的码表解码了)

       byte[] b3 =s.getBytes("GBK");

        System.out.println(Arrays.toString(b3));

 

       //解码ISO8859-1(解码错了,还可以再遍回去,得到解码之前的字节数据)

        String s3 = newString(b3,"ISO8859-1");   //查表查错了,欧洲码表

        System.out.println("乱码的s3="+s3);

 

        //对s3 进行ios8859-1编码   

        byte[] b4 =s3.getBytes("iso8859-1");

        System.out.println(Arrays.toString(b4));

 

       //解码

        String s4 = newString(b4,"gbk");

        System.out.println("返回第一次编码之前的s4="+s4);




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值