黑马程序员——Java基础——IO流

第一讲  IO概述

1概述:IO流:输入(Input与Output流)

2特点:

  a、IO流用于数据传输;  b、按操作分为字节流与字符流  c、按流向分:输入流和输出流

3、常用IO流的基类

1)字节流的基类:InputStream和OutpuStream

2)字符流的基类:Reader和Writer

第二讲  字符流

一、简述

  1、字符流的对象融合了编码表。使用的是默认的编码

  2、字符流只能用于文字处理,而字节流可以处理其他:

  3、下列把FileWriter和FileReader一起讲

1 package System;

 2 /*
 3  * 将文件做复制
 4  */
 5 import java.io.*;
 6 public class CopyTest {
 7     public static void main(String[] args){
 8         int s1=(int) System.currentTimeMillis();
 9         copy_1();
10         int s2=(int) System.currentTimeMillis();
11         copy_2();
12         int s3=(int) System.currentTimeMillis();
13         System.out.println(s2-s1+"毫秒");//顺便计算下时间
14         System.out.println(s3-s2+"毫秒");    //顺便计算下时间
15     }
16
17     private static void copy_1() {
18         FileWriter fw=null;
19         FileReader fr=null;
20         try {
21             fw=new FileWriter("xxx_1.txt");//创建输入的文件xxx_1
22             fr=new FileReader("TestDemo.java"); //创建要输出的流
23             for(int ch=0;(ch=fr.read())!=-1;){//一个字节一个自己读并输出
24                 fw.write((char)ch);
25             }
26         } catch (IOException e) {
27             throw new RuntimeException("毒性");
28         }finally{
29             if(fr!=null)
30                 try {
31                     fr.close();
32                 } catch (Exception e2) {
33                     // TODO: handle exception
34                 }
35             if(fw!=null)
36                 try {
37                     fw.close();
38                 } catch (Exception e2) {
39                     // TODO: handle exception
40                 }
41         }
42
43     }
44
45     private static void copy_2() {
46         FileWriter fw=null;
47         FileReader fr=null;
48         try {
49             fw=new FileWriter("xxx_2.txt");
50             fr=new FileReader("TestDemo.java");
51             char[] buff=new char[1024];//第二种方法是字符数组的形式读取并输出,一般创建1024整数倍的数组
52             for(int len=0;(len=fr.read(buff))!=-1;){//fr.read(buff)指定是中buff的长度
53                 fw.write(new String(buff,0,len));//记住这里新创了个String把读出来的buff从0到len
54             }
55         } catch (IOException e) {
56             throw new RuntimeException("毒性");
57         }finally{
58             if(fr!=null)
59                 try {
60                     fr.close();
61                 } catch (Exception e2) {
62                     // TODO: handle exception
63                 }
64             if(fw!=null)
65                 try {
66                     fw.close();
67                 } catch (Exception e2) {
68                     // TODO: handle exception
69                 }
70
71         }
72     }
73

字符缓冲流:

1、缓冲流的出现为了提高读写效率,所以在缓冲区创建钱就先创建对象。

使用复制一个java文件说明使用方法:

import java.io.*;
//使用缓冲流的方法复制文件来学习使用的格式
public class BuferedTest {
    public static void main(String[] args){
        BufferedWriter bufw=null;
        BufferedReader bufr=null;
        try {
            bufw=new BufferedWriter(new FileWriter("xx.txt"));//无法添加ture
            bufr=new BufferedReader(new FileReader("TestDemo.java"));
            String line=null;
            while(!((line=bufr.readLine())==null)){
                bufw.write(line);
                bufw.newLine();//记得换行
                bufw.flush();
            }

        } catch (IOException e) {
            throw new RuntimeException("书写错误");
        }finally{
            try {
                if(bufr!=null)
                    bufr.close();
            } catch (IOException e) {
                throw new RuntimeException("读取错误");
            }
            try {
                if(bufw!=null)
                    bufw.close();
            } catch (IOException e) {
                throw new RuntimeException("读取错误");
            }
        }
    }
}

3、自定义BufferedReader

原理:

  可根据BufferedReader类中特有一行一行读取原理,分析思路如下

思路:

  1:它的构造函数中参数是FileReader,所以一创建就有FileReader;

  2、在执行ReadLine时,先需要一个容器(StringBuilder)容纳一行的数据,和int容纳一个字节数据

    然后只在出现、n是返回

  3、最后关闭的是close()的动作就是关闭里面的FileReader;

装饰设计模式:

简述:

当想要对已有的对象进行功能增强时,可以定义类,将有已有对象作为构造函数的参数传入,基于已有对象的功能进行加强,那么自定义的该类称之装饰类

我们上面的MyBufferedReader就装饰设计模式的好例子。

为什么使用装饰而不是继承来增加功能?

  a、装饰模式避免了继承体现的臃肿

  b、装饰类因为是增强已有对象,所以必然需要与已有对象相同的功能,所以装饰类和被装饰类是同一个体现

  c、增加者与被增强者的继承结构转为组合结构

 1 /*
 2  自定义BufferedReader
 3 原理:
 4   可根据BufferedReader类中特有一行一行读取原理,分析思路如下
 5 思路:
 6   1:它的构造函数中参数是FileReader,所以一创建就有FileReader;
 7
 8   2、在执行ReadLine时,先需要一个容器(StringBuilder)容纳一行的数据,和int容纳一个字节数据
 9
10     然后只在出现、n是返回
11   3、最后关闭的是close()的动作就是关闭里面的FileReader;
12  */
13 import java.io.*;
14
15 import javax.management.RuntimeErrorException;
16 class MyBufferedReader extends Reader{
17     private Reader fr;//等于一创建就有这个fr的FileReader
18     MyBufferedReader(Reader fr){//从FileReader(子类)变Reader(父类),多态增加使用范围
19         this.fr=fr;
20     }
21
22 //    一下是自定义的读取一行的方法myReadLine
23     public String myReadLine() throws IOException{
24 //        一个容器StringBuilder和字节容器int
25         StringBuilder sb=new StringBuilder();
26         int ch=0;
27         while((ch=fr.read())!=-1){//返回负一时就跳出循环
28             if(ch==‘\r‘)//如果换行符,则继续
29                 continue;
30             if(ch==‘\n‘)//如果回车符
31                 return sb.toString();
32             else
33                 sb.append((char)ch);
34         }
35         if(sb.length()!=0)
36             return sb.toString();
37         return null;
38     }
39 //    父类中的close也是抽象方法
40     public void close()throws IOException{//实际上就是关闭FileReader
41         fr.close();
42     }
43
44 //    复写父类Reader中的抽象方法
45     public int read(char[] cbuf, int off, int len) throws IOException {
46         return fr.read(cbuf,off,len);
47     }
48 }
49 public class MyBufferedReaderDemo {
50     public static void main(String[] args){
51         //使用方法和原方法一样
52         MyBufferedReader mbr=null;
53         try {
54             mbr=new MyBufferedReader(new FileReader("TestDemo.java"));
55             String line=null;
56             while((line=mbr.myReadLine())!=null){//一行的数据已经给了line
57                 System.out.println(line);
58             }
59         } catch (IOException e) {
60             throw new RuntimeException("数据读取失败");
61         }
62         finally{
63             try {
64                 if(mbr!=null)
65                     mbr.close();
66             } catch (IOException e2) {
67                 throw new RuntimeException("关闭流失败");
68             }
69         }
70
71     }
72 }

练习:带行数的缓冲流,LineNumber的运用

 1 import java.io.*;
 2
 3 import javax.management.RuntimeErrorException;
 4 public class LinewNumberReaderDemo {
 5     public static void main(String[] args) {
 6         FileReader fr=null;
 7         LineNumberReader lnr=null;//可以带行数的缓冲流
 8         try {
 9             fr=new FileReader("TestDemo.java");
10             lnr=new LineNumberReader(fr);
11
12             String line=null;
13             lnr.setLineNumber(50);//设置从50开始数
14
15             while((line=lnr.readLine())!=null){
16                 System.out.println(lnr.getLineNumber()+":"+line);//getLineNumber就是
17                 //得到行数
18             }
19         } catch (IOException e) {
20             throw new RuntimeException("数据输入有误");
21         }
22         finally{
23             try {
24                 if(lnr!=null)
25                     lnr.close();
26             } catch (Exception e2) {
27             }
28         }
29     }
30 }
时间: 2024-10-27 01:37:16

黑马程序员——Java基础——IO流的相关文章

黑马程序员——Java基础--IO流(一)---字符流和字节流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.IO流的介绍及体系 IO流用来处理设备之间的数据传输.java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中. 输入流和输出流相对于内存设备而言:将外设中的数据读取到内存中:输入.将内存中的数据写出到外设中:输出. 流按照操作数据分为两种:字节流和字符流. 字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字进行操作

黑马程序员——Java基础--IO流(一)---File类以及其他流对象

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.File类 File类是将文件系统中的文件和文件夹封装成了对象.提供了更多的属性和行为可以对这些文件和文件夹进行操作.这些是流对象办不到的,因为流只操作数据.File对象可以作为参数传递给流对象的构造函数.File 类的实例是不可变的:也就是说,一旦创建,File 对象表示的抽象路径名将永不改变. 1.File类中的方法 (1).File类的构造方法以及字段 1 new File(Stri

黑马程序员——java基础IO流——字符流缓冲区和字节流

字符流的缓冲区 l  缓冲区的出现提高了对数据的读写效率. l  对应类 ?    BufferedWriter ?    BufferedReader l  缓冲区要结合流才可以使用. l  在流的基础上对流的功能进行了增强. 1, BufferedWriter 每次可以写入一行,缓冲区的出现是为了提高流的操作效率而出现的.所以在创建缓冲区之前,必须要先有流对象.该缓冲区中提供了一个跨平台的换行符,newLine(); /* 缓冲区的出现是为了提高流的操作效率而出现的. 所以在创建缓冲区之前,

黑马程序员——Java基础——IO流(二)——File类、Properties类、打印流、序列流

第一件 File类 一.File类 a.用于将文件或者文件夹封装成对象 b.方便对文件与文件夹的属性信息进行操作 c.File对象可以作为参数传递给流的构造函数 d.了解File类中的常用方法 二.File对象的创建 a.File f=new File("a:\\a.txt"): b.File f2=new File("C:\\abc","a.txt");//分开的好处是后一个参数能够使用其他对象如string c.File d=new File

黑马程序员——Java基础——IO流(三)—序列流、管道流、RandomAccessFile类、操作基本数据类型的流对象、操作数组和字符串、字符编码

第一讲 对象序列化(持久化) 一.概述:就是把对象封存在硬盘,可以保持数据:关键类:ObjectInputStream和ObjectOutpurStream 二. 关键字:ObjectOutputStream:方法有writerObject()读取 ObjectInputStream 方法有readObject() 被序列化的对象需要 implements Serializable关于被序列化的类需要实现Serializable它等于一个撮,标识用的,改变类里面的语句就变了.如果想固定一个撮,可

黑马程序员——Java基础——IO流(三)—对象的序列化(持久化),管道流,操作基本数据类型的流对象

第一讲 对象序列化(持久化) 概述: 将堆内存中的对象存入硬盘,以包括对象的数据,称为持久化或序列化 使用的类:ObjectInputStream和ObjectOutputStream 特有方法: ObjectInputStream Object readObject():读取 ObjectOutputStream void writeObject(obj):写入 1 /* 2 * 需求:将一个对象序列化,并从硬盘中读取序列化的对象 3 * 4 */ 5 import java.io.*; 6

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java基础---io(上)

黑马程序员——Java基础---io(上) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象.如果数据流中最小的数据单元是字节,那么称这种流为字节流:如果数据流