黑马程序员_java_IO流总结(下)

来源:互联网 发布:脸部比例测试软件 编辑:程序博客网 时间:2024/06/03 18:59
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


七、Properties(理解)


(1)定义:
     Properties是一个键值对的集合类,不是IO类,键和值都是字符串。可以从流中加载数据或者把数据保存到流中,是唯一一个可以和IO流集合使用的集合类




(2)功能:


添加修改 
public Object put(Object key, Object value) 添加修改 
public Object setProperty(String key,String value) 调用的就是 put方法 
获取功能 
public String get(String key) 获取 
Public String getProperty(String key) 底层调用的是 get 
Public String getProperty(String, String defaultValue) 底层调用 get,如果找不到,返回 defaultValue 
public Set<String> stringPropertyNames() 获取键集合 
转换功能 
public void list(PrintWriter out) 将当前的集合里面的键值保存到指定的文本中


  
public void list(PrintStream out) 
public void load(InputStream inputStream) 从输入流中读取属性和列表 
public void load(Reader reader) 
public void store(OutputStream out, String comment) 把集合中的数据保存到文本中 
public void store(Writer writer, String comments) 
public Set keySet() 获取所有键的集合 


  


注意:Properties类在以后Android中会有新的Properties替代,在EE中我们会重新封装一个Properties工具类,因为Properties的缺点很明显,不能直接操作File对象






  




八、System类


(1)系统类,提供了静态的变量和方法供我们使用
(2)成员方法
public static void exit(int value)
 退出jvm,非0表示异常退出
 
public static long currentTimeMillis()
 返回当前系统时间的毫秒值
 
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
 从指定源数的指定位置开始复制,赋值到目标数组的指定位置
 
public static Properties getProperties();
 获取当前系统的属性
 
public static String getProperty(String key)
 获取指定键描述的系统属性
 
public static String getProperty(String key, String defaultValue)
 获取指定键描述的系统属性,没有找到该键的话返回defaultValue
 






遍历Properties 
       /**


        * 遍历系统描述Properties


        */


        public static voidmain(String[] args) throws Exception{


              Properties properties = System.getProperties();


              Set<Object> keySet = properties.keySet();


              for(Object key:keySet){


                     System.out.println(key +"*****"+properties.get(key));


              }


       }










获取当前系统中的换行符
/**


        * 获取当前系统中的换行符


        */


        public static voidmain(String[] args) throws Exception{


               String line = System.getProperty("line.separator");


               System.out.println(line+"你好");


       }






九、转换流


(1)使用:
     因为从控制台获取数据时获取到的是字节流,但是我们输入的是字符,所以操作字符流会更加方便,这时就需要转换流
     转换流就是字符流和字节流之间的一个桥梁,别人给你一个字节流,明知道里面存的是文本,用字符流操作更方便,所以就要用转换流




(2)记忆:
      最终目的是要使用字符流,所以
      第一步:先new一个字符流,这是我们要直接调用的
      第二部:new一个转换流传给字符流,这是中间流
      第三部:把字节流传给转换流,这是要转换的流




              /*输入转换流演示*/


//System.in 是个输入流,可以看成FileInputStream


              BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));


              String line = reader.readLine();


              System.out.println(line);


              reader.close();


             




             /*输出转换流演示*/


              //System.out 是个字节输出流,这里看成 new FileOutputStream();就可以了


              BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));


              writer.write("你好");


              writer.flush();


              writer.close();






(3)转换流编码问题
     读取转换流和写入转换流都有带参的构造,可以指定编码,可以设置以何种编码读取字节或写入字节
     InputStreamReader(InputStream in, String charsetName)
     OutputStreamWriter(OutputStream, out, String charsetName)
     
              /*输入转换流演示*/


//System.in 是个输入流,可以看成FileInputStream


              BufferedReader reader = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));


              String line = reader.readLine();


              System.out.println(line);


              reader.close();      


 


              /*输出转换流演示*/


              //System.out 是个字节输出流,这里看成 new FileOutputStream();就可以了


              BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out,"UTF-8"));


              writer.write("你好");


              writer.flush();


              writer.close();






十、打印流


(1)特点:
     A、可以写入任意类型数据
     B、可以自动刷新。必须先启动,并且是使用println,print,format方法才有效
     C、可以直接对文件进行写入
     D、底层调用的是转换流




(2)注意事项:
     打印流只能输出数据,不能读取数据换句话说就是只能操作数据目的能操作数据源




(3)PrintWriter 和 PrintStream的区别(掌握)
     1、PrintWriter构造方法可以传入字符流或者字节流,而PrintStream只能传入字节流
     2、PrintWriter主要用于操作字符流,PrintStream主要用于操作字节流
     3、PrintWriter想要实现自动刷新构造方法必须手动指定,而PrintStream则不需要手动指定
     4、PrintWriter继承自Writer,PrintStream继承自FileOutputStream
(4)使用:
     我们使用打印流就是为了使用自动刷新功能,所以以下只针对如何实现自动刷新进行案例演示
     
