java基础学习22(字节流与字符流)

IO的分类

IO流分类:
如果是按照数据的流向划分:输入流与输出流。
如果按照处理的单位划分:字节流与字符流。

字节流:读取得都是文件中二进制数据,读取到二进制数据不会经过任何的处理。

字符流: 字符流读取的数据是以字符为单位的 。 字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能 识别的字符。 字符流 = 字节流 + 解码

字节流

输入字节流:
--------| InputStream 所有输入字节流的基类 抽象类
------------| FileInputStream 读取文件数据的输入字节流
------------| BufferedInputStream 缓冲输入字节流 缓冲输入字节流的出现主要是为了提高读取文件数据的效率。 其实该类内部只不过是维护了一个8kb的字节数组而已。

输出字节流:
--------| OutputStream 是所有输出字节流 的父类。 抽象类
-----------| FileOutStream 向文件输出数据的输出字节流。
-----------| Bufferedoutputstream 缓冲输出字节流 BufferedOutputStream出现的目的是为了提高写数据的效率。 内部也是维护了一个8kb的字节数组而已。

FileOutputStream要注意的细节:

  • 使用FileOutputStream 的时候,如果目标文件不存在,那么会自动创建目标文件对象,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。
  • 使用FileOutputStream写数据的时候, 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。
  • 使用FileOutputStream的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃。

BufferedOutputStream 要注意的细节:

  • 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中。
  • 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中,如果需要把数据真正的写到硬盘上面,需要调用flush方法或者是close方法、 或者是内部维护的字节数组已经填满数据的时候。
