Java常用IO流详解

一、流的分类:

  • 按照数据流向的不同:输入流 输出流
  • 按照处理数据的单位的不同:字节流 字符流(处理的文本文件)
  • 按照角色的不同:节点流(直接作用于文件的) 处理流

二、IO的体系

  •    抽象基类        节点流(文件流)     缓冲流(处理流的一种)
  • InputStream       FileInputStream        BufferedInputStream
  • OutputStream    FileOutputStream     BufferedOutputStream
  • Reader               FileReader               BufferedReader
  • Writer                 FileWriter                  BufferedWriter

三、实例

    基类InputStream、OutputStream   字节流既可以用来处理媒体数据也可以用来处理文本数据

         1. FileInputStream和FileOutputStream

package com.yyx.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileInputStreamOutputStreamDemo {
    public static void main(String[] args) {
        testFileInputStreamOne();
        System.out.println("=================");
        testFileInputStreamTwo();
        System.out.println("=================");
        testFileOutputStreamOne();
        System.out.println("=================");
        testInputStreamOutputStreamOne();
        System.out.println("=================");
        testInputStreamOutputStreamTwo();
    }

    /**
     * 读取文本文件
     */
    public static void testFileInputStreamOne() {
        String pathname = "F:" + File.separator + "source.txt";
        File file = new File(pathname);
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            // 读取到的数据要写入的数组
            byte[] b = new byte[5];
            // 每次读入到byte中的字节的长度
            int len;
            while ((len = fis.read(b)) != -1) {
                String str = new String(b, 0, len);
                System.out.print(str);
            }
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 读取文本文件
     */
    public static void testFileInputStreamTwo() {
        String pathname = "F:" + File.separator + "source.txt";
        File file = new File(pathname);
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            int b;
            /*
             * read():读取文件的一个字节。当执行到文件结尾时,返回-1 此方法如文件内容有中文名出现乱码
             */
            while ((b = fis.read()) != -1) {
                System.out.print((char) b);
            }
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 写入文本文件
     */
    public static void testFileOutputStreamOne() {
        String pathname = "F:" + File.separator + "target.txt";
        File file = new File(pathname);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
            String str = "*中国--China*";
            fos.write(str.getBytes());
            System.out.println("写入成功");
            fos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 复制文本文件
     */
    public static void testInputStreamOutputStreamOne() {
        // 此处两个文件都已存在
        String sourcePathName = "F:" + File.separator + "source.txt";
        String targetPathName = "F:" + File.separator + "target.txt";
        File sourceFile = new File(sourcePathName);
        File targetFile = new File(targetPathName);
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(sourceFile);
            fileOutputStream = new FileOutputStream(targetFile);
            // 3.实现文件的复制
            byte[] b = new byte[1024];
            int len;
            while ((len = fileInputStream.read(b)) != -1) {
                fileOutputStream.write(b, 0, len);
            }
            fileOutputStream.flush();
            System.out.println("复制文本成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 复制图片文件
     */
    public static void testInputStreamOutputStreamTwo() {
        // 此处两个文件都已存在
        String sourcePathName = "F:" + File.separator + "source.jpg";
        String targetPathName = "F:" + File.separator + "target.jpg";
        File sourceFile = new File(sourcePathName);
        File targetFile = new File(targetPathName);
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(sourceFile);
            fileOutputStream = new FileOutputStream(targetFile);
            // 3.实现文件的复制
            byte[] b = new byte[1024];
            int len;
            while ((len = fileInputStream.read(b)) != -1) {
                fileOutputStream.write(b, 0, len);
            }
            System.out.println("复制图片成功");
            fileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

         2. BufferedInputStream和BufferedOutputStream

package com.yyx.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileInputStreamOutputStreamDemo {
    public static void main(String[] args) {
        // 此处两个文件都已存在
        String sourcePathName = "F:" + File.separator + "source.jpg";
        String targetPathName = "F:" + File.separator + "target.jpg";
        File sourceFile = new File(sourcePathName);
        File targetFile = new File(targetPathName);
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            fileInputStream = new FileInputStream(sourceFile);
            fileOutputStream = new FileOutputStream(targetFile);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            // 3.实现文件的复制
            byte[] b = new byte[1024];
            int len;
            while ((len = bufferedInputStream.read(b)) != -1) {
                bufferedOutputStream.write(b, 0, len);
            }
            System.out.println("复制图片成功");
            bufferedOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
} 

    基类Reader、Writer   字符流只用来处理文本数据

         1. FileReader和FileWriter 

package com.yyx.test;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReaderWriterDemo {
    public static void main(String[] args) {
        testReaderOne();
        System.out.println("=================");
        testReaderTwo();
        System.out.println("=================");
        testWriter();
        System.out.println("=================");
        testReaderWriter();
    }

    /**
     * 推荐:使用字节组读取
     */
    public static void testReaderOne() {
        // 方法中文件已经存在
        String pathname = "F:" + File.separator + "source.txt";
        File file = new File(pathname);
        FileReader fr = null;
        try {
            fr = new FileReader(file);
            char[] buf = new char[6];
            int num = 0;
            while ((num = fr.read(buf)) != -1) {
                String str = new String(buf, 0, num);
                System.out.print(str);
            }
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用单个字母读取
     */
    public static void testReaderTwo() {
        // 方法中文件已经存在
        String pathname = "F:" + File.separator + "source.txt";
        File file = new File(pathname);
        FileReader fr = null;
        try {
            fr = new FileReader(file);
            int ch;
            while ((ch = fr.read()) != -1) {
                System.out.print((char) ch);
            }
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void testWriter() {
        String pathname = "F:" + File.separator + "target.txt";
        File file = new File(pathname);
        FileWriter fw = null;
        try {
            fw = new FileWriter(file);
            String str = "*中国--China*";
            fw.write(str);
            System.out.println("写入成功");
            /*
             * flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入
             */
            fw.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 复制文件
     */
    public static void testReaderWriter() {
        // 此处两个文件都已存在
        String sourcePathName = "F:" + File.separator + "source.txt";
        String targetPathName = "F:" + File.separator + "target.txt";
        File sourceFile=new File(sourcePathName);
        File targetFile=new File(targetPathName);
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        try {
            fileReader = new FileReader(sourceFile);
            // true表示追加写入,默认是false
            fileWriter = new FileWriter(targetFile, true);
            char[] buf = new char[1024];
            // 将文件读取到buf数组中
            int num = 0;
            while ((num = fileReader.read(buf)) != -1) {
                fileWriter.write(new String(buf, 0, num));
            }
            System.out.println("复制成功");
            fileWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

         2. BufferedReader和BufferedWriter

  • BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
  • BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
package com.yyx.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReaderWriterDemo {
    public static void main(String[] args) {
        // 此处两个文件都已存在
        String sourcePathName = "F:" + File.separator + "source.txt";
        String targetPathName = "F:" + File.separator + "target.txt";
        File sourceFile=new File(sourcePathName);
        File targetFile=new File(targetPathName);
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {
            fileReader = new FileReader(sourceFile);
            // true表示追加写入,默认是false
            fileWriter = new FileWriter(targetFile, true);
            bufferedReader = new BufferedReader(fileReader);
            bufferedWriter = new BufferedWriter(fileWriter);
            char[] buf = new char[1024];
            // 将文件读取到buf数组中
            int num = 0;
            while ((num = bufferedReader.read(buf)) != -1) {
                bufferedWriter.write(new String(buf, 0, num));
            }
            System.out.println("复制成功");
            bufferedWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
 

原文地址:https://www.cnblogs.com/xianya/p/9191217.html

时间: 2024-10-07 21:38:33

Java常用IO流详解的相关文章

Java之IO流详解

IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. 输出:从内存中把数据写入外部存储区(硬盘.磁带.U盘)中,这样就可以保证:即使程序退出了,数据依然不会丢失. File — 代表磁盘上的文件或目录. ●  listRoots() :列出磁盘上所有的根目录 ● exists:判断是否存在 ● mkdir:创建目录 ● listFiles():列出当

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打

java常用IO流数据流小结

  类名 常用方法 说明 输入流 InputStream int read(); 只能读字节流,虽然返回值是int,但只有低8位起作用. DataInputStream Type readType(); 可以读二进制流,可以读byte,short,int,long,double等二进制流. BufferedReader String readLine(); 可以读文本行. 输出流 OutputStream void write(int); 只能写字节流,虽然形参是int,但只有低8为起作用. D

基于JavaSE阶段的IO流详解

1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有输入流类都是抽象类,是InputStream或者抽象类Reader的子类:而所有输出流都是抽象类,是OutputStream或者Writer的子类.输入输出流的定义是根据流向所决定的,我们可以是本地为一个实体物质,从外界往本地输入,按照本地的状态就是读取,反之,从本地向外写入就是输出.IO流是最基本

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

java IO流详解(一)

从本篇博文开始,详细讲解JAVA IO流的基本操作,力求每一个例子都给大家一个DEMO,在最终完成的时候,我会贴出最终的源码,方便大家交流学习. 上一篇博文中转载了大神的博文和图片,非常好! 文章链接如下:Java IO流 下面一个个的用实例进行讲解每个IO流的基本用法. 1 File文件 public static void main(String[] args) throws IOException { File file = new File("."); myPrint(file

《java基础知识》Java IO流详解

Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和字符流. 5. 将计算机语言:二进制数据转换成文件显示到电脑上. IO包:继承关系图: 字符流: Reader :读取字符流,方法见API. Writer :写入字符流,方法见API. 案例(Writer ): import java.io.*; public class var { public

Java IO流详解(二)——File类

在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建.查找和删除等操作.即Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件或者目录只要创建File这个类即可. 不过要注意的是File类只是对文件的操作类,只能对文件本身进行操作,不能对文件内容进行操作. 1.File

Java IO流详解(五)——缓冲流

缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低,效能差时.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时加上缓冲流提升性能. Java IO流中对应的缓冲流有以下四个: 字节缓冲流:BufferedInputStream.BufferedOutputStream 字