java基础—-IO流

1 ascii码

    Gb2312 是中文的
    GBK 有2万多是gb2312的升级
    UTF-8  无论什么字符都用两个字节搞定 全世界范围的     

* java中 提供了之间转读取写入的编码方式
* 通用字节流,字符流基于字节流

2 字符流

  • 学习一个类先看底层的方法
  • Writer 子类OutputStreamWriter,后缀名是父类的名称,前缀是它的操作

     FileWriter fw= new Fi;eWriter(path);
     fw.write("abcdde");
     fw.flush();
     //写入后一定要刷新一下,还可以再写再刷
     fw.close();
     //关闭资源,关闭之前会刷新一下flush(),不能再写了
    

3 缓冲区

  • 缓冲区的出现是为了提高流的操作效率而出现的
  • 所以在创建缓冲区之前,必须要有流对象
  • 写入数据

    FileWriter fw= new FileWriter("buf.txt");
    BufferedWriter bw= new BufferedWriter(fw);
    bw.newLine();
    bw.write("hello world!");
    //只要有缓冲区都要记得刷新
    bw.flush();
    bw.close();
    //bw关闭了也就相当于fw关闭了 
    
  • 读取数据

    FileReader fw= new FileReader("buf.txt");
    BufferedReader br= new BufferedReader(fw);
    String s1=fr.readLine();
    //读取一行
    System.out.println("s1:"+s1);
    

    readLine() 一行一行的读,返回值有的话返回字符串,当读到文件末尾返回null,当是空字符串的时候 ,返回空字符串但不是null;
    readLine()f方法。看似读一行,实际上读的是一个一个地读。
    abcdefghijklmn\r\n 一个一个读的时候,先一个一个读把每一个放入缓冲区中,然后等到读到\r\n后再把这一行缓冲的数据读出,他就是把数据临时存起来,它是基于read方法

4 装饰设计模式

  • 当象想要对已有的对象功能增强时,可以先定义类,基于已有的类的方法

    1. 建一个类Person,实现一个方法chifan()
    2. 新建一个类SuperPerson ,定义构造函数

        private Person p;
        SuperPerosn(Person p)
         {
            this.p=p;
         }
      
    3. 然后就可以新建一个功能扩展的函数
  • 装饰和继承

5 LineNumberReader

   LineNumberReader lr= new LineNumberReader(new FileReader(file))
   lr.getLineNumber()得到从零开始的行号
   lr.setLineNumber(100);得到从100开始的行号
   String str=lr.ReadLine();
   //一定程序上和BufferedReader的功能相似

6 用字节流输入文件

 FileOutputStream fos=new FileOutputStream("fos.txt");
 fos.writre("abcdefg".getBytes());
 fos.close();

7 用字节流写入文件

  • 第一种读出的是字节

     FileInputStream fis=new FileInputStream("fos.txt");
     int ch=0;
      while((ch=fis.read())!=-1)
     {
         System.out.println((char)ch);
     }
     fos.close();
    
  • 第二种读出后写入数组

     FileInputStream fis=new FileInputStream("fos.txt");
     int len=0;
     //fis.available()返回的是文件内的字节个数,写入如下的缓冲数组中能定义一个准确大小的数组,数据太大的话会产生溢出
     byte[] bytes=new byte[1024];
      while((len=fis.read(bytes))!=-1)
     {
         System.out.println(new String(bytes,0,len));
     }
     fos.close(); 
    

8 用字节流复制图片

  • 字节流布恩那个复制图片,因为字符流会在编码表中着编码

     fis= new FileInputStream("D:\\1.bmp");
     fos=new FileOutputStream("D:\\2.bmp");
     byte[] buff= new byte[1024];
     int len=0;
     while((len=fis.read(buff))!=-1)
     {
         fos.write(buff,0,len);
     }
     fos.close()
    

9 字节流实现复制mp3

  BufferedInputStream bufis= new BufferedInputStream(new  FileInputStream("mp3文件"));
   BufferedOutputStream bufis= new BufferedOutputStream(new FileOutputStream("copymp3文件"));
   int by=0;
   while((by=bufis.read())!=-1)
   {
        bufos.write(by);
   }
   bufis.close();
   bufos.close();

10 获取键盘录入

