Java IO输入输出流

Java IO输入输出流

初识IO

IO,即是input和output,即输入和输入,指应用程序和外部设备之间的数据传递

流(Stream),是一个抽象的概念,指一连串的数据(字符或字节),以先入先出的方式发送信息的通道

当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接;当程序需要写入数据的时候,就会开启一个通向目的地的流。

流的几大特性
  • 先入先出:最先写入输出流的数据,最先被输入流读取到

  • 顺序存取:可以按顺序一个接一个往流中写入一串字节,读出时也将按顺序读取一串字节,但不允许随机访问其中数据(RandomAccessFile除外)

  • 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两种功能,输入流只能进行读,输出流只能进行写。

流的分类
  1. 按照流的方向分类(以内存为参照物)
    • 往内存中去,叫做输入流,即读操作
    • 从内容中出,叫做输出流,即写操作
  2. 按照读取数据方式的不同分类
    • 按字节的方式读取,一次读取1个字节,可以读取任意类型的文件,如文本、图片、声音等
    • 按字符的方式读取,一次读取1个字符,为方便读取文本文件而存在,只能读取纯文本文件
IO包下的重要流
  1. 文件专属
    • FileInputStream
    • FileOutputStream
    • FileReader
    • FileWriter
  2. 转换流
    • InputStreamWriter
    • OutputStreamReader
  3. 缓冲流专属
    • BufferedReader
    • BufferedWriter
    • BuffertedInputStream
    • BuffertedOutputStream
  4. 数据流专属
    • DataInputStream
    • DataOutputStream
  5. 标准输出流
    • PrintWriter
    • PrintStream
  6. 对象专属流
    • ObjectInputStream
    • ObjectOutputStream
对任意文件的读写

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

public class myFileCopy {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        //每次拷贝1MB
        byte[] bytes = new byte[1024*1024];
        int readCount = 0;
        StringBuilder sb = new StringBuilder();

        try {
            fis = new FileInputStream("test.jpg");
            fos = new FileOutputStream("test1.jpg");
            //一边读一边写
            while ((readCount = fis.read(bytes)) != -1){
                fos.write(bytes,0,readCount);
            }
            //强制输出所有输出流
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //不分开写一个出问题就会影响到另一个流的关闭
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

目录的复制(递归)
import java.io.*;

public class FileTest {
    //目标目录路径
    public static String tempPath = "D:\\doc\\ideaDoc\\javaweb\\goodsTemp";

    public static void main(String[] args) {
        //源文件路径
        File file = new File("D:\\doc\\ideaDoc\\javaweb\\goods");
        copyAllFile(file,tempPath);
    }

    public static void copyAllFile(File file,String path){
        //拼接出目标目录路径
        path = path + "\\" + file.getName();
        if(file.isFile()){
            copyFile(file,path);
        }
        else if(file.isDirectory()){
            File myFile = new File(path);
            //递归到最后一级目录时创建到该目录下所有目录
            myFile.mkdirs();
            File[] files = file.listFiles();
            for(File f : files){
                //复制目录下文件到目标目录
                copyAllFile(f,path);
            }
        }
    }

    public static void copyFile(File file,String path){
		//使用缓冲字节流可以提高读写效率,这里用的文件字节流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            int readCount = 0;
            fis = new FileInputStream(file);
            fos = new FileOutputStream(path);
            byte[] bytes = new byte[1024];
            while ((readCount = fis.read(bytes)) != -1)
                fos.write(bytes,0,readCount);
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值