IO流1

在这里插入图片描述
FileWriter

/**
*输入流和输出流是相对于内存设备而言
* 
* 字符流的由来:
* 字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。
* 再对这个文字进行操作,简单说:字节流+编码表
* --------------------------------------
* 字节流的两个顶层父类:
* 1.InputStream   2.OutputStream
* 这些体系的子类都以父类名作为后缀。
* 而且子类名的前缀就是该对象的功能。
* 
* 字符流的两个顶层父类:
* 1.Reader   2.Writer
*/
//需求:将一些文字存储到硬盘
//记住:
public static void demo_1() throws IOException{
   //创建一个可以往文件中写入字符数据的字符输出流对象
   /**
    * 既然是往一个文件中写入文字数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地)
    * 如果文件不存在,则会自动创建。
    * 如果文件存在,则会被覆盖。
    * 
    * 如果构造函数中加入true,可以实现对文件进行续写
    */
   FileWriter fw = new FileWriter("E:/1.txt",true);
   /**
    * 调用Writer对象中的write(String)方法,写入数据
    * 其实数据写入到临时存储缓冲区中
    */
   String LINE_SEPARATOR = System.getProperty("line.separator");
   fw.write("hello"+LINE_SEPARATOR+"world");
   /**
    * 进行刷新,将目标写入到目的地中
    */
   // fw.flush();
   /**
    * 关闭流,关闭资源  在关闭前会调用flush刷新缓存中的数据到目的地
    */
   fw.close();
}

FileWriter–IO异常处理

//IO异常处理
public static void demo_2() throws IOException{
    FileWriter fw = null;
    try{
        fw = new FileWriter("K:/1.txt",true);
        String LINE_SEPARATOR = System.getProperty("line.separator");
        fw.write("hello"+LINE_SEPARATOR+"world");  
    }
    catch(IOException e){
        System.out.println(e.toString()+"error");
    }
    finally{
        if(fw!=null)
            try{
                fw.close();
            }catch(IOException e){
                throw new RuntimeException("关闭失败");
            }
    }
}

读取方式一

//需求:读取一个文本文件,将读取到的字符打印到控制台
//同上,找到FileReader
public static void demo_3() throws IOException{
    //1.创建读取字符流对象
    /**
     * 在创建读取流对象时,必须要明确被读取的文件。一定要确定该文件是存在的
     * 用一个读取流关联一个已存在的文件。
     */
    FileReader fr = new FileReader("E:/1.txt");
    //用Reader中的read方法读取字符
    int ch = 0;
    while((ch=fr.read())!=-1){
        System.out.println((char)ch);
    }
    fr.close();
}

读取方式二

public static void demo_4() throws IOException{
FileReader fr = new FileReader("E:/1.txt");
/**
 * 使用read(char[])读取文本文件数据
 */
char[] buf = new char[3];
// int num = fr.read(buf);//将读到的char字符存储到数组中
// System.out.println(num+":"+new String(buf));
// fr.close();
int len = 0;
while((len=fr.read(buf))!=-1){
    System.out.println(new String(buf,0,len));
}
fr.close();
}

将盘一个文件复制到d盘中

//作用:将盘一个文件复制到d盘中
public static void demo_1() throws IOException{
    //1.读取一个已有的文本文件,使用字符读取流和文件相关联
    FileReader fr = new FileReader("E:/1.txt");
    //2.创建一个目的,用于存储读到数据。
    FileWriter fw = new FileWriter("E:/2.txt");
    //3.频繁的读写操作。
    int ch = 0;
    while((ch=fr.read())!=-1){
        fw.write((char)ch);
    }
    //4.关闭流资源。
    fw.close();
    fr.close();
}

复制文本文件

