IO流基础

  IO流,也称为数据流,用于处理设备之间的数据传输。
  JAVA对数据的操作就是通过流的方式,而流分为两种:字符流,字节流

字符流:

  可以内部制定码表,处理文字很方便,字符流里的基类是Reader,Writer
字节流:

  操作字节数据。和字符流差不多,基类是InputSteram,OutputStream,如果不使用缓冲区,不需要flush()方法,查看父类方法,使用子类建立对象。

  IO包中子类名称后缀就分明了字节流和字符流,前缀说明了功能,缓冲区的出现是为了提高流的效率,在创建缓冲区之前要先有流对象,只要用到缓冲区就要用到flush()刷新方法。关闭缓冲区就会关闭缓冲区中调用的流对象。

    bufferedWriter缓冲区提供跨平台换行符方法newLine();
    bufferedReader缓冲区提供一次读取一个文本行的方法readLine();不包含终止符,读到文件末尾返回null,加强了原有功能,如果想提高效率就使用缓冲区,Bufferedxxx。
装饰设计模式:
  当想要对已有的对象进行功能增强时,定义一个类将已有对象传入,基于已有功能,提供加强功能,那么这个自定义的类就称为装饰类,装饰模式比继承要灵活,避免继承体系臃肿,降低类与类的关系,装饰类和被装饰类通常是一个体系的。

  因为增强已有对象,具备的功能和已有的是相同的,只不过是加强功能,通常通过构造方法(接收被装饰的对象),基于传入对象的功能提供更强的功能方法。

