• Java I/O Basic


    /*
    记住每个类相应的用法
    */
    流的分类:
    io包内定义了所有的流
    分类:
    方向:输入流、输出流
    处理数据单位:字节流、字符流
    功能不同:节点流、处理流

    所有流类型,位于java.io包内,分别继承以下四种抽象流类型
    InputStream 字节流、输入流
    OutputStream 字节流、输出流
    Reader 字符流、输入流
    Writer 字符流、输出流

    节点流:从一个特定的数据源(节点,如文件、内存)读写数据
    处理流:“连接”在已存在的流(字节流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

    继承自四个抽象类的类:
    InputStream:继承自 InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit)。
    继承自 InputStream的类:
    节点流:
    FileInputStream
    PipedInputStream
    ByteArrayInputStream
    StringBufferInputStream
    处理流:
    FilerInputStream:
    LineNumberInputStream
    DataInputStream
    BufferedInputStream
    PushbackInputStream
    SequenceInputStream
    ObjectInputStream
    InputStream的基本方法:
    int read():读取一个字节,并以整数形式返回(0~255),若输出-1则已都导输入流末尾
    int read(byte[] buffer) throws IOException
    int read(byte[] buffer, int offset, int length) throws IOException
    void close()

    OutputStream的主要方法:
    void flush() throws IOException : 将输出流中缓冲的数据全部写出到目的地

    节点流类型
    File(文件):
    字符流: FileReader FileWriter
    // One Class

    FileReader fr = new FileReader("d:\test.java");
    c = fr.read(); // 读取一个字符
    system.out.println((char)c);

    // One Class

    FileWriter fw = new FileWriter("d:\test2.dat");
    int c = 0;
    fw.writer(c);

    字节流: FileInputStream FileOutputStream
    Memory Array
    字符流: CharArrayReader CharArrayWriter
    字节流: ByteArrayInputStream ByteArrayOutputStream
    Memory String
    字符流: StringReader StringWriter
    Pipe:
    字符流: PipedReader PipedWriter
    字节流: PipedInputStre am PipedOutputStream
    凡是Reader或者Writer都是字符,Stream都是字节

    处理流类型:包在别的流上的流
    Buffering(缓冲流):显著减少对IO读写的次数,保护硬盘
    字符流: BufferedReader BufferedWriter
    FileInputStream fis = new FileInputStream("d:\test3.java");
    BufferedInputStream bis = new BufferedInputStream(fis);
    system.out.println(bis.read());
    字节流:BufferInputStream BufferedOutputStream
    Coverting between bytes and character(转换流):字节流转换为字符流
    字符流:InputStreamReader OutputStreamWriter
    // One Case

    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d:test4.txt"));
    osw.writer("asdsddeeffdgd"); 06-06

    // One Case

    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);    // br 这个对象有readLine() 方法,这个方法比较好用
    String s = br.readLine(); // br.readLine() 这个方法阻塞等待前端输入数据
    System.out.println(s);

    Data conversion
    字节流: DataInputStream DataOutputStream 提供了可以存取与机器无关的Java原始类型数据(int/double等)的方法,直接将数据以原始数
    据类型存入存储设备,而且是UTF-8的,省空间。
    构造方法分别为 DataInputStream(InputStream in)和 DataOutputStream(OutputStream out)
    // One Case

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);
    dos.writeDouble(Math.random());    // 先写入8个字节
    dos.writeBoolean(true);    // 再写入一个字节 
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    DataInputStream dis = new DataInputStream(bais);
    System.out.println(dis.readDouble());    // 先写进去的先读出来
    System.out.println(dis.readBoolean());    // 后写进去的后读出来
    dos.close; dis.close;

    Print流
    PrintWriter和PrintStream都属于输出流,分别针对字符和字节
    PrintWriter和PrintStream提供了重载的print
    println()方法用于多种数据类型的输出。
    PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
    PrintWriter和PrintStream有自动flush功能。

    // One Case

    FileOutputStream fos = new FileOutputStream("d:\test5.txt");
    PrintStream    ps = new PrintStream(fos);
    if(ps != null){
    System.setOut(ps);    // 设置内容输出的位置,默认为屏幕
    }
    System.out.print("asdads");

    // One Case

    // 打印日志
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    FileWriter fw = new FileWriter("d:\logFile.log", true);    //    加 true是为了每次写入时在原来数据的后面写入,而不覆盖原来的日志
    PrintWriter log = new PrintWriter(fw);
    log.println("-------");
    log.println("today's log");
    log.fulsh
    log.println("====" + new Date() + "====");
    log.close();

    Object Serialization:把整个Object 写入存储设备。(序列化:一个Object直接写到硬盘上)
    字节流:ObjectInputStream ObjectOutputStream
    // One Case 序列化地保存一个对象的属性

    class T implements Serializable    // Serializable 为序列化标记接口,不包含任何方法,标记给编译器看
                {
                    int i = 10;
                    int j = 9;
                    double d = 2.3;
                    int k = 15;
                }
                
                T t = new T();
                t.k = 8;
                FileOutputStream fos = new FileOutputStream("d:/test6.dat");
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(t);
                oos.flush();
                oos.close();
                
                FileInputStream fis = new FileInputStream("d:/test6.dat");
                ObjectInputStream ois = new ObjectInputStream(fis);
                T tReaded = (T)ois.readObject();
                System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);

    transient 关键字(透明的)某个属性是透明的,序列化的时候不予考虑,该属性对应的值为默认值。

    Byte Streams
    程序使用8-bit 字节的比特流执行输入输出
    文件I/O byte流:FileInputStream/FileOutputStream

    Always Close Streams

    public class CopyBytes {
    public static void main(String[] args) throws IOException {
    FileInputStream in = null;
    FileOutputStream out = null;
    try {
    in = new FileInputStream("xanadu.txt");
    out = new FileOutputStream("outagain.txt");
    int c;
    while ((c = in.read()) != -1) {
    out.write(c);
    }
    } finally { // 关闭一个流
    if (in != null) {
    in.close();
    }
    if (out != null) {
    out.close();
    }
    }
    }
    }

    FileReader/FileWriter

  • 相关阅读:
    [美团 CodeM 初赛 Round A]最长树链
    [POI2005]Toy Cars
    [CodePlus2017NOV]晨跑
    [JLOI2011]不重复数字
    [NEERC2007][SHOI2008]Cactus Reloaded
    [NOI2015]软件包管理器
    [HAOI2015]树上操作
    CF1097D Makoto and a Blackboard
    Luogu P5339 [TJOI2019]唱、跳、rap和篮球
    HNCPC2019H 有向图
  • 原文地址:https://www.cnblogs.com/tf-Y/p/5218076.html
Copyright © 2020-2023  润新知