zoukankan      html  css  js  c++  java
  • 黑马程序员_Java学习日记num10

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

    学习内容:在javaIO中,比较重要的是五个类,一个接口。五个类是 Reaer, Writer,InputStream,  OutputStream,File(前四个类是抽象类,最后一个非抽象),接口是  Serializable。其他流对象。

     
    一,字符流和字节流
    IO流用来处理设备之间的数据传输,java对数据的操作时通过流的方式,java用于操作流的对象都在IO包中。
    字符流是基于字节流的,字符流里面融合了字符编码表,所以字符流一般操作纯文本数据,而字节流可以操作所有的数据。字符流的两个基类是Reader,Writer。字节流的两个基类是InputStream和OutputStream。
    (一)Writer
    FileWriter
    1,需求:在硬盘上创建一个文件并且写入数据。
    //创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。创建FileWriter对象时,既可以传递File对象或者文件的名字String类型。如果硬盘上存在了文件,将会被覆盖,不存在会自己创建。若不想被覆盖,可以在FileWriter构造方法中传递一个布尔值true
    FileWriter fw = new FileWriter("test.txt");
    //调用write方法,将字符串写入到流中。
    fw.Writer("abcd");
    //刷新流对象的缓冲区的数据到目的地中
    fw.flush();
    //关闭流对象,释放资源  在关闭流资源时,会自动刷新内部的缓冲区的数据,将数据刷到目的地中
    fw.close();
     
    BufferedWriter
    1,需求:使用BufferedWriter在硬盘上写入数据
    对于BufferedWriter,可以提高FileWriter的效率,因为加入了缓冲技术。缓冲区要记得刷新
    //创建流对象
    FileWriter fw = new FileWriter("buf.txt");
    //提高字符写入效率,引入了缓冲技术
    BufferedWriter bfw = new BufferedWriter(fw);
    bufw.write("hello,heima");
    bufw.flush();//只要用到缓冲区,都要刷新
    //关闭缓冲区
    bufw.close();
    (二)Reader
    //创建一个文件读取流对象和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在,会发生异常
    FileReader fr= new FileReader("Test.txt");
    //调用读取流对象的read方法。read每次只读一个字符且会自动往下读。另外read方法还有一个重载形式,可以一次读取多个字符,将读到的多个字符存放在字符数组中
    int ch = 0;
    while((ch=read())!=-1)
      System.out.println((char)ch);
    //关闭流资源
    fr.close();
     
    BufferedReader
    字符流缓冲区提供了一次读取一行的方法readLine(),该方法对文本数据的获取,当返回null时,表示读到文件末尾。
    //创建一个读取流对象和文件相关联
    FileReader fr = new FileReader("bufr.txt");
    //为提高效率引入BufferedReader
    BufferedReader bufr = new BufferedReader(bufr);
     
    //读取操作
    String line = null;
    while((line = bufr.readLine())!=null)
    {
    System.out.println(line);
    }
    //关闭流
    bufr.close();
    (三)OutputStream
    FileOutputStream
    需求:通过FileOutputStream向硬盘中写入数据
    FileOutputStream fos = new FileOutputStream("fos.txt");
    fos.write("abcde".getBytes());
    fos.close();
     
    (四)InputStream
    需求:通过FileInputStream读取一个文件并且打印在控制台上
    1,每次读取一个字节
    FileInputStream fis = new FileInputStream("fos.txt");
    int ch = 0;
    while((ch = read())!=-1)
    System.out.println((char)ch);
    fis.close();
    2,每次读取的字节存放入字节数组中
    FileInputStream fis = new FileInputStream("fos.txt");
    int len = 0;
    byte[] buf = new byte[1024];
    while((len=fis.read(buf))!=-1)
     System.out.println(new String(buf,0,len));
    fis.close();
    3,读取一次,将读取到的数据存放入刚刚好的数组中,这种方式一般不建议使用,因为如果数据过大,会造成内存溢出。available()方法,字节流特有的
    FileInputStream fis = new FileInputStream();
    byte[] buf = new byte[fis.available()];
    System.out.println(new String(buf));
    fis.close();
     
    (五)、转换流 InputStreamReader OutputStreamWriter
    转换流是字节流通向字符流的桥梁
    需求:将键盘录入的数据通过转换流打印在控制台上,以over结束
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
    String line = null;
    while((line=bufr.readLine())!=null)
    {
    if("over".equals(line))
    break;
    bufw.write(line.toUpperCase());
    bufw.newLine();
    bufw.flush();
    }
     
    bufr.close();
     
    (六)、流操作规律
    流操作的基本规律,一般通过三个明确来完成
    1,明确源和目的
    源:输入流   InputStream  Reader
    目的:输出流 OutputStream Writer
    2,操作的数据是否是纯文本
    是:字符流
    否:字节流
    3,当体系明确后,在明确要使用那个具体的对象
    通过设备来进行区分
    源设备:内存,硬盘,键盘
    目的设备:内存 硬盘,控制台
     
    二,File
    (一)File类常见方法:
    1,创建。
    boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
    和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
     
    boolean mkdir():创建文件夹。
    boolean mkdirs():创建多级文件夹。
    2,删除。
    boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
    void deleteOnExit();在程序退出时删除指定文件。
     
     
    3,判断。
    boolean exists() :文件是否存在.
    isFile():
    isDirectory();
    isHidden();
    isAbsolute();
     
    4,获取信息。
    getName():
    getPath():
    getParent():
     
    getAbsolutePath() 
    long lastModified() 
    long length() 
    (二)关于File的一个综合案例
    需求:列出指定目录下文件或者文件夹,包含子目录中的内容。
    也就是列出指定目录下所有内容。
    import java.io.*;
    import java.util.*;
    class JavaListDemo
    {
    public static void main(String[] args)
    {
    File dir = new File("e:\possible");
     
    List<File> list = new ArrayList<File>();
     
    File f = new File(dir,"javaList.txt");
     
    fileToList(dir,list);
     
    listToFile(list,f.getAbsolutePath());
    }
    public static void fileToList(File dir,List<File> list)
    {
    File[] files = dir.listFiles();
    for (File f:files)
    {
    if(f.isDirectory())
    fileToList(f,list);
    else
    if(f.toString().endsWith(".java"))
    list.add(f);
    }
    }
    public static void listToFile(List<File> list,String name)
    {
    BufferedWriter bfw = null;
    try
    {
    bfw = new BufferedWriter(new FileWriter(name));
    for(File f:list)
    {
    bfw.write(f.getAbsolutePath());
    bfw.newLine();
    bfw.flush();
    }
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    finally
    {
    try
    {
    if(bfw!=null)
    bfw.close();
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }
    }
     
    三、重要的一些流对象
    1,Properties
    Properties是Hashtable的子类,也就是说它具备map集合的特点而且他里面存储的键值对都是字符串。是集合中的IO技术相结合的结合容器。
    里面的重要方法:setProperty();
    store();
    load();
    list();等等
     
    2,打印流
    printWriter  printStream
    该流提供了打印方法,可以将各种数据类型的数据都原样打印。
    printStream构造函数可以接收的参数类型  File对象  字符串路径  以及字节输出流
    printWriter构造函数可以接收的参数类型  File对象  字符串路径  以及字节输出流 字符输出流
     
    3,合并流SequenceInputStream
    合并流SequenceInputStream构造函数接收的参数是一个枚举类型。将要合并的流对象存储到枚举中,然后通过SequenceInputStream对象合并到一个流中
     
    4,对象的序列化或者持久化 Serializable
    对象进行序列化时,会根据成员自定义一个UID,但若类的成员发生改变 那么存储的对象无法使用
    若对非静态成员变量不想序列化,前面加上transient关键字即可,使其子啊对内存中存在,而不在文件中存在
    注意:静态是不能够序列化的,只能序列化对内存中的
     
    5,管道流  PipedInputStream   PipedOutputStream
    输入输出可以直接进行连接,通常结合线程使用。不建议对这两个对象使用单线程,因为容易发生死锁。
     
    6,RandomAccessFile 这个对象既可以读也可以写
    随机访问文件是支持对随机访问文件的读取和写入。
    这个类不算是IO体系中的子类,而是直接继承自Object。但是它是IO包中的成员,因为他具备读和写的功能。她内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer对象获取指针位置,同时可以通过seek改变指针的位置,也可以通过sikpBytes()只能向前跳跃读写
     
    7,DataStream
    用于操作基本数据类型的对象
     
    8,ArrayStream
    ByteArrayInputStream :在构造的时候需要接收数据源,而且数据源是一个数组。
    ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组,这就是数组目的
    因为这两个流对象都操作的数组,并没有使用系统资源,所以,不进行close关闭。
  • 相关阅读:
    (深入理解计算机系统)内存对齐
    (深入理解计算机系统)AT&T汇编指令
    (深入理解计算机系统)编译,链接和装载
    (C)struct结构体指针
    (linux)BSP板级支持包开发理解
    TortoiseSVN使用笔记
    (linux)idr(integer ID management)机制
    (linux)struct inode 和 struct file
    cygwin使用笔记
    Zookeeper学习总结
  • 原文地址:https://www.cnblogs.com/Rebecca-gg/p/4467468.html
Copyright © 2011-2022 走看看