彻底学会IO流

2023-10-31

概述:
  • IO流就是用来处理设备间数据传输问题的.常见的应用: 文件复制; 文件上传; 文件下载
  • IO的数据传输,可以看做是一种数据的流动,按照流动的方向,已内存为参照物,进行读写操作
  • IO可以保存到文件,其实就是内存在读取,内存在写入,而且不会消失,字节流可以操作任何类型的文件(音频、图文)都可以
IO流分类:

根据数据的流向分为:

  • 输入流(Input) :把数据从其他设备上读取到内存中的流。
  • 输出流(Output) :把数据从内存中写出到其他设备上的流。

根据数据的类型分为:

  • 字节流 :以字节为单位,读写数据的流。(通用的,可以操作任何类型的数据)
  • 字符流 :以字符为单位,读写数据的流。(方便用户操作文本的)

注意:

计算中所有的数据视频,音频,图片,文字…都是以字节的形式存储的

什么场景用什么流

用记事本打开看得懂的就可以用字符,看不懂的可以用字节(字节是万能流)

字节流:
  • InputStream:这个抽象类是表示字节输入流的所有类的超类
  • OutputStream:这个抽象类是表示字节输出流的所有类的超类
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

字节输出流:

FileOutputStream(String name):创建文件输出流以指定的名称写入文件

方法名 说明
void write(int b) 将指定的字节写入此文件输出流 一次写一个字节数据
void write(byte[] b) 将数组中的数据写入流中 一次写一个字节数组数据
void write(byte[] b, int off, int len) 将数组的一部分数据写入流中 int off: 从哪个索引开始 int len:写多少个
FileOutputStream​(File file, boolean append) 当append设置为true时,不会删除之前的文件,追加写数据

代码演示:

public class Demo01 {
    public static void main(String[] args) throws IOException {
        // 创建字节输出流:文件不存在就创建,文件存在就清空原文件,
        // 第二个参数是续写开关,默认为false不续写,为true就续写,续写不会删除原来的文件内容
        FileOutputStream fos = new FileOutputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt",true);

        // 一次写一个字节数组:写整数传到文件里的是码表对应值
        byte []  bytes = {97,98,99,100};
        fos.write(bytes);
        // 换行
        fos.write("\r\n".getBytes());

        // 从指定索引开始写数据(数据源,哪里开始,哪里结束)
        // getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
        fos.write(bytes,1,2);

        // 释放资源:告诉系统这个文件使用完毕

        fos.close();
    }
}

换行:

  • windows:\r\n
  • linux:\n
  • mac:\r

字节流写数据异常处理:
finallly:被finally控制的语句一定会执行,除非JVM退出

    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            System.out.println(2 / 0); // 制造异常
            fos = new FileOutputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt", true);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            fos.write(99);
        } catch (IOException e) {
            e.printStackTrace();
        } // 为了避免空指针异常在这里要加判断,不为空才走
        finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

字节输入流:

FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

方法名 说明
public int read​() 从输入流读取下一个字节数据, 返回读取到的字节
public int read(byte[] b) 从输入流读取最多b.length个字节的数据
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/file/a.txt");
        int len;
        // 不是-1就可以一直读,是-1说明没了
        while ((len = fis.read()) != -1) {
            System.out.println((char) len);
        }
        fis.close();
    }

复制文件:

public class Demo03 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入/输出流
        FileInputStream fis = new FileInputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt");
        FileOutputStream fos = new FileOutputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a2.txt");

        // 数组可以装多个字节,一次读一个数组比一次读一个字节快
        byte[] bytes = new byte[1024];
        // 循环读取,len表示现在读了多少字节
        int len;
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
        fis.close();
        fos.close();
    }
}

复制文件执行流程图
在这里插入图片描述

字节缓冲流:
  • 缓冲流只提供缓冲区,也就是数组,存在的使命就是提高效率,速度飞快。
  • 底层会创建一个默认8192的数组,主要是在硬盘和内存之间数据传递的次数,提高效率
  • 字节缓冲流要传入的参数是字节流,不能直接传入文件路径

在这里插入图片描述

构造方法:

方法名 说明
BufferedOutputStream(OutputStream out) 创建字节缓冲输出流对象
BufferedInputStream(InputStream in) 创建字节缓冲输入流对象