A、PrintWriter的使用方式
          1、通过构造方法创建对象并且启用自动刷新功能
                    PrintWriter(OutputStrem out, boolean autoFlush);
                    PrintWriter(Writer out, boolean autoFlush);
          2、调用println\printf\format方法,只有调用这三个个方法才会自动调用flush方法




PrintWriter printWriter = newPrintWriter(new FileWriter("d.txt"),true);


printWriter.printf("1");//仅仅写入数据并且刷新


printWriter.println("2");//写入数据并且增加换行符,刷新


printWriter.format("你好 %s", "张三");










 B、PrintStream的使用方式
           1、通过构造方法创建对象并且启用自动刷新功能
                              PrintStream(OutputStrem out, boolean autoFlush);
           2、调用println\printf\format方法,只有调用这三个个方法才会自动调用flush方法
PrintStream ps = newPrintStream(new FileOutputStream("a.txt"),true);//,true可有可无


ps.printf("你好");


               












十一、序列化


(1)概述
     序列化: 把内存里面的对象写入到硬盘
     反序列化:把硬盘里面的文件读取到内存




(2)友情提示
     开发中习惯给实体类实现Serializable接口,但是ObjectInputStream和ObjectOutputStream一般不用,因为有时候我们需要序列化JDK自带的类,但是这些类有可能没有实现该接口,所以开发中我们通过XML序列化,但是我们还是要实现该接口,不能保证永远不用




(3)如果想序列化一个类,应该怎么办(掌握)
     如果一个类想被序列化流操作就要实现Serializable接口
     如果实现了该接口,想解决黄线问题就生成一个随机的serialVersionUID号码




十二、编码问题


构造方法
     InputStreamReader(InputStream is, String 编码)
     OutputStreamWriter(OutputStream os, String 编码)




解决读取文本文件有乱码
     InputStreamReader(InputStream is, String 编码) 读取,读取到还是乱码,修改编码


十三、File类


构造方法
 
File(String pathName)
 根据指定的路径创建File对象
 
File(String parent, String child)
 根据指定的父文件夹和子文件或者文件夹创建File对象
 
File(File parent, String child) 
 根据指定的父文件夹对象和子文件或文件夹创建File对象
 
以上三个方法,创建当前文件或文件夹的时候都是先看是否存在,如果存在就不创建,否则就创建
 
创建功能
 
boolean createNewFile()
 创建文件
 
boolean mkdir()
 创建文件夹
 
boolean mkdirs()
 创建多级文件夹
 
删除功能
 
public boolean delete() 
 删除文件或文件夹
 
A:如果删除的目录下还有内容,则必须先把该目录下的的内容清空


B:JAVA语言的删除不走回收站
 
判断功能
 
public boolean exists()
 判断 file 对象是否存在
 
public boolean isFile()
 判断 file对象是否是文件
 
public boolean isDirectory()
 判断 file对象是否是文件夹
 
public boolean isAbsolute()
 判断 file对象是否是绝对路径
 
 public boolean canRead()
 判断 file对象是否可读
 
public boolean canWrite()
 判断 file对象是否可写
 
public boolean isHidden()
 判断 file对象是否隐藏
 
获取功能
 
public File getAbsoluteFile()
 获取文件的绝对路径
 
public String getName()
 获取文件名称
 
public String getPath()
 获取相对路径
 
public long length()
 获取文件的大小,单位是字节
 
public long lastModified()
 获取上次修改时间的毫秒值
 
public static File[] listRoots()
 列出可用的系统文件根目录
 
public String[] list()
  返回的是指定目录下所有文件或者文件夹的名称数组
 
 public String[] list(FilenameFilter filter)
 
public File[] listFiles()
 返回的是指定目录下所有文件或者文件夹对象数组
 
public File[] listFiles(FilenameFilter filter)
 


 


 


(1)File类-案例


1、获取指定目录下所有 .mp4文件的名称




 


importjava.io.File;


importjava.io.FilenameFilter;


 


/*


 * 获取指定目录下指定后缀的文件名称:


 * A:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输出该File的名称。


 * B:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。


 *


 * 文件名称过滤器:FilenameFilter


 *        public String[] list(FilenameFilter filter)


 */


public classFileDemo {


      public static voidmain(String[] args) {


           // 封装目录


           File file = new File("d:\\");


 


           // 获取满足条件的数组


           String[] strArray = file.list(new FilenameFilter() {


                 @Override


                 public booleanaccept(File dir, String name) {


                      // 判断是否是文件,是否是以.mp4结尾


                      // System.out.println(dir + "---" + name);


                      File file = new File(dir, name); // d:\我的文档


                      boolean flag = file.isFile();


                      boolean flag2 = name.endsWith(".mp4");


                      return flag && flag2;


                 }


           });


 


           // 遍历字符串数组


           for(String str : strArray) {


                 System.out.println(str);


           }


      }


}


 

0 0
原创粉丝点击