这里输入的只能辨别单个字节

   InprutStream in= System.in;
   //只读的是单个字节
   int by= in.read();
    //字符转换为int型
    '\r'+0   or   (int)'\r'

* str.toUpperase() 变成大写的
* StringBuilder是一个可变字符串

    InputStream in=System.in;
    StringBuilder sb= new StringBuilder();
    while(true)
    {
         int ins=in.read();     
         if(ins=='\r'){
             continue;
         }
         if(ins=='\n'){          
             String sb1= sb.toString();             
             if(sb1.equals("over"))
                  break;
             //转换大小写
              System.out.println(sb1.toUpperCase());
              sb.delete(0,sb.length());//删除StringBuffer的缓存
         }
         else
            sb.append((char)ins);
    }

11 InputStrenReader 字节流转换为字符流,他本身是一个字符流

  //获取键盘输入对象
  InputStream in= System.in;
  //字节流转换为字符流
  InputStreamReader isr= new InputStreamReader(in);
  //提高效率,使用缓冲区技术,使用BufferReader
  bufferReader bufr= new BufferedReader(isr);
  //下面一句的功能顶以上三句,要记住,以后就是键盘录入的典型写法
  Bufferedreader bufr= new BufferedReader(new InputStreamReader(System.in);

   String line=null;
    while((line=bufr.readLine())!=null)
  {
           if(line.wquals("over")
                 break;
             System.out.println(line.toUpperCase());
    }

12 System.out

  • System.out是一个InputStream的子类对象,所以他是一个字节流,把他转换为字符流的语句如下

     BufferedWriter bufw= new BuffererWriter(new OutputStreamWriter(System.out);     
     bufw.write(String);
     这里写入的是字符流
     这个写入之后还要刷新才能显示
     bufw.flush();
    

13 直接通过键盘录入的字符写入文件

 Bufferedreader bufr= new BufferedReader(new InputStreamReader(System.in);
  BufferedWriter bufw= new BuffererWriter(new OutputStreamWriter(new FileOutputStream("out.txt"));    
   String line=null;
    while((line=bufr.readLine())!=null)
  {
           if(line.wquals("over")
                 break;
             bufw.write(line.toUpperCase());
            bufw.flush();
    }
    bufw.close();

14 这么多流到底怎么用?

  • 明确源和目的:

      源:输入流。InputStream  Reader.
      目的:输出流   OutputStream  Writer.
    
  • 操作的数据是否是纯文本

       是纯文本:字符流
       不是纯文本:字节流
    
  • 当以上理解后,要明确使用那个具体的对象。

     - 通过设备来区分
     - 源设备:内存,硬盘,键盘
     - 目的设备: 内存,硬盘,控制台。
    
  • 当操作的对象是纯文本的时候,并且是硬盘上的文件

      - FileReader fr=new FileReader("a.txt");
      - 提高效率 加上BufferedReader bufr= new BufferedReader(fr);
      - FileWriter fw= new FileWriter("b.txt");
      - 提高效率 加上BufferedWriter bufw=new new BufferedWriter(fw); 
    
  • 当操作的对象是图片的时候,并且是硬盘上的文件

      - FileInputStream fis=new FileInputStream("a.bmp");
      - 提高效率 加上BufferedInputStream bufr= new BufferedInputStream(fis);
      - FileOutputStream fos= new FileOutputStream("b.bmp");
      - 提高效率 加上BufferedOutputStream bufw=new new BufferedOutputStream(fos); 
    
  • 当操作有键盘输入呢?

      - InputStreamReader isr= new InputStreamReader(System.in);
      - 提高效率  bufferReader bufr= new BufferedReader(isr);
      1. 写入文本
      - 可以用FileWriter fw= new FileWriter("c.txt")
      - 提高效率 BufferWriter bw= new BufferWriter(fw);
      - 写入文本如果需要定义编码表,则需如下的方式转换流
      - BufferedWriter bufw= new BuffererWriter(new OutputStreamWriter(new FileOutputStream("out.txt"),"utf-8");
      - 转换流转换不仅是字节和字符还有编码方式
    

15 修改默认的输入输出流

  • System.setIn(。。。) 设置键盘录入默认的
  • System.setOut(…) 设置默认输出
  • 不懂可以查文档
  • e.printStackTrace(new printStream(“a.log”);把异常信息放到文件中去
  • log4j 网络上的专门的日志信息的包
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值