缓冲流复制文件:
用一次一个数组,不要玩一个字节,哪个牛逼用哪个

    public static void main(String[] args) throws IOException {
        // 创建字节缓冲输入流、缓冲流会在底层创建一个8192字节数组
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt"));
        // 创建字节缓冲输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a2.txt"));

        byte[] bytes = new byte[1024];
        int len;
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }
        bis.close();
        bos.close();
    }
字符流:

有了万能的字节流为啥还出现了字符流?

  • 因为字节流读写中文可能会出现乱码,原因是因为编码表
  • 把字符存计算机要转二进制,叫编码
  • 把计算机中的二进制数据解析出来,叫解码
  • 编码和解码的方式必须一致,否则就会乱码

为什么字节流读中文乱码:

  • 字节流一次都一个字节,但是中文在GBK和UTF-8中都大于一个字节,也就是读不完一个完整的文字
编码表:
  • ASCll编码只有一些基础的文字,码表查看:http://ascii.911cha.com/
  • Unicode编码表是统一的万国码,容纳世界上所有的常见文字和符号,经UTF-8编码后一个中文占3个字节存储
  • GBK是中国推出的码表,每个国家都有自己的码表,但是比较乱,就定义了一个规范就是Unicode
  • UTF-8不是码表是一个格式
  • win系统默认使用GBK,一个字符占2个字节,idea默认用UTF-8,一个字符占3个字节

字符串中的编码解码:

方法名 说明
byte[] getBytes() 使用平台的默认字符集将该 String编码为一系列字节
byte[] getBytes(String charsetName) 使用指定的字符集将该 String编码为一系列字节
String(byte[] bytes) 使用平台的默认字符集解码指定的字节数组来创建字符串
String(byte[] bytes, String charsetName) 通过指定的字符集解码指定的字节数组来创建字符串
public class Demo01 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //定义一个字符串
        String s = "放眼整个中国,谁特么有我帅";
        // 编码
        byte[] bys = s.getBytes("GBK");
        byte[] bys2 = s.getBytes("UTF-8");
        System.out.println(Arrays.toString(bys));
        System.out.println(Arrays.toString(bys2));

        // 解码
        byte [] byte1   = {-73, -59, -47, -37, -43, -5, -72, -10, -42, -48, -71, -6, -93, -84, -53, -83, -52, -40, -61, -76, -45, -48, -50, -46, -53, -89};
        byte [] byte2   = {-26, -108, -66, -25, -100, -68, -26, -107, -76, -28, -72, -86, -28, -72, -83, -27, -101, -67, -17, -68, -116, -24, -80, -127, -25, -119, -71, -28, -71, -120, -26, -100, -119, -26, -120, -111, -27, -72, -123};
        System.out.println(new String(byte1, "GBK"));
        System.out.println(new String(byte2, "UTF-8"));
    }
}
字符流读中文过程:
  • 不管在哪个码表中,中文的第一个字节一定是负数。
  • 用字符读的时候,当看到是负数就会看看是什么格式,UTF8就直接读三个,GBK就读2个
  • 字符流=字节流+编码表
字节流字符流怎么选:

要拷贝就用字节流&字节缓冲流
把文本数据读到内存用字符输入,内存写到文件用字符输出

字符流写数据:

构造方法

方法名 说明
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象

成员方法:

方法名 说明
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt");
        // void write(int c)	写一个字符
        fw.write(99);
        
        // void write(char[] cbuf)	写入一个字符数组
        // 写的是int整数打印出来就是对应的ASCll码表,String类型就是原样输出
        char[] chars = {97, 98, 99, 100};
        fw.write(chars);
        
        // void write(char[] cbuf, int off, int len)	写入字符数组的一部分
        fw.write(chars, 0, chars.length);
        
        // void write(String str)	写一个字符串
        String s = "彭于晏都不着急结婚我急个锤子";
        fw.write(s);
        
        // void write(String str, int off, int len)	写一个字符串的一部分
        fw.write(s, 0, 2);
        fw.close();
    }
刷新和关闭的方法:
方法名 说明
flush() 刷新流,之后还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
public class Demo03 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt");
        fw.write("活到老,学到老");
        fw.flush();
        fw.write("走我了吗flush");
        fw.close();
        // fw.write("走我了吗close");  当场异常
    }
}
字符流读取:

构造方法

