乐趣区

关于java:新手小白学JAVA-IO流-File-字节流-字符流

通过学习以上的几种流, 咱们也能够拓展尝试做下文件的复制:
创立包: cn.tedu.out
创立类: TestCopyFile.java
package cn.tedu.out;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Scanner;
/**

  • 本类用于测试文件复制
  • 需要: 接管用户输出的文件门路来进行复制, 复制到用户指定的门路下
  • */

public class TestCopyFile {

public static void main(String[] args) {
    //1. 提醒并接管用户输出的要复制的源文件门路 -- 复制啥
    System.out.println("请输出源文件门路:");
    // 导包的快捷键:Ctrl+Shift+O  接管返回值:Alt+Shift+L
    String f = new Scanner(System.in).nextLine();    
    //2. 提醒并接管用户输出的指标文件所在的地位 -- 复制到哪
    System.out.println("请输出指标文件的门路:");
    String t = new Scanner(System.in).nextLine();        
    //3.1 依据源文件门路封装 from 文件对象
    File from = new File(f);
    //3.2 依据指标文件门路封装 to 文件对象
    File to = new File(t);
    //3.3 依据用户提供的门路实现文件的复制操作
    // 自定义复制文件的办法 -- 字符流 -- 只能操作字符相干文件
    //ZFcopy(from,to);
    // 自定义复制文件的办法 -- 字节流 -- 操作啥都行
    ZJcopy(from,to);
}
public static void ZJcopy(File from, File to) {InputStream in = null;//[PayPal 下载](https://www.gendan5.com/wallet/PayPal.html) 定义在整个办法中都失效的字节输出流对象, 留神是局部变量, 须要初始化, 对象的默认值是 null
    OutputStream out = null;// 定义在整个办法中都失效的字节输入流对象, 留神是局部变量, 须要初始化, 对象的默认值是 null
    try {
        //1. 读取 from 文件 -- 操作文件的是字节输出流
        in = new BufferedInputStream(new FileInputStream(from));
        //2. 写出到 to 文件 -- 操作文件的是字节输入流
        out = new BufferedOutputStream(new FileOutputStream(to));
        //3. 边读边写
        int b = 0;// 定义变量 b, 记录读取到的数据
        while((b=in.read()) != -1 ) {// 只有没有数据时, 才返回 -1, 跳出循环, 读写完结
            out.write(b);// 将读到的数据写出到文件
        }
        System.out.println("祝贺您! 文件复制胜利!");
    } catch (IOException e) {System.out.println("很道歉! 文件复制失败!");
        e.printStackTrace();// 打印错误信息}finally {
        // 开释资源
        try {out.close();
        } catch (IOException e) {e.printStackTrace();
        }
        try {in.close();
        } catch (IOException e) {e.printStackTrace();
        }
    }
}
public static void ZFcopy(File from, File to) {// 字符流操作
    Reader in = null ;// 定义在整个办法中都失效的字符输出流对象, 留神是局部变量, 须要初始化, 对象的默认值是 null
    Writer out = null;// 定义在整个办法中都失效的字符输入流对象, 留神是局部变量, 须要初始化, 对象的默认值是 null
    try {
        //1. 读取 from 文件 -- 获取字符流输出对象
        in = new BufferedReader(new FileReader(from));
        //2. 写出到 to 文件中 -- 获取字符流输入对象
        out = new BufferedWriter(new FileWriter(to));
        //3. 边读边写
        int b = 0;// 定义变量, 保留读到的数据
        while((b = in.read()) != -1 ) {// 当没有数据时, 返回 -1, 读取循环完结
            out.write(b);// 将本轮循环读取到的内容写出
        }
        System.out.println("祝贺您! 文件复制实现!");
    } catch (IOException e) {System.out.println("很道歉! 文件复制失败!");
        e.printStackTrace();// 失常打印报错信息}finally {//finally 是 try-catch 构造中肯定会执行的局部, 也就是如果有必须执行到的代码, 能够写在这
        /**
         * 1. 流资源必须开释, 开释的是之前应用过程中所有流对象
         * 2. 关流是有程序的, 留神, 后呈现的流先开释, 为了不影响代码
         * */
        //4. 开释资源
        try {// 用来敞开字符输入流
            out.close();} catch (IOException e) {e.printStackTrace();
        }
        try {// 用来敞开字符输出流
            in.close();} catch (IOException e) {e.printStackTrace();
        }
    }

}

}

退出移动版