//复制文本文件
public static void demo_2(){
    FileReader fr = null;
    FileWriter fw = null;
    try{
        fr = new FileReader("E:/1.txt");
        fw = new FileWriter("E:/3.txt");
        //创建一个临时容器,用于缓存读取到的字符。
        char[] buf = new char[1024];
        //定义一个变量记录读取到的字符数,其实就是往数组里装的字符个数
        int len = 0;
        while((len=fr.read(buf))!=-1){
            fw.write(buf,0,len);
        }
    }
    catch(Exception e){
        System.out.println("读写失败");
    }
    finally{
        //关闭流
        if(fr!=null){
            try{
                fr.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
        if(fw!=null){
            try{
                fw.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

字符流缓冲区BufferedWriter

//字符流缓冲区BufferedWriter
    //      bufw.newLine();
public static void demo_3() throws IOException{
    //缓冲区的出现提高了对数据的读写效率
    //对应类
    //BufferedWriter :将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。
    //可指定缓冲区的大小,也可默认
    //BufferedReader :从字符输入流中读取文本,缓冲各个字符,从而实现字符,数组和行(文本特有的单位)的高效读取
    //缓冲区要结合流才能使用
    FileWriter fw = new FileWriter("F:/buf.txt");
    //为了提高写入效率,使用了字符流缓冲区。
    //创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
    BufferedWriter bufw = new BufferedWriter(fw);
    //使用缓冲区的写入方法将数据先写入到缓冲区中。
    bufw.write("hello buff");
    bufw.newLine();//bufw.write(System.lineSeparator());
    bufw.write("xixixi");
    ///fw.write("hello demo");
    for(int i=0;i<=4;i++){
        bufw.write("abcde"+i);
        bufw.newLine();
        bufw.flush();
    }
    //使用缓冲区的刷新方法将数据刷到目的地中
    // bufw.flush();
    //关闭缓冲区
    ///fw.close();
    bufw.close();//这时fw流也被关闭了
}

字符流缓冲区BufferedReader

//字符流缓冲区BufferedReader
    //      bufr.readLine();使用了读取缓冲区的read()方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。
public static void demo_4() throws IOException,FileNotFoundException{
    FileReader fr = new FileReader("F:/buf.txt");
    BufferedReader bufr = new BufferedReader(fr);
    String line = null;
    while((line=bufr.readLine())!=null){
        System.out.println(line);
    }
    // char[] buf = new char[1024];
    // int len = 0;
    // while((len=fr.read(buf))!=-1){
    //     System.out.println(new String(buf,0,len));
    // }
    fr.close();
    bufr.close();
}

字符流-缓冲区-复制文本文件

//字符流-缓冲区-复制文本文件
public static void demo_5() throws IOException{
    FileReader fr = new FileReader("F:/buf.txt");
    BufferedReader bufr = new BufferedReader(fr);
    FileWriter fw = new FileWriter("F:/buf_copy.txt");
    BufferedWriter bufw = new BufferedWriter(fw);
    /*
    int ch = 0;
    while((ch=bufr.read())!=-1){
        bufw.write(ch);
    }
    */
    String line = null;
    while((line=bufr.readLine())!=null){
        bufw.write(line);//line不带换行符
        bufw.newLine();
        bufw.flush();
    }
    bufw.close();
    bufr.close();
}

根据readLine()原理模拟readLine()方法

//根据readLine()原理模拟readLine()方法
    //自定义读取缓冲区
    /*
    分析:
    缓冲区中无非就是封装一个数组。
    并对外提供了更多的方法对数组进行访问。
    其实这些方法最终操作的都是数组的指针

    缓冲的原理:从源中获取一批数据装入缓冲区中,再从缓冲区中不断取出一个一个数据,
    当此次取完后,再从源中继续取一批数据进入缓冲区。
    当源中的数据被取光时,用-1进行标记。
    */
class myBufferReader{
    private FileReader r;
    //定义一个数组作为缓冲区
    private char[] buf = new char[1024];
    //定义一个指针操作数组中的元素.当操作到最后一个元素后,指针应该归零。
    private int pos = 0;
    //定义一个计数器,用于记录缓冲区中的数据个数,当该数据减到零,就从源中继续获取数据到缓冲区中。
    private int count = 0;
    myBufferReader(FileReader r){
        this.r = r;
    }
    //该方法一次从缓冲区中获取一个字符
    public int myRead() throws IOException{
        /*
        1.从源中获取一批数据到缓冲区中.需要先做判断,计数器是不是为0
         */
        if(count==0){
            count = r.read(buf);
            //每次获取数据到缓冲区后,角标归0
            pos = 0;
        }
        if(count<0){
            return -1;
        }
        char ch = buf[pos];
        pos++;
        count--;
        return ch;
    }
    public String myReadLine() throws IOException{
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch = myRead())!=-1){
            if(ch=='\r')
                continue;
            //将从缓冲区读到的字符存储到缓存行数据的缓冲区中
            else if(ch=='\n')
                return sb.toString();
            sb.append((char)ch);
        }
        return null;
    }
    public void myclose() throws IOException{
        r.close();
    }
}

试用myBufferReader

//试用myBufferReader
public static void demo_6() throws IOException{
   FileReader fr = new FileReader("F:/buf.txt");
   myBufferReader bufr = new myBufferReader(fr);
   String line = null;
   while((line=bufr.myReadLine())!=null){
       System.out.println(line);
   }
   // char[] buf = new char[1024];
   // int len = 0;
   // while((len=fr.read(buf))!=-1){
   //     System.out.println(new String(buf,0,len));
   // }
   //fr.close();
   bufr.myclose();
}

字符流-缓冲区-装饰设计模式
什么是装饰

//类
class Person{
    Person(){}
    public void eat(){
        System.out.println("eat!");
    }
}
//这个类的出现是为了增强Person
class newPerson{
    private Person p;
    newPerson(Person p){
        this.p = p;
    }
    public void eat(){
        System.out.println("dessert");
        System.out.println("eat!");
    }
}
//字符流-缓冲区-装饰设计模式
/**
 * 对一组对象功能进行增强时,就可以使用该模式进行问题的解决。
 */
/*
装饰和继承都能实现一样的特点:进行功能的扩展增强。
区别:
    首先有一个继承体系。
    Writer
        |--TextWriter:用于操作文本
        |--MediaWriter:用于操作媒体
    想要对操作动作进行效率上的提高。
    按照面向对象,可以通过继承对具体的进行功能的扩展。
    效率提高需要加入缓冲技术。
    Writer
        |--TextWriter:用于操作文本
            |--BufferTextWriter:加入了缓冲技术的操作文本对象
        |--MediaWriter:用于操作媒体
            |--BufferMediaWriter:
    这样就加入了缓冲技术,但是这样做并不理想。
    如果这个体系进行功能扩展,又多了流对象,这个流要提高效率也要产生子类,
    子类为提高功能进行的继承导致继承体系越来越臃肿,不够灵活。
    重新思考这个问题,
    既然加入都是同一种技术--缓冲,
    前一种是让缓冲和具体的技术相结合。
    可不可以让缓冲进行单独的封装,哪个对象需要缓冲就将哪个对象和缓冲相关联。
    class Buffer{
    Buffer(TextWriter w){}
    Buffer(MediaWriter w){}
    }
    class BufferWriter extends Writer{
    BufferWriter(Writer w){}
    }
    体系变为这样:
    Writer
        |--TextWriter:用于操作文本
        |--MediaWriter:用于操作媒体
        |--BufferWriter:用于提高效率
    所以,装饰比继承灵活
    特点:装饰类和被装饰类都必须所属同一个接口或者父类。
*/
public static void demo_7(){
  	 Person p = new Person();
     p.eat();
     newPerson p1 = new newPerson(p);
     p1.eat();
 }

字符流-缓冲区-LineNumberReader

//字符流-缓冲区-LineNumberReader
public static void LineNumberReaderDemo() throws IOException{
    FileReader fr = new FileReader("F:/buf.txt");
    LineNumberReader lnr = new LineNumberReader(fr);
    String line = null;
    while((line=lnr.readLine())!=null){
        System.out.println(lnr.getLineNumber()+"::"+line);
    }
}

字节流-操作文件基本演示

//字节流-操作文件基本演示
public static void demo_write() throws IOException{
    //1.创建字节输出流对象。用于操作文件
    FileOutputStream fos = new FileOutputStream("F:/buf.txt");
    //2.写数据
    fos.write("hello".getBytes());
    fos.close();//关闭资源动作要完成
}
public static void demo_read() throws IOException{
    //创建一个读取流对象。和指定文件相关联
    FileInputStream fis = new FileInputStream("F:/buf.txt");
    System.out.println(fis.available());
    byte[] buf = new byte[fis.available()];
    fis.read(buf);
    System.out.println(new String(buf));//这个慎用
    //读数据建议使用这一种
    /*
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=fis.read(buf))!=-1){
        System.out.println(new String(buf,0,len));
    }
    */
    /*
    int ch;//一次读取一个字节
    while((ch = fis.read())!=-1){
        System.out.print((char)ch);
    }
    */
}

字节流复制MP3

//字节流复制MP3
public static void demo_mp3() throws IOException{
    FileInputStream fis = new FileInputStream("F:/mp.avi");
    FileOutputStream fos = new FileOutputStream("F:/mp_copy.avi");
    /*
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=fis.read(buf))!=-1){
        fos.write(buf,0,len);
    }
    */
    //千万别用下面这一种,效率太慢
    /*
    int ch;
    while((ch=fis.read())!=-1){
        fos.write(ch);
    }
    */
    fos.close();
    fis.close();
}
public static void demo_mp3_2() throws IOException{
    FileInputStream fis = new FileInputStream("F:/mp.avi");
    BufferedInputStream bufis = new BufferedInputStream(fis);
    FileOutputStream fos = new FileOutputStream("F:/mp_copy.avi");
    BufferedOutputStream bufos = new BufferedOutputStream(fos);
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=bufis.read(buf))!=-1){
        bufos.write(buf,0,len);
        bufos.flush();
    }
    bufos.close();
    bufis.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值