方法名 说明
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader

成员方法

方法名 说明
int read() 一次读一个字符数据
int read(char[] cbuf) 一次读一个字符数组数据
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt");
       
        // int read():一次读一个字符数据
        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.print((char) ch);
        }

        //int read(char[] cbuf):一次读一个字符数组数据
        int len;
        // 字符流不能用byte,打印也和字节流有点差别
        char[] chars = new char[1024];
        while ((len = fr.read(chars)) != -1) {
            System.out.println(new String(chars, 0, len));
        }
        fr.close();
    }
字符缓冲流:

构造方法

方法名 说明
BufferedWriter(Writer out) 创建字符缓冲输出流对象,可以指定缓冲区大小,或者可以接受默认大小
BufferedReader(Reader in) 创建字符缓冲输入流对象,可以指定缓冲区大小,或者可以接受默认大小

字符缓冲流特有功能:

方法名 说明
void newLine() 写一行行分隔符,行分隔符字符串由系统属性定义
String readLine() 读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null
public class Demo07 {
    public static void main(String[] args) throws IOException, IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt"));
        bw.write("活到老");
        bw.newLine();
        bw.write("学到老");

        BufferedReader br = new BufferedReader(new FileReader("/Users/itzhuzhu/Desktop/Java/ideaTest/io/a.txt"));

        //一次读取一个字符数据
        /**
         int ch;
         while ((ch=br.read())!=-1) {
         System.out.print((char)ch);
         }
         */

        //一次读取一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len = br.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }

        String s;
        // 一次读一行,返回的null不是-1,所以这里的判断条件为null
        while ((s = br.readLine()) != null) {
            System.out.println(s);
        }
        br.close();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

彻底学会IO流 的相关文章

  • Java 基础进阶篇(十八):正则表达式匹配规则和应用

    文章目录 一 正则表达式概述 二 正则表达式的匹配规则 三 正则表达式在方法中的应用 3 1 校验手机号 邮箱和座机电话号码 3 2 字符串的内容替换和分割 四 编程题目 4 1 表示数值的字符串 4 2 非严格递增连续数字序列 一 正则表
  • Java中的抽象类和接口

    目录 一 什么是抽象类 抽象类在实现多态中的意义 二 接口是什么 通过接口实现多态 三 抽象类和接口的区别 各位铁汁们大家好呀 今天让我们继续学习java 看看java中的抽象类和接口到底是什么 一 什么是抽象类 我们之前学过什么是类 那么
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • jquery循环语句if-else if-else

    jquery循环语句if else if else callbackFun 函数 开始是写的if if else 结果是不管第一个if有没有匹配到 会再次判断 如果匹配到第二个if 则第二个if中的语句执行 没有匹配到第二个if 则else
  • 学编程太枯燥太难怎么办?

    大家好 我是老三 和大家分享一些我学编程的经历 那年二十 头发浓密如野狗 夏日炎炎 枯坐机房如木头 一根指头 颤颤巍巍如老叟 敲下了第一行 Hello World 开启了编程学习生涯 刚开始 参加的是学校的一个夏季编程训练营 起初是有学长学
  • JAVA接收JSON中的数组

    入参数据示例 respCode 0000 respMsg 请求成功 bizSeqNo 22022120001184432418054888526616 transTime 20220221180548 success true tokenA
  • Java String总结

    文章目录 创建String 字符串比较 字符串常量池 直接赋值 构造方法 理解字符串不可变 反射 特殊手段 char 和String StringBuffer和StringBuilder String API 创建String 常见的构造方
  • Java基础中的IO流

    一 IO流 IO 上传下载 写入写出 流 一连串流动的数据 以先入先出的方式进行流动 管道 以程序为中心 程序与网络 文件 服务器 数组 1 分类 1 按照流向 输入流 输出流 2 操作单元分 字节流 万能流 任何内容都可以转为字节 可以传
  • 面向对象编程(概念)

    面向对象编程 概念 面向过程 面向对象 面向过程思想 1 步骤清晰简单 第一步做什么 第二步做什么 2 面对过程是和处理一些较为简单的题目 面向对象思想 1 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单
  • 3.5安装ideay、快捷键

    注册账号 网址 https www jetbrains com 绑定激活码 网址 https www jetbrains com store redeem Alt Enter 快速补全 Ctrl shift O 清理导包 去除无用的包 Ct
  • Scanner中nextInt()和nextLine()详解(秒懂)