流操作的基本规律:
  最痛苦的就是流对象有很多,不知道该用哪一个。

  通过三个明确来完成

    1,明确源和目的。
      源:输入流。InputStream Reader。
      目的:输出流。OutputStream Writer。
    2,操作的数据是否是纯文本。
      是:字符流。
      不是:字节流。

    3,当体系明确后,在明确要使用哪个具体的对象。
      通过设备来进行区分:
      源设备:内存,硬盘,键盘。
      目的设备:内存,硬盘,控制台。

  流操作的只有数据,而数据最明显的体现形式就是文件,而文件包含很多信息,属性,想操作文件的话,java就把文件封装成了对象File类,方便对文件或者文件夹的属性进行操作。

  properties是Hashtable的子类,具备Map集合的特点,存储的键值对都是字符串,是集合中和IO技术结合的容器,用于键值对形式的配置文件。

  字节流的两个顶层父类:

    1.InputStream   2.outputStream

  字符流的两个顶层父类:

    1.Reader    2.Writer

  这些体系的子类都是已父类名做为后缀,而前缀是该对象的功能。

  字符流:

  简单例子:将一个字符串写入到文件中

 1   //创建一个可以往文件中写入字符数据的字符流输出对象
 2   FileWriter fe = null;
 3     try {
 4         //在创键对象时必须要明确该文件的存储目的地
 5         //如果目的地存在该文件,则会被覆盖
 6         //如果构照文件中加入true,则可以对文件进行续写
 7         fe=new FileWriter("F:/1.txt",true);
 8         //调用write写入数据
 9             fe.write("asjhgfajkshgfaksjdfg");
10         } catch (IOException e) {
11             e.printStackTrace();
12         }finally{
13             try {//关闭流,关闭资源,在关闭前会调用flush();刷新缓冲区
14               fe.close();
15             } catch (IOException e) {
16               e.printStackTrace();
17             }
18     }
19     //将硬盘中的文件读取然后输入到控制台中:
20     //1.创建读取流对象
21     FileReader fr=null;
22     try{
23         //2.在读取的时候一定要 被明确被读取的文件,确保这个文件存在,不然会发生异常
24         fr=new FileReader("f:/1.txt");
25         int aa=0;
26         while((aa=fr.read())!=-1){
27         System.out.println((char)aa);
28         }
29   . . .  ..  . . .
30   //用数组读取文件:
31   //1.创建读取流对象
32     FileReader fr=null;
33     try{
34         //2.在读取的时候一定要 被明确被读取的文件,确保这个文件存在,不然会发生异常
35         fr=new FileReader("f:/1.txt");
36         char [] ch=new char[1024];
37         int leng=0;
38         while((leng=fr.read(ch))!=-1){
39         System.out.println(new String(ch,0,leng));
40      }    

  如果字符串中需要换行,可以在字符串中加入常量:(根据系统资源获取对应的换行符)
  private static final String LINE_SEPARATOR =System.getProperty("line.separator");
  IO异常:在用读写流对象调用colse()的时候一定要加判断判断对象不等于null否则会抛空指针异常

  字符流缓冲区对象:BuffredReader , BuffredWriter
  在字符流缓冲区中:
    newLine():写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 (‘\n‘) 符。
    Newline():只有BuffredWriter对象具备。
    readLine():读取一个文本行,一次读取一行数据,遇到换行符就终止,返回读取到的字符串,如果读取到流的末尾就返回null。
    readKine():方法只有BuffredReader具备。

  使用方法:

  1 public static void main(String[] args) throws IOException {
  2        //字符流关联文件
  3         FileReader fr=new FileReader("f:/1.txt");
  4         FileWriter fw=new FileWriter("f:/2.txt");
  5         BufferedReader br=new BufferedReader(fr);
  6         BufferedWriter bw=new BufferedWriter(fw);
  7         char [] ch=new char[1024];
  8         int leng=0;
  9         //使用缓冲区读取数据,从缓冲区中读取数据
 10         while((leng=br.read(ch))!=-1)
 11         {
 12             //使用缓冲区写入数据到内存中
 13             bw.write(ch, 0, leng);
 14         }
 15         //关闭缓冲区,实际上就是关闭了流对象
 16         br.close();
 17         bw.close();
 18     }
 19 自定义缓冲区:
 20 public class MybufferReader {
 21    private Reader r;
 22    //定义一个数组作为缓冲区
 23    private char [] ch=new char[1024];
 24    //定义一个指针用于操作数组中的元素,当操作到最后一个元素时指针归零
 25    private int pos=0;
 26    //定义一个计数器,用于记住缓冲区的数据个数,当缓冲区中数据减到零,就从源中继续获取数据到缓冲区中
 27    private int count=0;
 28    public MybufferReader(Reader r) {
 29          this.r=r;
 30    }
 31     /*
 32      该方法一次从缓冲区中取一个字符
 33   */
 34     public int myReader() throws IOException
 35     {
 36         //从源中获取一批数据到缓冲区中,只有count为0时。
 37         if(count==0)
 38         {
 39             count=r.read(ch);
 40             pos=0;
 41         }
 42         //当源中的数据取完时候返回负一
 43         if(count<0)
 44              return -1;
 45
 46           char ch1=ch[pos];//读取缓冲区中数据
 47           pos++;//数组的指针+1
 48           count--;//缓冲区中数据的个数-1
 49           return ch1;
 50
 51     }
 52     public String myReaderLine() throws IOException
 53     {
 54         StringBuilder sb=new StringBuilder();
 55         int ch=0;
 56         while((ch=myReader())!=-1)
 57         {
 58             if(ch==‘\r‘)
 59                 continue;
 60             if(ch==‘\n‘)
 61                 return sb.toString();
 62             //将从缓冲区中读到的字符存储到转存行数据的缓冲区中
 63             sb.append((char)ch);
 64         }
 65         if(sb.length()!=0)
 66             return sb.toString();
 67         return null;
 68     }
 69     public void mycolse() throws IOException
 70     {
 71         r.close();
 72     }
 73
 74 }
 75 装饰设计模式:
 76    对一组对象的功能进行增强的时候,就可以使用该模式来解决问题。
 77 例如:public class PersonDemo {
 78     public static void main(String[] args) {
 79         Person p=new Person();
 80         p.chifan();
 81         newperson p1=new newperson(p);
 82         p1.chifan();
 83         newperson2 p2=new newperson2();
 84         p2.chifan();
 85     }
 86 }
 87 class Person
 88 {
 89     public void chifan()
 90     {
 91         System.out.println("吃饭");
 92     }
 93 }
 94 //这个类的出现是为了增强Person的功能出现的
 95 class newperson
 96 {
 97     private Person p;
 98     //构造方法中传入Person对象
 99     public newperson(Person p) {
100     this.p=p;
101     }
102     //增强chifan方法
103     public void chifan()
104     {
105         System.out.println("喝酒");
106         p.chifan();
107         System.out.println("吃甜点");
108     }
109 }
110 //这个类继承于Person
111 class newperson2 extends Person
112 {
113     public void chifan()
114     {
115         System.out.println("喝酒");
116         super.chifan();
117         System.out.println("吃甜点");
118     }
119 }
120 装饰设计模式和继承都能实现这一特点,特点:只为提高功能,进行的继承导致继承体系越来越臃肿,不够灵活,而装饰比继承灵活。
121 BufferedReader的子类LineNumberReader的基本使用。
122 例子: public static void main(String[] args) throws IOException {
123    FileReader fr=new FileReader("ArrayListTest.java");
124    LineNumberReader lin=new LineNumberReader(fr);
125    String str=null;
126    //一次读取一行
127    while((str=lin.readLine())!=null)
128    {//输出行号和行内容
129        System.out.println(lin.getLineNumber()+":"+str);
130    }
131 }
时间: 2024-11-18 13:13:29

IO流基础的相关文章

java的io流基础篇乱码的原因

1.编码的产生:我们的存储的基本单元是一个byte字节,然而人类的语言太多,无法用一个基本单元来表示,然而为了拆分或者一些相应的翻译工作,导致了编码的产生 2.常见的编码格式 ASCll :用一个字节的低7位共128个来表示,0-31表示控制字符,32-126表示打印字符, ASCll的二进制第一位也就是最高位,目的是用来做奇偶检验的,所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种.奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高

Java IO流基础总结

前言 好久不用Java的IO流,把好多的基础知识都忘了,昨天在写一段代码,发现好多细节都忘了.那天在组织组内代码评审的时候,发现有人在乱用IO流相关的类,所以还是写篇文章,把这个知识点总结一下. IO流类图结构 对于Java这种庞大的体系,我们要学某一块知识点,只有从整体上把握,整体上形成一个知识架构,这样才能更好的把握学习内容和学习方向.所以呢,和别的博文一样,上来就先来一张别的博客贴来的类结构图. 大家先不要被这张图中那么多的类所迷惑了:其实,从这张图来看,结构还是非常清晰的,也是非常简单的

乐字节Java之file、IO流基础知识和操作步骤

嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外!在Java中,可以用 File类来表示一个与硬盘上文件联系!!!注意: 1.File仅代表一个联系,可能文件存在,也可能不存在: 2.这里的文件可以是文件,也可以是文件夹: 在常用类中已经详细讲过File,此处不在讲解 二. IO流 1.流概念 流即流动.流向,从一端流向另一端.如水流:从山里流向到

Java之IO流基础流对象

输入流和输出流是相对于内存设备而言 即将外设中的数据读取到内存中就是输入 将内存中的数据写入到外设中就是输出 字符流的由来: 其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字. 再对这个文字进行操作,其实就是字节流+编码表 字节流的两个顶层父类: 1,InputStream  2,OutputStream 字符流的两个顶层父类: 1,Reader   2,Writer 这些体系的子类都以父类名作为后缀. 而子类名的前缀就是该对象的功能. 如果要操作文字数据,建议

IO流基础加强

字节流对象:InputStream,OutputStream 缓冲字节流对象:BufferedInputStream , BufferedOutputStream 用法和字符流对象一样,但也有区别, 输出流用法: 1.创建字节输出流对象,用于操作文件 FileOutputStream fps = new FileOutputStream("1.txt"); fin.available();//读取出要读的文件的大小 2.写数据,直接写入到目的地中 fps.write("ash

IO流基础——笔记

流可以理解为管道,数据通过流实现传递. 根据操作的类型可以分为输入流和输出流,I/O(Input,Output). 按照输出的方式可以分为字节流和字符流. 字节流:一次传输一个字节,适合于图片,音乐,视频的传输,防止失真.传汉字会乱码,汉字为字符. InputStream类是字节流的抽象类,是所有字节输出流的父类,因为抽象类不能被new ,所以只能使用他的子类,常用的子类有: 字节流: BufferedInputStream     缓冲输入流BufferedOutputStream   缓冲输

Java中的IO流之输入流|乐字节

亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入流 字节流和字符流的操作方式几乎完全一样,只是操作的数据单元不同而已 .字节流可 以操作所有文件,字符流仅操作纯文本. 1.抽象类:InputStream 和 Reader InputStream和Reader是所有输入流的基类,它们是两个抽象类,是所有输入流的模版,其中定义的方法在所有输入流中都可

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

关于Java中面向对象章节、IO 流中的重点基础知识。

一.面向对象的三大特征,以及作用. 答:面向对象的三大特征即,封装性.继承性.多态性. 其分别的作用为 : 封装作用:将数据封装起来,提高数据的安全性, 继承作用:提高代码的复用性,减少冗余代码. 多态性:应用程序不必对每个派生类进行方法调用,只需要对抽象基类处理即可,大大提高程序的复用性,可以提高可扩充性和可维护性. 二.多态中的向上转型 的作用以及向下转型使用的原因 答:在多态中向上转型的是作用是,父类的引用对象名指向子类的实体,也就是用一个抽象的基类去调用每一个派生子类,向下转型的原因为,