IO流的分类与设计之案例

IO流的分类与设计案例

场景一、输出纯文本数据

从键盘输入留言,并保存到message.txt文件中

public static void main(String[] args) {
         //从键盘输入留言,并保存到message.txt文件中
        Scanner scanner = new Scanner(System.in);
        //1.选择合适的流 因为是纯文本数据,可以选用效率高的字符输出流
        FileWriter writer = null;
        File file = new File("D:\\test\\io");
        file.mkdirs();
        File file1 = new File(file,"message.txt");
        try {
            writer = new FileWriter(file1);


        //2.循环操作
        while (true){
            System.out.println("请输入留言");
            String message = scanner.nextLine();
            if("stop".equals(message)){
                break;
            }
            writer.write(message+"\r\n");
            writer.flush();
        }
        //3.关闭流
            scanner.close();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

场景二、读取纯文本数据

读用户留言信息 message.txt的内容

 public static void main(String[] args) {
         //读用户留言信息 message.txt的内容
         File file = new File("D:\\test\\io\\message.txt");
         FileReader  fileReader = null;
         try {
            fileReader = new FileReader(file);
            char[] chars = new char[1024];
            int len = 0;
            while ((len = fileReader.read(chars)) != -1){
                System.out.println(new String(chars,0,len));
            }
         } catch (Exception e) {
            e.printStackTrace();
         }finally {
             try {
                 if(fileReader != null){
                     fileReader.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
    }

场景三、按行读取数据

按行读用户留言信息 message.txt的内容(用包装流)

public static void main(String[] args) {
         //按行读用户留言信息 message.txt的内容(用包装流)
         File file = new File("D:\\test\\io\\message.txt");
         FileReader  fileReader = null;
         BufferedReader bufferedReader = null;
         try {
            fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String str = null;
            while ((str = bufferedReader.readLine()) != null){
                System.out.println(str);
            }
         } catch (Exception e) {
            e.printStackTrace();
         }finally {
             try {
                 if(fileReader != null){
                     fileReader.close();
                 }
                 if(bufferedReader != null){
                     bufferedReader.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
    }

场景三、复制文件基本版

将图片从一个目录复制到另一个目录下
文件IO流,和文件的数据传输:
(1)文件字节输入流:FileInputStream
(2)文件字节输出流:FileOutputStream
(3)文件字符输入流:FileReader,只能按照平台默认的编码方式读取数据
(4)文件字符输出流:FileWriter,只能按照平台默认的编码方式写入数据
注意:
在写入一个文件时,如果目录下有同名文件将被覆盖,除非是追加模式。
在读取文件时,必须保证该文件已存在,否则出异常。

public static void main(String[] args) {
        //将图片从一个目录复制到另一个目录下
        //1.选取流  字节流(这里操作的是图片,故用二进制操作)
        FileInputStream fis = null;
        FileOutputStream fop = null;
        try {
             fis = new FileInputStream(new File("D:\\test\\io\\狼王.jpg"));
             fop = new FileOutputStream(new File("D:\\test\\小王.jpg"));
            //2.循环操作
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fis.read(bytes)) != -1){
                fop.write(bytes,0,len);
                fop.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //3.关闭流
            try{
                if(fis != null){
                    fis.close();
                }
                if(fop != null){
                    fop.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

场景四、复制文件提升效率版

public static void main(String[] args) {
        //将图片从一个目录复制到另一个目录下
        //1.选取流  字节流(这里操作的是图片,故用二进制操作)
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fop = null;
        BufferedOutputStream bps = null;
        try {
             fis = new FileInputStream(new File("D:\\test\\io\\狼王.jpg"));
             bis = new BufferedInputStream(fis);
             fop = new FileOutputStream(new File("D:\\test\\小王.jpg"));
             bps = new BufferedOutputStream(fop);
            //2.循环操作
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = bis.read(bytes)) != -1){
                bps.write(bytes,0,len);
                bps.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //3.关闭流
            try{

                if(fis != null){
                    fis.close();
                }
                if (bis != null) {
                    bis.close();
                }
                if(fop != null){
                    fop.close();
                }
                if(bps != null){
                    bps.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

场景五、读写纯文本数据的同时进行编码和解码

解码

当要读取指定编码的纯文本数据时,可以使用InputStreamReader进行解码。所谓解码,即把二进制的字节序列按照指定字符编码解码为可以被正确识别的字符内容。
InputStreamReader()默认使用UTF-8编码格式

public static void main(String[] args) {
        BufferedReader bw = null;
        String message = null;

        try{
           bw = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test\\指定编码.txt")));
           while ((message = bw.readLine()) != null){
               System.out.println(message);
           }
         }catch (Exception e){
             e.printStackTrace();
         }finally {
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

编码

将不同编码的文件进行转换

public static void main(String[] args) {
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test\\指定编码ANSI.txt"),"GBK"));
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\test\\指定编码UTF-8.txt"),"UTF-8"));
            String str = null;
            while ((str = br.readLine()) != null){
                bw.write(str);
                bw.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try{
                if(br != null){
                    br.close();
                }
                if(bw != null){
                    bw.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }

场景六、操作java基本数据类型

 public static void main(String[] args) {
        saveData();
        getData();
    }

    static void saveData(){
        String name = "张三";
        int age = 18;
        double ge = 7600.00;
        long salary = 1000000;

        DataOutputStream dos = null;

        try {
            dos = new DataOutputStream(new FileOutputStream("D:\\test\\data.bat"));
            dos.writeUTF(name);
            dos.writeInt(18);
            dos.writeDouble(ge);
            dos.writeLong(salary);
            dos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    static void getData(){
        DataInputStream dos = null;
        try{
            dos = new DataInputStream(new FileInputStream("D:\\test\\data.bat"));
            System.out.println(dos.readUTF());
            System.out.println(dos.readInt());
            System.out.println(dos.readDouble());
            System.out.println(dos.readLong());
            dos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值