    直接上代码 输出结果 结果分析 nextInt 和nextLine 顺序互换代码如下 输出结果 结果分析 解决方法 可以将nextLine 用next 替换 两者nextLine 执行之前再加一个空nextLine 让这个空的清楚掉回车符再
  • JavaSE基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 基础 杂记 JRE JVM 常用类库 JDK JRE 诸多工具 如j
  • 包装类自动装箱和拆箱原理

    包装类的自动装箱和自动拆箱 包装类的自动装箱和拆箱是JDK1 5的新特性 一 首先 了解自动装箱的过程 有两种自动装箱过程 第一种 128 127 之内 调用相应包装类的valueOf 例如 Integer i 12 Integer a 2
  • Java中对象比较的三种方式

    一 针对对象值是否相等的比较 和 equals 的区别 当我们提到比较值的时候 大多数人都会想到 因为在一般情况下 人们对于比较的概念中 数字比较的应用场景出现频率是最多的 首先我们创建一个类 之后新建这个类的对象来进行比较验证 class
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • FileInputStream读取文件&FileOutputStream写入文件

    Java的流式输入输出建立在4个抽象类的基础上 InputStream OutputStream Reader和Writer 它们用来创建具体的流式子类 InputStream和OutputStream类被设计为字节类 而Reader和Wr
  • private static final Long serialVersionUID= 1L详解

    我们知道在对数据进行传输时 需要将其进行序列化 在Java中实现序列化的方式也很简单 可以直接通过实现Serializable接口 但是我们经常也会看到下面接这一行代码 private static final Long serialVer
  • Java之单元测试(JUnit单元测试框架)

    一 概述 单元测试就是针对最小的功能单元编写测试代码 Java程序最小的功能单元是方法 所以单元测试就是针对Java方法的测试 进而检查方法的正确性 常规测试有什么问题 只有一个main方法 如果一个方法的测试失败了 其他方法会受到影响 无
  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • Python写入csv乱码

    把encoding utf 8 改成 encoding utf 8 sig 代码 import os csv with open result file mode a encoding utf 8 sig newline as f writ

随机推荐

  • 如何在navicat for mysql画图(建模型)并直接生成

    1 登录进数据库后 点击模型 新建模型 如下 2 点击 小手 下面的图标 双击右边的空白处 即出现一个表格 可命名 此时我们命名为A 3 双击A表下空白处 即可设计A表属性 点确定 如下 4 同理 生成一个B表 加粗样式 5 如何让A B表
  • 特征归一化优点

    什么是特征归一化 数据的标准化 normalization 是将数据按比例缩放 使之落入一个小的特定区间 在某些比较和评价的指标处理中经常会用到 去除数据的单位限制 将其转化为无量纲的纯数值 便于不同单位或量级的指标能够进行比较和加权其中最
  • dsolve函数的功能_为什么Mathematica的DSolve函数会解不出显式解??

    In 6 DSolve v t 3 v t 2 v t 2 v t 2 2 v t v t v t t Out 6 v t gt E t Sqrt C 1 Tan E t Sqrt C 1 C 2 说明书里面是这么说的 DSolve inc
  • 43. 字符串相乘

    43 字符串相乘 注意 不能使用任何内置的 BigInteger 库或直接将输入转换为整数 示例 1 输入 num1 2 num2 3 输出 6 示例 2 输入 num1 123 num2 456 输出 56088 提示 1 lt num1
  • 判断Android主题是否为深色主题

    fun isDarkTheme context Context Boolean val flag context resources configuration uiMode and Configuration UI MODE NIGHT
  • java.lang.NoClassDefFoundError:com/google/common/base/Moreobjects

    项目所属环境不同 解决方案不一定适合所有人 见谅 java lang NoClassDefFoundError com google common base Moreobjects 编译可以通过 运行报错 很无奈 突然蹦出这鬼东西 经过一番
  • ESP32S2+ES8388移植过程及问题

    电路图如下 有点小瑕疵ES8388 VMID PIN10 19 20电容没有忘加 查资料应该不影响语言输出 可能噪音大 如果能导致不输出请告诉我一下 ESP32S2管脚映射 这里主要问题是我不确定MCLK 放到S2的PIN33是否合适 查资
  • C++ 类的静态成员和非静态成员

