java字符编码与解码,字节输入输出流,字符输入输出流,文件拷贝

Java中的I/O流用于处理数据输入和输出,涉及编码解码、字节输入输出流和字符流。InputStream用于字节流,如按字节读取文件;OutputStream处理输出,可用于文件拷贝。字符流适用于字符处理,避免乱码问题。本文深入探讨了这些概念和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java I/O流
在java中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。

为什么要使用输入输出流
例如,我们平时用的 Office 软件,对于 Word、Excel 和 PPT 文件,我们需要打开文件并读取这些文本,和编辑输入一些文本,这都需要利用输入和输出的功能。在现实生活中,输入和输出的例子比比皆是。

什么是I/O流
I/O流概念:输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备。

数据流是java进行I/O操作的对象,

数据流按照不同标准的分类:

  • 按照流的方向主要分为输入流和输出流两大类。
  • 数据流按照数据单位的不同分为字节流和字符流。
  • 按照功能可以划分为节点流和处理流。

数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才能处理后一个数据。数据流以输入流的形式被程序获取,再以输出流的形式将数据输出到其它设备
 

编码与解码

        String str  = "张三abc";
        byte[] utf8s = str.getBytes("utf8");//采用utf-8字符集编码为字节数组
        System.out.println(new String(utf8s,"utf8"));//采用utf-8字符集解码
        System.out.println(Arrays.toString(utf8s));    

InputStream输入流

  • 一个字节一个字节读取文件
  • 定义字节数组读取文件
  • 一次性读取全部文件内容,防止乱码问题 
        //1.InputStream输入流读取文件
        InputStream inputStream = new FileInputStream("src/file/test.txt");//获取字符输入流
        int read;
        while ((read=inputStream.read()) != -1){  //一个字节一个字节读数据
            System.out.print((char)read);
       }


         //2.方法改进 以上一个字节一个字节读取效率太慢
        InputStream inputStream2 = new FileInputStream("src/file/test2.txt");//获取字符输入流
        byte[] bytes = new byte[1024];//定义一个长度为1024的数值,一次读取这些长度的数据
        int len;//记录读取的字节数
        while ((len = inputStream2.read(bytes))!=-1){
            System.out.print(new String(bytes,0,len));//从0开始读到len
        }


        //3.解决乱码问题,一次性读完全部内容
        File file = new File("src/file/test3.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] by = fileInputStream.readAllBytes();//一次性读完全部内容,但是有最大限制
        System.out.println(new String(by));

OutputStream输出流

 OutputStream outputStream = new FileOutputStream("src/file/out.txt");//创建输出流对象,指定写入文件,创建完会清空此文件之前的数据
        OutputStream outputStream2 = new FileOutputStream("src/file/out.txt",true);//创建输出流对象,指定写入文件,后面写入内容在原始内容上追加
        outputStream2.write(97); //写入字母a
        outputStream2.write("\r\n".getBytes("UTF8"));  //换行
        outputStream2.write("张山".getBytes("UTF8"));  //写入文字张山,需要将中文字符转化为字节再写入
        outputStream2.write("张山".getBytes("UTF8"),0,3);  //指定范围写入字节
        outputStream2.flush();//刷新数据
        outputStream2.close();//刷新数据,关闭流
        outputStream.close();

文件拷贝

   //TODO 文件拷贝
        InputStream is = null;
        OutputStream os = null;
        try{
            //创建输入流对象
             is = new FileInputStream("C:\\Users\\30101\\Videos\\Captures\\VehicleManagement_src_main_Demo.java - Eclipse IDE 2021-05-21 20-15-50.mp4");
            //创建输出流对象
             os = new FileOutputStream("C:\\Users\\30101\\Videos\\Captures\\copy.mp4");
            //一次性读取1024个字节
            byte[] bs = new byte[1024];
            int l;
            while ((l=is.read(bs))!=-1){
                os.write(bs,0,l);  //写入
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally { //无论是否出现异常,此处代码一定会执行
            //关闭资源
              if (os != null)os.close();
              if (is != null) is.close();
        }



        //TODO 文件拷贝-代码简化
            try(
                InputStream  is2 = new FileInputStream("C:\\Users\\30101\\Videos\\Captures\\VehicleManagement_src_main_Demo.java - Eclipse IDE 2021-05-21 20-15-50.mp4");//被拷贝的文件
                OutputStream  os2 = new FileOutputStream("C:\\Users\\30101\\Videos\\Captures\\copy.mp4");//复制品
                //无论下方代码是否出现异常,都会自动释放资源。里面只能放资源,需要实现Closeable接口
                ){
            //一次性读取1024个字节
            byte[] bs = new byte[1024];
            int l;
            while ((l=is2.read(bs)) != -1) os2.write(bs,0,l);
        }catch (Exception e){
            e.printStackTrace();
        }

字符流

      //输入流
        Reader reader = new FileReader("D:\\Desktop\\letcode\\src\\file\\test3.txt");
        int s;
        while (( s =reader.read())!=-1){//一个一个字符读取
            System.out.print((char) s);
        }

        Reader reader2 = new FileReader("D:\\Desktop\\letcode\\src\\file\\test3.txt");
        char[] chars = new char[1024];
        int lens;
        while ((lens=reader2.read(chars))!=-1){ //每次读取1024个字符,效率更高
            System.out.print(new String(chars,0,lens));
        }



        //输出流
        Writer writer = new FileWriter("src/file/writer.txt");
        writer.write('a');//写一个字符
        writer.write('烟');
        writer.write(97);
        writer.write("张三".toCharArray());//写一个字符数组
        writer.write("\r\n");//换行
        writer.write("我的国家",0,2);//指定范围写入

        writer.close();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值