public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.readFile();
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.readFile();
    }

    public void readFile(){
        FileInputStream input = null;
        FileOutputStream out = null;

        try {
            input = new FileInputStream("/Users/alex/Downloads/img/img.png");
            out = new FileOutputStream("/Users/alex/Downloads/img/img_copy.png");
            byte[] buf = new byte[1024*8];
            int length = 0;
            while ( (length = input.read(buf)) != -1 ){
                out.write(buf,0,length);
            }
        } catch (IOException e) {
            System.out.println("拷贝图片出错...");
            throw new RuntimeException(e);
        }finally {
            //原则: 先开后关,后开先关。
            try {
                if (out != null){
                    out.close();
                }
            } catch (IOException e) {
               throw new RuntimeException(e);
            }finally {
                try {
                    if (input != null){
                        input.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
    
}    
    
public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.readFile();
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.readFile();
    }

    public void readFile2(){
        FileInputStream input = null;
        FileOutputStream out = null;
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
            input = new FileInputStream("/Users/alex/Downloads/img/img.png");
            out = new FileOutputStream("/Users/alex/Downloads/img/img_copy.png");

            bufferedInputStream = new BufferedInputStream(input);
            bufferedOutputStream = new BufferedOutputStream(out);

            int length = 0;
            byte[] buf = new byte[1024];
            while ( (length = bufferedInputStream.read(buf)) != -1 ){
                bufferedOutputStream.write(buf,0,length);
            }

            bufferedOutputStream.flush();
        } catch (IOException e) {
            System.out.println("拷贝图片出错...");
            throw new RuntimeException(e);
        }finally {
            //原则: 先开后关,后开先关。
            try {
                if (bufferedOutputStream != null){
                    bufferedOutputStream.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }finally {
                try {
                    if (bufferedInputStream != null){
                        bufferedInputStream.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}    

字符流

输入字符流:
----------| Reader 输入字符流的基类(抽象类)
-------------| FileReader 读取文件的输入字符流。
-------------| BufferedReader 缓冲输入字符流缓冲输入字符流出现的目的是为了提高读取文件 的效率和拓展了FileReader的功能。其实该类内部也是维护了一个字符数组。

输出字符流:
-----| Writer 输出字符流的基类(抽象类)
-----------| FileWriter 向文件数据数据的输出字符流。
-----------| BufferedWriter 缓冲输出字符流缓冲输出字符流作用,提高FileWriter的写数据效率与拓展FileWriter的功能。BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。

FileWriter要注意的事项:

  • 使用FileWriter写数据的时候,FileWriter内部是维护了一个1024个字符数组的,写数据的时候会先写入到它内部维护的字符数组中,如果需要把数据真正写到硬盘上,需要调用flush或者是close方法或者是填满了内部的字符数组。
  • 使用FileWriter的时候,如果目标文件不存在,那么会自动创建目标文件。
  • 使用FileWriter的时候, 如果目标文件已经存在了,那么默认情况会先情况文件中的数据,然后再写入数据 , 如果需要在原来的基础上追加数据,需要使用“new FileWriter(File , boolean)”的构造方法,第二参数为true。
public class Demo2 {

	public static void main(String[] args) throws IOException {
		readTest2();
	}
	
	//使用缓冲字符数组读取文件。
	public static void readTest2() throws IOException{
		//找到目标文件
		File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
		// 建立数据的输入通道
		FileReader fileReader = new FileReader(file);
		//建立缓冲字符数组读取文件数据
		char[] buf = new char[1024];
		int length = 0 ; 
		while((length = fileReader.read(buf))!=-1){
			System.out.print(new String(buf,0,length));
		}
	}
	
	
	
	
	public static void readTest1() throws IOException{
		//找到目标文件
		File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
		//建立数据的输入通道
		FileReader fileReader = new FileReader(file);
		int content = 0 ;
		while((content = fileReader.read())!=-1){ //每次只会读取一个字符,效率低。
			System.out.print((char)content);
		}
		//关闭资源
		fileReader.close();
	}
	
}

public class Test {
    public static void main(String[] args) throws IOException {
        //找到目标文件
        File file = new File("/Users/alex/Downloads/img/test.txt");
        //建立数据输出通道
        FileWriter fileWriter = new FileWriter(file,true);
        //准备数据,把数据写出
        String data = "今天天气非常好!!";
        fileWriter.write(data);  //字符流具备解码的功能。
        //刷新字符流
		fileWriter.flush();
        //关闭资源
        fileWriter.close();
    }
}    
public class Test {
    public static void main(String[] args) throws IOException {
   
    }
    public void copyByChar(){
        FileWriter fileWriter = null;
        FileReader fileReader = null;

        try {
            fileReader = new FileReader("/Users/alex/Downloads/img/a.txt");
            fileWriter = new FileWriter("/Users/alex/Downloads/img/a_copy.txt");

            int length = 0;
            char[] chars = new char[1024];
            while ( (length = fileReader.read(chars)) != -1 ){
                fileWriter.write(chars,0,length);
                fileWriter.flush();
            }
        }catch (IOException e){
            throw new RuntimeException(e);
        }finally {
            try {
                if (fileReader != null){
                    fileReader.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }finally {
                try {
                    if (fileWriter != null){
                        fileWriter.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }


    public void copyByBuffered(){

        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;

        try {
                bufferedReader = new BufferedReader(new FileReader("/Users/alex/Downloads/img/a.txt"));
                bufferedWriter = new BufferedWriter(new FileWriter("/Users/alex/Downloads/img/a_copy.txt"));
                String line=null;
                while((line = bufferedReader.readLine())!=null){
                    bufferedWriter.write(line);
                    bufferedWriter.newLine();
                }
                bufferedWriter.close();
                bufferedReader.close();
        }catch (IOException e){
            throw new RuntimeException(e);
        }finally {
            try {
                if (bufferedReader != null){
                    bufferedReader.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }finally {
                try {
                    if (bufferedWriter != null){
                        bufferedWriter.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

装饰者设计模式

装饰者设计模式:增强一个类的功能,而且还可以让这些装饰类互相装饰。

BufferedReader是不是拓展了FileReader的功能。
BuferedWriter 也是拓展了FileWriter的功能。

需求1: 编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有行号。

需求2:编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有分号。

需求3: 编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有双引号。

需求4: 编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有行号+ 分号。

需求5: 编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有分号+ 双引号。

需求6: 编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有双引号+ 行号。

需求7: 编写一个类拓展BufferedReader的功能, 增强readLine方法返回 的字符串带有行号+ 分号+双引号。

class BufferedLineNum extends BufferedReader{
    //行号
    int count = 1 ;

    public BufferedLineNum(Reader in) {
        super(in);
    }

    @Override
    public String readLine() throws IOException {
        String line = super.readLine();
        if(line ==null){
            return null;
        }
        line = count+" "+ line;
        count++;
        return line;
    }
}


//带分号的缓冲输入字符流
class BufferedSemi extends BufferedReader{

    public BufferedSemi(Reader in) {
        super(in);
    }

    @Override
    public String readLine() throws IOException {
        String line =  super.readLine();
        if(line==null){
            return null;
        }
        line = line+";";
        return line;
    }
}


//带双引号的缓冲输入字符流
class  BufferedQuto extends BufferedReader{

    public BufferedQuto(Reader in) {
        super(in);
    }

    @Override
    public String readLine() throws IOException {
        String line = super.readLine();
        if(line==null){
            return null;
        }
        line = "\""+line+"\"";
        return line;
    }
}





class Demo1 {

    public static void main(String[] args) throws IOException {
        File file = new File("/Users/alex/Downloads/img/a.txt");
        //建立数据的输入通道
        FileReader fileReader = new FileReader(file);
        //建立带行号的缓冲输入字符流
        BufferedLineNum bufferedLineNum = new BufferedLineNum(fileReader);

        //带有分号的缓冲输入字符流
        BufferedSemi bufferedSemi = new BufferedSemi(fileReader);

        //带有双引号的缓冲输入字符流
        BufferedQuto bufferedQuto = new BufferedQuto(fileReader);


        String line = null;
        while((line = bufferedQuto.readLine())!=null){
            System.out.println(line);
        }

    }

}

练习:
一家三口每个人都会工作,儿子的工作就是画画,母亲的工作就是在儿子的基础上做一个增强,不单止可以画画,还可以上涂料。爸爸的工作就是在妈妈基础上做了增强,就是上画框。

public class Test {
    public static void main(String[] args) throws IOException {
        Person p = new Person();
        S s = new S(p);
        M m = new M(s);
        F f = new F(m);
        f.work();
    }
}    
class Person{
    Person(){

    }

    void work() {
        System.out.println("工作。。。。");
    }
}

class S extends Person{
    Person p;
    public S(Person p) {
        this.p = p;
    }

    @Override
    void work() {
        this.p.work();
        System.out.println("画画");
    }
}

class M extends Person{
    Person p;
    public M(Person p) {
        this.p = p;
    }

    @Override
    void work() {
        this.p.work();
        System.out.println("上颜色");
    }
}


class F extends Person{
    Person p;
    public F(Person p) {
        this.p = p;
    }

    @Override
    void work() {
        this.p.work();
        System.out.println("做相框");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值