    类的静态成员不占据类对象的字节数 1 一个空类占用字节数为1 2 int整形变量占据的字节数为4 class Person int m A 非静态成员变量 属于类的对象上 static int m B 静态成员变量 不属于类的对象上 voi
  • JSP三大指令,六个动作,九个内置对象,四大作用域

    一 JSP三大指令 1 1 page指令 page指令 后面跟着三个属性 分别是language contentType pageEncoding 属性名 取值范围 描述 language Java 解释该JSP文件时采用的语言 一般为Ja
  • 少样本学习概述及三种经典方法

    从迁移学习讲起 Pre train Fine tune 不同领域数据规模不同 模型表现并不理想 但是 模型浅层可以学到通用特征 深层才学到更为复杂的分类特征 在大规模数据上训练的模型 其底层特征保持较高的通用性 迁移学习的下游任务仍然受限于
  • 计算机键盘正确指法操作方法,键盘指法,图文详解键盘指法练习方法

    随着时代的发展 现在越来越多的工作都是用电脑来完成的了 这就需要我们会打字了 很多朋友打字很慢是因为键盘指法不对 为了让您能更好的打字 今天小编就教您键盘指法练习方法 很多打字很快的朋友都是采用的盲打的方式 这就要求对键盘上的按键很熟悉 同
  • 二叉树之重建(js)

    二叉树之重建 输入一颗二叉树的先序遍历和中序遍历 输出它的后序遍历 输入 DBACEGF ABCDEFG BCAD CBAD 输出 ACBFGED CDAB var root value null left null right null
  • 【华为面试题】栈(二)

    题目 代码 function getMinElectricBoxes input str const n input str length const powerBoxPositions let lastPowerBoxUsed false
  • requests 实现模拟登录,获取cookie

    有个需求需要模拟登录csdn获取cookie 对csdn进行后续系列操作 刚开始使用的selenium 功能可以实现 但是效率有点低 后来改用的requests 遇到不少坑 今天来总结一下 首先找到csdn登录的url 在故意输错密码的情况
  • size函数 matlab 含义,size()函数的使用

    matlab中对于矩阵的计算是十分方便的 其中关于矩阵的函数有很多 size 在c c 中sizeof用来求某变量所占用的字节数 在matlab中size 则可以用来求矩阵的 长度 矩阵的长度有两方面 1 行数 2 列数 所以size 也有
  • [创业之路-73] :如何判断一个公司或团队是熵减:凝聚力强、上下一心,还是,熵增:一盘散沙、乌合之众?

    目录 前言 一盘散沙 乌合之众 凝聚力强 上下一心 一 股权结构与利益分配 一盘散沙 乌合之众 凝聚力强 上下一心 二 组织架构与岗位职责 一盘散沙 乌合之众 凝聚力强 上下一心 三 战略目标 一盘散沙 乌合之众 凝聚力强 上下一心 四 规
  • Cloudflare 重定向配置

    最近把之前的一个网站域名换成另一个域名 想要添加一下重定向 避免流量流失 虽然本来就没流量 然后在 Cloudflare 配置时尝试多次都失败了 遇到各种 Your connection is not private 或者 Webpage
  • 代码审查常见问题,建议收藏

    最近某宝弹窗事件导致其APP被大量用户删除 影响极其恶劣 我在想 如果他们的内部代码审查更加严格一点 少走形式 就能将隐患扼杀在摇篮里了 基于此 我们部门专门成立了由小组长和核心成员组成的代码评审组 将以前的代码评审模式进行了一些优化 加强
  • Win10 设备管理器一个USB设备描述符请求失败解决方法

    问题 进入设备管理器 发现 通用串行总线控制器 下有一项带有黄色 未知USB设备 设备描述符请求失败 或者 解决方法如下 1 点击Windows键 R或者 点击系统桌面左下角 开始 在开始菜单中点击 运行 在运行对话框中输入 service
  • 彻底学会IO流

    概述 IO流就是用来处理设备间数据传输问题的 常见的应用 文件复制 文件上传 文件下载 IO的数据传输 可以看做是一种数据的流动 按照流动的方向 已内存为参照物 进行读写操作 IO可以保存到文件 其实就是内存在读取 内存在写入 而且不会消失