zoukankan      html  css  js  c++  java
  • I/O流

    1.理论:

    1.File  文件的操作
    
     创建文件夹(目录)
     mkdir/mkdirs
     创建文件
     createNewFile
     
     把我们自己写的功能打成jar包!
     
     
     2.IO流
       
           编码格式     gb2312  gbk  iso-8859-1    utf-8 
       
     
     
     一组有序的数据序列,我们称之为流!
     
      按照流的走向,我们分为:   输入流和输出流!
      
             源头                        参照物
       自来水公司  ======》 水龙头  ======》使用水(取水)
                          输入流                     输出流
      
          我们输入内容(文字,视频,音频,图片,java对象.....)   到  内存中=====》输入流 
      
         我们从内存中获取(文字,视频,音频,图片,java对象.....)             =====》输出流 
         
         我们所研究的流  以内存 为参照物!
         
         
         所有的输入流都有read()  读
         所有的输出流都有write() 写
         
      基类    
     
     按照数据处理 分为以下 几种!!
     
     
     字节流         byte字节          int类型  4个字节      中文占几个字节?  GBK  2个字节!   utf-8  3个字节!数字和字母都是一个!
        a b c = 我
        
        InputStream
       OutputStream
       都是抽象类,我们使用他们的实现类!
       
       
       释放资源的时候有个原则:
          先开后关!
    
        input
        output
        
        output.close();
        input.close();
    
    
     字符流
          Reader
          Writer
          
    缓冲流
         BufferedReader 
         BufferedWriter
     
     
     2进制流 (图片,视频.....)
       DataInputStream
       DataOutputStream
     
     
     序列化和反序列化
        是持久化技术中的其中一种实现方式!
     
     ObjectInputStream
     ObjectOutputStream
    2.字节流
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * 字节 输入流    从电脑中的某个盘符下的某个文件中   到   内存!!!
     */
    public class FileInputStreamDemo {
    
        public static void main(String[] args) {
            InputStream stream = null;
            try {
                stream = new FileInputStream("e:/io.txt");
                System.out.println("输入流中可读取的字节数:" + stream.available());
                // 定义一个变量 接收int类型的返回值
                int num = 0;
                // 获取文件中的内容
                while ((num = stream.read()) != -1) {
                    System.out.println((char) num);
                }
                /**
                 * stream.read()
                 *       从stream中读取一个8位的字节!然后转换成了0-255之间的整数返回!
                 *       如果读到了stream的结尾,返回-1!
                 * 
                 * stream.read(byte[] b)
                 *       从stream中读取若干个字节,保存到了b字节数组中!
                 *       返回的整数表示读取了多少个字节!如果读到了stream的结尾,返回-1!
                 * 
                 * stream.read(byte[] b,int off,int length)
                 *       从stream中读取若干个字节,保存到了b字节数组中!
                 *       参数off:在b字节数组中开始保存数据的起始下标!
                 *       length:读取的字节数量!返回的整数表示读取了多少个字节!
                 *       如果读到了stream的结尾,返回-1!
                 */
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally { // 释放资源
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }
    FileInputStream
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    /**
     * 字节  输出流
     */
    public class FileOutputStreamDemo {
    
        public static void main(String[] args) {
            OutputStream stream = null;
            try {
                stream = new FileOutputStream("e:/io.txt"); // 不会覆盖之前的内容
                stream.write("我爱你中国!!".getBytes());
                stream.flush(); // 无效
                /**
                 * OutputStream本身没有设置缓冲区!
                 * 它的子类中有! 比如 BufferedOutputStream 和PrintStream中有带缓冲区!
                 * 
                 * 举个例子:
                 *   你家在黄土高坡!
                 *   现在需要从松花江上给老家送 松花蛋!
                 *   
                 *   比如说  你现在需要1000个松花蛋!
                 *   没有缓冲区 就是   每生产一个就会送一个到你家!
                 *   这样需要送1000次!
                 *   有缓冲区,就是先把生产出来的松花蛋放进仓库!等仓库满了之后或者flush()的时候
                 *   才去发送!
                 *   
                 *   flush() 举例:
                 *   现在我的仓库有50个松花蛋!  但是 用户flush(), 那么不需要等待仓库装满!
                 *   立即发送!
                 */
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    FileOutputStream

    3.字符流

    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    
    /*
     * 字符  输入流
     */
    public class FileReaderDemo {
    
        public static void main(String[] args) {
    
            // 创建输入流对象
            Reader reader = null;
            try {
                reader = new FileReader("e:/io.txt");
                int num = 0;
                // 创建char类型的字符数组 用来保存 输入流中的数据
                char[] words = new char[1024];
                // 创建字符串对象
                StringBuffer sb = new StringBuffer();
                while ((num = reader.read(words)) != -1) {
                    sb.append(words);
                }
                System.out.println(sb.toString());
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }
    FileReader
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    /**
     * 字符输出流
     */
    public class FileWriterDemo {
    
        public static void main(String[] args) {
            Writer writer = null;
            try {
                writer = new FileWriter("e:/io.txt", true);
                // 开始从内存中输出到 文件中
                writer.write("我也爱你!");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    writer.close(); // 释放资源
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }
    FileWriter

    4.缓冲区输入输出流

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    
    /**
     * 
     * BufferedReader
     * 
     *  01.带有缓冲区的  输入流
     *  02.可以逐行读取
     */
    public class BufferedReaderDemo {
    
        public static void main(String[] args) {
            Reader reader = null;
            BufferedReader br = null;
    
            try {
                reader = new FileReader("e:/io.txt");
                br = new BufferedReader(reader);
                StringBuffer sb = new StringBuffer();
                String line = null;
                // 开始循环读取
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
                System.out.println(sb.toString());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try { // 释放资源
                    br.close();
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    BufferedReader
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    /**
     * 带有缓冲区的  输出流
     */
    public class BufferedWriterDemo {
    
        public static void main(String[] args) {
    
            Writer writer = null;
            BufferedWriter bw = null;
            try {
                writer = new FileWriter("e:/io.txt", true);
                bw = new BufferedWriter(writer);
                // 开始输出
                bw.write("今天天气不错1111!");
                bw.newLine();
                bw.write("今天天气不错呀2222!");
                bw.flush();
                bw.write("今天天气不错呀3333!");
                bw.write("今天天气不错呀4444!");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bw.close();
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
            }
    
        }
    
    }
    BufferedWriter

    5.二进制输入输出流

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    /**
     * 2进制 的输入 输出流 
     */
    public class DataStreamDemo {
    
        public static void main(String[] args) throws Exception {
            InputStream in = new FileInputStream("e:/U2/music.mp3");
            // 从电脑中读取某个2进制文件
            DataInputStream dis = new DataInputStream(in);
    
            OutputStream out = new FileOutputStream("e:/haha.mp3");
            // 需要从内存中 放到电脑中的指定位置
            DataOutputStream dos = new DataOutputStream(out);
    
            int num = 0;
            // 读取之后 直接 写入
            while ((num = dis.read()) != -1) {
                // 写入
                dos.write(num);
            }
    
            dos.close();
            dis.close();
            out.close();
            in.close();
    
        }
    
    }
    DataStream

     6.序列化和反序列化

    import java.io.Serializable;
    
    /**
     * 这个类创建的对象 就可以 序列化
     */
    public class User implements Serializable {
    
        private String name; // 用户名
        private String password; // 密码
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public User(String name, String password) {
            super();
            this.name = name;
            this.password = password;
        }
    
        public User() {
            super();
        }
    
        @Override
        public String toString() {
            return "User [name=" + name + ", password=" + password + "]";
        }
    }
    User
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.util.Scanner;
    
    /**
     * 序列化 和 反序列化
     */
    public class ObjectStreamDemo {
        static Scanner input = new Scanner(System.in);
    
        public static void main(String[] args) throws Exception {
            // 调用add
            add();
    
            // 登录的方法
            System.out.println("请输入您的用户名:");
            String name = input.next();
            System.out.println("请输入您的密码:");
            String password = input.next();
            /**
             * 用户输入的这个用户名和密码  需要和 文件中的对象 进行比较
             * 01.怎么从文件中获取这个对象到 内存中呢?
             * 02.使用ObjectInputStream  输入流
             */
    
            InputStream in = new FileInputStream("e:/student.txt");
            ObjectInputStream ois = new ObjectInputStream(in);
            User user = (User) ois.readObject();
            if (user.getPassword().equals(password) && user.getName().equals(name)) {
                System.out.println("登录成功!");
            } else {
                System.out.println("登陆失败!");
            }
    
            ois.close();
            in.close();
        }
    
        // 注册用户
        public static void add() throws Exception {
            System.out.println("请输入您的用户名:");
            String name = input.next();
            System.out.println("请输入您的密码:");
            String password = input.next();
            // 创建用户对象
            User user = new User(name, password);
    
            // 想把我们这个user对象放进文件中
            OutputStream out = new FileOutputStream("e:/student.txt");
            ObjectOutputStream oos = new ObjectOutputStream(out);
            oos.writeObject(user);
            oos.close();
            out.close();
    
        }
    
    }
    ObjectStream
  • 相关阅读:
    Forrester:开源APM发展势头强劲
    Forrester:开源APM发展势头强劲
    canvas 绘图api的位置问题
    canvas 绘图api的位置问题
    canvas 绘图api的位置问题
    canvas 绘图api的位置问题
    Android应用层View绘制流程与源码分析
    Android应用层View绘制流程与源码分析
    Android应用层View绘制流程与源码分析
    未来5年到底是做什么生意最好?
  • 原文地址:https://www.cnblogs.com/wwlw/p/7511241.html
Copyright © 2011-2022 走看看