IO/拷贝文件的四种方法/解决乱码

编程入门 行业动态 更新时间:2024-10-26 18:25:10

IO概述

分类

IO流根据传输方向分为两种:输入流(读),输出流(写)
根据单位:字节流(java.io.InputStream,java.io.OutputStream),字符流(java.io.Reader,java.io.Writer)

上面是InputStream,下面是OutputStream
σ_›σ 原谅我从百度随便抠的图☝☝☝

字节流(文本,图片,音频,视频)

在JDK中提供两个抽象类InputStream,OutputStream作为字节流的顶级父类。可以把InputStream,OutputStream比作两根水管。
InputStream输入管道,源设备—>程序
OutputStream输出管道,程序—>目标设备
最后一定要关闭管道!!避免浪费资源!!
下面是最完整的写法:

OutputStream out = null;
    try {
            out = new FileOutputStream(file);
            out.write(content.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//finally一定会执行,所以在这里关流
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                out = null;//交付给gc
            }
        }

拷贝文件

public void copy_Paste(String srcPath,String destPath) throws Exception{

        FileInputStream fis = new FileInputStream(srcPath);
        FileOutputStream fos = new FileOutputStream(destPath);

下面提供4种方法进行拷贝

        /**1.一个个字节:效率低**/
        int data1 = fis.read();

        while(data1!=-1){
            fos.write((char)data1);
            data1 = fis.read();
        }
/**2.用一个数组作为缓冲**/
byte[] buff = new byte[1024];
        int total = fis.read(buff);
        while(total!=-1){
            fos.write(buff);
            total = fis.read(buff);
        }
    /**3.缓冲流**/
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int data2 = bis.read();
        while(data2!=-1){
            bos.write(data2);
            data2 = bis.read();
/**4.数据输入输出流**/
 DataInputStream dis = new DataInputStream(fis);//包装了fis
        DataOutputStream dos = new DataOutputStream(fos);
        int d = dis.readInt();
        dos.writeInt(d);
        while(dis.available()>0){
            d = dis.readInt();
            dos.writeInt(d);

        //关流 先关输入再关输出,不然水管会爆。。
        dis.close();
        dos.close();
        //由于DataInputStream,DataOutputStream是包装流
        //所以下面两行可以不用写
        fis.close();
        fos.close();

字符流(文本文件)

参考上面第四点

标准输入输出流

在System类中定义了三个常量:in,out,err,它们被习惯性地称为标准输入输出流

常量类型作用
inInputStream标准输入流默认用于读取键盘输入的数据
outPrintStream标准输出流默认将数据输出到命令行窗口
errPrintStream标准错误流与out类似,通常输出的是应用程序运行时的错误信息

File类

File类用于封装一个路径

public void copy_Paste(String srcPath,String destPath) {
  copy_Paste(new  File(srcPath),new  File(destPath));
}

乱码问题

产生原因

字符=字节+编码

字节是计算机信息技术用于计量存储容量的一种计量单位,因此字节流也称为万能流 而编码方式不同,可能导致字符和字节的换算方式不同,可能1字符=2字节,也可能1字符=3字节


编码是将数据转化为二进制的过程,解码则是编码的逆过程 因此,乱码问题都出现在解码过程中


注意:下图字符集中只有GBK可以对汉字进行编码(以GB开头的编码方式都包含中文字符)

再比如:”中文”二字的GBK的字节流为d6 d0 ce c4,如果用utf-8(不支持中文)去解码,势必会乱码。

解决方法

  • 指定read,write编码

InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。

OutputStreamWriter(OutputStream out, CharsetEncoder enc)
创建使用给定字符集编码器的 OutputStreamWriter。


  • 重新编码,怎么来怎么回

String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。

更多推荐

IO/拷贝文件的四种方法/解决乱码

本文发布于:2023-06-13 22:39:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1412406.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:乱码   四种   文件   方法   IO

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!