zoukankan      html  css  js  c++  java
  • Java Io

     1、流的概念和作用  

      1.1 流的概念

       Java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流.

     1.2 流的作用

       为数据源和目的地建立一个输送通道。

    2、Io流的体系及分类

       

     1、File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
     2、InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
     3、OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
     4、Reader(文件格式操作):抽象类,基于字符的输入操作。
     5、Writer(文件格式操作):抽象类,基于字符的输出操作。
     6、RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。

    字符流和字节流

     1、字节流:数据流中最小的数据单元是字节
     2、字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。
    输入流和输出流
     1、输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道(文件--->程序)
     2、输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道(程序--->文件)。

    3、流的使用

     1.1、File类 

     基本方法的使用

    public static void FiletestDemo() {
            System.out.println(File.separator);  //名称分隔符 (windows)  /(linux 等)
            System.out.println(File.pathSeparator);  //  路径分隔符  ;
    
            //相对路径构建的两种方式
            System.out.println("相对路径!!!!!!!!");
            String path = "E:\BaiduNetdiskDownload";
            String name = "a.txt";
            //第一种方式:
            File file = new File(path, name);
            //第二种方式
            File file1 = new File(new File(path), name);
    
            //绝对路径的构建方式
            File file2 = new File("E:\BaiduNetdiskDownload\a.txt");
        }

    递归遍历文件

        /**
         * 递归遍历文件
         */
        public static void printName(File src) {
            if (null == src || !src.exists()) {
                return;
            }
            System.out.println(src.getAbsolutePath());
            if (src.isDirectory()) { //文件夹
                for (File sub : src.listFiles()) {
                    printName(sub);
                }
    
            }
        }

     1.2、字节流 (可以处理一切文本,视频,音频等)

     输入流:InputStream  FileInputStream  ByteInputStream  

     输出流:OutputStream FileOutputStream ByteOutputStream

       

    /**
     * 字节输入流
     */
    public class FileStreamDemo {
    
        public static void main(String[] args) throws IOException {
            FileUtil.copyDir(new File("D:\a"), new File("D:/d"));
        }
    
        /**
         * 读取文件
         */
        public static void readFile(File file) throws IOException {
            InputStream is = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int len = 0;
            StringBuffer sb = new StringBuffer();
            while (-1 != (len = is.read(bytes))) {
                String str = new String(bytes, 0, len);
                sb.append(str);
            }
            System.out.println(sb.toString());
    
        }
    
        /**
         * 向文件中写入内容
         */
        public static void writeFile(File file) throws IOException {
            OutputStream os = new FileOutputStream(file, true);
            String str = "你好的ad额的的!!!!!!!!!";
            byte[] bytes = str.getBytes();
            os.write(bytes, 0, bytes.length);
            os.close();
        }
    
        /**
         * 源文件
         * 目标文件
         * 拷贝文件
         */
        public static void copyFile(File srcFile, File descFile) {
            try {
                if (srcFile.isFile()) {
                    InputStream is = new FileInputStream(srcFile);
                    OutputStream os = new FileOutputStream(descFile, true);
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while (-1 != (len = is.read(bytes))) {
                        os.write(bytes, 0, len);
                    }
                    os.flush();
                    os.close();
                    is.close();
                } else {
                    throw new RuntimeException("不是文件呢");
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }

     工具类

    public class FileUtil {
    
        /**
         * 拷贝文件夹
         * 如果是文件就直接拷贝文件
         * 如果是文件夹就先创建文件夹
         * @param srcFile
         * @param descFile
         */
        public static void copyDir(File srcFile,File descFile){
             if (srcFile.isFile()){
                 copyFile(srcFile,descFile);
             }else if (srcFile.isDirectory()){
                 descFile.mkdir();
                 for (File sub:srcFile.listFiles()){
                     copyDir(sub,new File(descFile,sub.getName()));
                 }
             }
        }
    
    
        /**
         * 拷贝文件
         *
         * @param src
         * @param desc
         */
        public static void copyFile(String src, String desc) {
            copyFile(new File(src), new File(desc));
        }
    
        /**
         * 拷贝文件
         *
         * @param srcFile  源文件
         * @param descFile 目标文件
         */
        public static void copyFile(File srcFile, File descFile) {
    
            try {
                if (srcFile.isFile()) {
                    InputStream is = new FileInputStream(srcFile);
                    OutputStream os = new FileOutputStream(descFile);
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while (-1 != (len = is.read(bytes))) {
                        os.write(bytes, 0, len);
                    }
    
                    os.flush();
                    os.close();
                    is.close();
                }
    
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    /**
    *ByteInputStream ByteOutStream
    */ public class otherByteArraysDemo { public static void main(String[] args) throws IOException { //readArrays(writeArrays()); byte[] bytes = toFileByteArray(new File("D:\a\dsfs\a.txt")); toArrayFile(bytes, "D:\a\dsfs\b.txt"); } public static byte[] writeArrays() throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); String str = "你是一个好人"; byte[] bytes = str.getBytes(); byteArrayOutputStream.write(bytes, 0, bytes.length); byte[] re = byteArrayOutputStream.toByteArray(); byteArrayOutputStream.close(); return re; } public static void readArrays(byte[] src) throws IOException { InputStream is = new BufferedInputStream(new ByteArrayInputStream(src)); byte[] bytes = new byte[1024]; int len = 0; String strArray = null; while (-1 != (len = is.read(bytes))) { strArray = new String(bytes, 0, len); } System.out.println(strArray.toString()); is.close(); } /** * 1、文件 -->>>程序->字节数组 * 以程序为中心 出去就是输出流 ,流入就是输入流 * 涉及到文件输入流 --->>字节数组输出流 */ public static byte[] toFileByteArray(File src) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(src)); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] desc = null; byte[] bytes = new byte[1024]; int len = 0; while (-1 != (len = is.read(bytes))) { bos.write(bytes, 0, len); } bos.flush(); desc = bos.toByteArray(); is.close(); bos.close(); return desc; } /** * 2、字节数组 --程序->文件 * 字节数组输入流 * 文件输出流 */ public static void toArrayFile(byte[] src, String destPath) throws IOException { InputStream bis = new BufferedInputStream(new ByteArrayInputStream(src)); OutputStream fs = new BufferedOutputStream(new FileOutputStream(destPath)); byte[] bytes = new byte[1024]; int len = 0; while (-1 != (len = bis.read(bytes))) { fs.write(bytes, 0, len); } fs.flush(); fs.close(); bis.close(); } }
     

    1.3、字符流(只能处理文本)

      字符输入流:Reader FileReader

      字符输出流:Writer FileWriter 

    /**
     * 字符流,只能处理纯文本
     */
    public class ReadWriteDemo {
        /**
         * 读文件
         * @param file
         */
        public static void readerFile(File file) {
            try {
                Reader reader = new FileReader(file);
                char[] chars = new char[1024];
                int len = 0;
                StringBuffer sb = new StringBuffer();
                while (-1 != (len = reader.read(chars))) {
                    String str = new String(chars, 0, len);
                    sb.append(str);
                }
                System.out.println(sb.toString());
                reader.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void writeFile(File file) {
            try {
                Writer writer = new FileWriter(file);
                String str = "asdddddddddddddddddddasda!!!!!!!!@@@@@";
                writer.write(str);
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 拷贝文件
         * @param src  源文件
         * @param desc 目标文件
         */
        public static void copyFile(File src, File desc) throws IOException {
            try {
                Reader reader = new FileReader(src);
                Writer writer = new FileWriter(desc);
                char[] chars = new char[1024];
                int len = 0;
                while (-1 != (len = reader.read(chars))) {
                    String str = new String(chars, 0, len);
                    writer.write(str);
                }
                writer.flush();
                writer.close();
                reader.read();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    1.4、处理流(提高性能增强功能)

       解码和编码

    /**
     * 编码和解码   
    * */ public class bMDemo { public static void main(String[] args) throws Exception { //编码 字符窜----->>字节 String str = new String("你哈的"); byte[] bytes = new byte[0]; try { bytes = str.getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(Arrays.toString(bytes)); //解码 字节---->>字符 String strjm = null; try { strjm = new String(bytes, "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(strjm); }

    转换流(字节流---->字符流):编码和解码

      输入流:InputStreamReader   解码  

      输入流:OutputStreamWriter  编码  

    /**
     * 字节流转换成字符流
     */
    public class ZhStreamDemo {
    
        public static void main(String[] args) throws IOException {
            BufferedReader bf=null;
            BufferedWriter bw=null;
            try {
                bf=new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream(new File("D:\a\dsfs\a.txt")))));
                bw=new BufferedWriter(new OutputStreamWriter(new  BufferedOutputStream(new FileOutputStream(new File("D:\a\a.txt")))));
                String str=null;
                while (null!=(str=bf.readLine())){
                    bw.write(str);
                }
    
                bw.flush();
                bf.close();
                bw.close();
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }  

    缓存流 :提高性能 ,代码见上面

     输入流:BufferedInputStream(字节)       BufferedReader(字符)

     输出流: BufferedOutputStream(字节) BufferedWriter (字符) 

    处理基本数据类型流:DataInputStream DataOutputStream

    /**
     * 处理流 基本数据类型+字符窜
     */
    public class dataStreamDemo {
    
        /**
         * 从文件读取数据+类型
         */
        public static void read(String destPath) throws IOException {
            //创建源
            File src = new File(destPath);
            //选择流
            DataInputStream dis = new DataInputStream(
                    new BufferedInputStream(
                            new FileInputStream(src)
                    )
            );
    
            //操作 读取的顺序与写出一致   必须存在才能读取
            //不一致,数据存在问题
            long num2 = dis.readLong();
            double num1 = dis.readDouble();
            String str = dis.readUTF();
    
            dis.close();
            System.out.println(num2 + "-->" + str);
    
        }
    
        /**
         * 数据+类型输出到文件
         */
        public static void write(String destPath) throws IOException {
            double point = 2.5;
            long num = 100L;
            String str = "数据类型";
    
            //创建源
            File dest = new File(destPath);
            //选择流  DataOutputStream
            DataOutputStream dos = new DataOutputStream(
                    new BufferedOutputStream(
                            new FileOutputStream(dest)
                    )
            );
            //操作 写出的顺序 为读取准备
            dos.writeDouble(point);
            dos.writeLong(num);
            dos.writeUTF(str);
            dos.flush();
    
            //释放资源
            dos.close();
    
    
        }
    }  

    处理引用类型流: ObjectInputStream  ObjectOutStream 

    public class User implements Serializable {
        private transient String username;
        private String password;
    
        public User(String username, String password) {
            this.username = username;
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
    /**
     * 序列化和反序列化流
     * 处理引用类型的数据
     */
    public class objectStreamDemo {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            serial("D:\a\dsfs\a.txt");
            fserial("D:\a\dsfs\a.txt");
        }
    
        /**
         * 反序列化(文件--->程序)
         *
         * @param src
         */
        public static void fserial(String src) throws IOException, ClassNotFoundException {
            ObjectInputStream os = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(src))));
            Object o = os.readObject();
            if (o instanceof User) {
                User user = (User) o;
                System.out.println(user.getUsername());
                System.out.println(user.getPassword());
            }
            closeDemo.closaAll(os);
    
        }
    
        /**
         * 序列化(程序--->文件)
         */
        public static void serial(String destPath) throws IOException {
            User user = new User("asd", "123");
            ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File(destPath))));
            os.writeObject(user);
            closeDemo.closaAll(os);
        }
    }

    关闭流的方法

    /**
     * 关闭流的公共调用
     */
    public class closeDemo {
    
        public static void closaAll(Closeable... io) {
            for (Closeable temp : io) {
                try {
                    if (temp != null) {
                        temp.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static <T extends Closeable> void closeAll(T... io) {
            for (Closeable temp : io) {
                try {
                    if (null != temp) {
                        temp.close();
                    }
                } catch (Exception e) {
                }
            }
        }
    }  

    以下的方法使用新增方法不能发生多态

    ByteArrayOutputStream  toByteArray()

    BufferedReader readerLine()

    BufferedWriter newLine();

    DataInputStream DataOutputStream

    ObjectInputStream ObjectOutputStream

    每天进步一丢丢

    完成。 

      

      

     

     

      

      

  • 相关阅读:
    js与jquery常用数组方法总结
    js 对象深复制,创建对象和继承
    Web前端面试常识
    jQuery插件开发之boxScroll与marquee
    jQuery插件开发之windowScroll
    《将博客搬至CSDN》
    蓝桥杯 翻硬币
    AcWing 756.蛇形矩阵
    货仓选址
    费解的开关
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/12783175.html
Copyright © 2011-2022 走看看