韩顺平 Java IO流 自学笔记

发布于:2022-12-21 ⋅ 阅读:(260) ⋅ 点赞:(0)

目录

一.文件基础知识

1.文件基础知识铺垫

2.创建文件的三种方式

3.获取文件信息

 4.目录操作

二.IO流原理及流的分类

1.IO流的原理

 2.流的分类

三.InputStream字节输入流

1.InputStream的简介

 2.FileInputStream类方法

四.OutputSteam字节输出流

1.OutputSteam类的简介

2..FileOutPutStream类

五.writer字符输出流

1.writer简介

2. FileWriter类

六.reader字符输入流

1.reader类的简介

 2.FileReader类

七.节点流和处理流 

1.相关概念

2.处理流的设计模式

3.处理流BufferReader和BufferWriter

4.对象处理流ObjectOutputStream和ObjectInputStream 序列化与反序列化

5.标准输入与输出流System.in 和System.out

 6.转换流InputStreamReader和OutputStreamWriter

7.打印流PrintStream和PrintWriter

七.配置文件Properties

1.引出配置文件 

2.基本的使用​编辑

八.家庭作业

1.家庭作业一

2.家庭作业二

3.家庭作业三


一.文件基础知识

前情提要:Io最主要的是区分不同流的作用和使用规范

1.文件基础知识铺垫

1.1什么是文件

文件就是保存数据的地方,图片,音乐,视频等等。 

1.2文件流的概念 

 

 输入与输出是针对内存的,磁盘内容输入到java程序当中,Java程序处理的结果输出到磁盘当中。

类比:

IO流的整个类图

2.创建文件的三种方式

案例 

 代码

package com.file;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;

public class FileCrate {
    public static void main(String[] args) {

    }
    @Test
    public void create01(){
//        指定文件的路径
        String filePath = "d:\\one.txt";
//      还没有进行创建,相当于对文件进行声明
        File file = new File(filePath);
//        进行创建
        try {
            file.createNewFile();
            System.out.println("文件创建成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
//     方法二,通过父文件和子路径来进行创建  参数为File,String  File有三种创建对象的构造器
    public void create02(){
        File parentFile = new File("d:\\");

        String path = "next.txt";
//      在java程序(内存)当中创建的对象,使用方法,将内存当中的对象,输出到硬盘上
        File file = new File(parentFile, path);
//      创建文件
        try {
            file.createNewFile();
            System.out.println("文件创建成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//    public File(String parent, String child) 第三种方法
    @Test
    public void create03(){
        String parent = "d:\\";

        String path = "next01.txt";
//      在java程序(内存)当中创建的对象,使用方法,将内存当中的对象,输出到硬盘上
        File file = new File(parent, path);
//      创建文件
        try {
            file.createNewFile();
            System.out.println("文件创建成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果

 指定路径下就会出现我们想要的文件了

3.获取文件信息

常用的方法

 案例演示

代码

package com.file;

import java.io.File;
import java.io.IOException;

public class FileInformation {
    public static void main(String[] args) {
//        先创建文件
        File file = new File("d:\\no1.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
//        调用相应的方法得到相应的信息
        System.out.println("文件的名字  "+file.getName());
        System.out.println("文件的父级目录  "+file.getParent());
        System.out.println("文件的绝对路径  "+file.getPath());
        System.out.println("文件的大小(字节)  "+file.length());
        System.out.println("文件是否存在  "+file.exists());
        System.out.println("是不是一个文件  "+file.isFile());
        System.out.println("是不是一个目录  "+file.isDirectory());
    }
}

 运行结果

文件的名字  no1.txt
文件的父级目录  d:\
文件的绝对路径  d:\no1.txt
文件的大小(字节)  6

 4.目录操作

用到的方法

 代码

package com.file;

import org.junit.jupiter.api.Test;

import java.io.File;

public class Directory_ {
    public static void main(String[] args) {

    }
//    判断m1是否存在,存在就删除
    @Test
    public void m1(){
        String filePath = "d:\\no1.txt";

        File file = new File(filePath);

        if (file.exists()){
            if (file.delete()){
                System.out.println(filePath+"文件删除成功");
            }else {
                System.out.println(filePath+"文件删除失败");
            }
        }else {
            System.out.println("该文件不存在");
        }
    }

//    判断demo01.txt是否存在,不存在打印不存在  在java当中,目录也被当成一种文件
@Test
public void m2(){
    String filePath = "d:\\demo01";

    File file = new File(filePath);

    if (file.exists()){
        if (file.delete()){
            System.out.println(filePath+"文件删除成功");
        }else {
            System.out.println(filePath+"文件删除失败");
        }
    }else {
        System.out.println("该文件不存在");
    }
}
//  判断文件夹有没有,没有就创建文件夹
@Test
public void m3(){
    String filePath = "d:\\demo01";

    File file = new File(filePath);

    if (file.exists()){
            System.out.println(filePath+"文件存在");
    }else {
//        创建一个目录
        if (file.mkdirs()){
            System.out.println(filePath+"文件夹创建成功。");
        }else{
            System.out.println(filePath+"文件夹创建失败。");
        }
    }
}
}

m3运行结果

  

二.IO流原理及流的分类

1.IO流的原理

 2.流的分类

三.InputStream字节输入流

1.InputStream的简介

类图结构

 2.FileInputStream类方法

代码

package com.inputstream;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStream_ {
    public static void main(String[] args) {

    }
//    单个读取的效率太低,使用public int read(byte b[])方法。
        @Test
    public void readFile01() throws IOException {
        String filePath = "d:\\hello.txt";
        int read =0 ;
//        创建输入流
        FileInputStream fileInputStream = null;

        try {
            fileInputStream = new FileInputStream(filePath);
//            对数据进行循环的读取,当返回值为-1时,表示读取完毕

            while ((read = fileInputStream.read())!=-1){
                System.out.print((char)read);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
//            关闭流,进行资源的释放
            fileInputStream.close();
        }
    }
    @Test
    public void readFile02() throws IOException {
        String filePath = "d:\\hello.txt";
        int readLen =0 ;
//        创建字节数组,一次读取八个字节
        byte[] bytes = new byte[8];
//        创建输入流
        FileInputStream fileInputStream = null;

        try {
            fileInputStream = new FileInputStream(filePath);

//          方法进行优化
            while ((readLen = fileInputStream.read(bytes))!=-1){
//            讲字节转化为字符串进行输出
                System.out.print(new String(bytes,0,readLen));
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
//            关闭流,进行资源的释放
            fileInputStream.close();
        }
    }
}

Test2对读取的方式进行了优化

四.OutputSteam字节输出流

1.OutputSteam类的简介

类图

2..FileOutPutStream类

常用的方法

应用实例1

在代码指定的位置创建文件

 代码

package com.outputstream;

import org.junit.jupiter.api.Test;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStream01 {
    public static void main(String[] args) {

    }

    /*
    * 使用FileOutputStream将文件写入内存当中*/
    @Test
    public void writeFile()  {
        String filePath = "d:\\a.txt";
//        创建文件输出流对象
        FileOutputStream fileOutputStream = null;

        try {
//            new FileOutputStream(filePath)写入内容时会覆盖原来的内容
//            new FileOutputStream(filePath,true)进行追加而不是覆盖
            fileOutputStream = new FileOutputStream(filePath,true);
//            write方法的三种使用
            //        1.输出数据  单个字符数据
            fileOutputStream.write('H');
//            2.写入字符串数据
            String str = "hello.word!";
//            将String变成byte数组的形式在传入   使用string自带的方法
            fileOutputStream.write(str.getBytes());
//            3.写入一段字符串  public void write(byte b[], int off, int len)  off为开始截取的位置,len为截取的长度
            fileOutputStream.write(str.getBytes(),0,3);

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

 运行结果:指定文件当中的文本内容被修改

 注意:new  FileOutputStream(filePath,true)这样创建的流,在下次运行的时候不会清空文件当中的文本,而是进行末尾的追加。

应用实例2拷贝文件

要求

大体的思路

代码

package com.outputstream;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) {

    }
    @Test
    public void FileCopy(){
//        字节数组  一个一个字节数组读取
        byte[] bytes = new byte[8];
//        读取文件的路径
        String filePath = "d:\\1.jpg";
//        输出文件的路径
        String aimPath = "src\\1.jpg";
        FileOutputStream fileOutputStream = null;
        FileInputStream fileInputStream = null;


        try {
//        1.输入到内存当中
//
            fileInputStream = new FileInputStream(filePath);

//        输出到硬盘当中
            fileOutputStream =new FileOutputStream(aimPath);


//            定义一个数组提高读取的效率
            byte[] bytes1 = new byte[1024];
            int readLen =0;
            while ((readLen = fileInputStream.read(bytes1))!=-1){
//                一遍读一边写
                fileOutputStream.write(bytes1,0,readLen);//一定要使用这个方法,不然:最后面数据达不到1024个字节,就是出现文件损失
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
//                关闭输入流和输出流
                if (fileOutputStream!=null){
                    fileOutputStream.close();
                }
                if (fileOutputStream!=null){
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

运行前:

运行后:

 提示:转移到c盘,需要管理员的权限,会出现警告。

java.io.FileNotFoundException: c:\1.jpg (拒绝访问。)

五.writer字符输出流

1.writer简介

类图

2. FileWriter类

继承关系

 常用方法

 

案例练习

代码

package com.writer_;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriter_ {
    public static void main(String[] args) {
        String path = "src\\node.txt";
//        创建文件
//        File file = new File(path);
//        try {
//            file.createNewFile();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        char[] chars = {'a','b','c'};

        FileWriter fileWriter = null;

        try {
            fileWriter = new FileWriter(path);
//            写入单个字符
            fileWriter.write('A');
//            写入字符数组
            fileWriter.write(chars);
//            写入字符数组指定的部分
            fileWriter.write("你好,世界!".toCharArray(),0,3);
//            写入整个字符串 较为常用
            fileWriter.write("我爱你中国。");
            fileWriter.write("风雨之后,定见彩虹!!");
//            写入字符串的指定部分 较为常用
            fileWriter.write("最终的胜利一定属于英勇的人民!!",0,5);
//            在数据量大的情况下可以使用循环操作

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
//            只有关闭流之后才可以将文件真正的写入
            if (fileWriter!=null){
                try {
//                    关闭文件流等价于flush+关闭
                    fileWriter.close();
//                    close源码,到底是什么原理

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果 

  

补充:为什么close之后写入数据才算完成数据的传输

在close方法的最后,调用FileOutputStream,才将数据写入 ,字符流的底层是字节流

六.reader字符输入流

1.reader类的简介

类图

 2.FileReader类

相关方法

 课堂练习

代码

package com.reader_;

import org.junit.jupiter.api.Test;

import java.io.FileReader;
import java.io.IOException;

public class FileReader_ {
    public static void main(String[] args) {

    }
//    对单个字符读取文件  基本不用
    @Test
    public void FileReader01(){
        String path = "d:\\story.txt";
        FileReader fileReader = null;
        int data = 0;
//        创建
        try {
            fileReader = new FileReader(path);
//
            while ((data = fileReader.read())!=-1){
                System.out.print((char)data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (fileReader!=null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //    指定字符长度的读取文件
    @Test
    public void FileReader02(){
        String path = "d:\\story.txt";
        FileReader fileReader = null;
        int readLen = 0;
        char[] chars = new char[8];
//        创建
        try {
            fileReader = new FileReader(path);
//          字符流所以使用的char数组
            while ((readLen = fileReader.read(chars))!=-1){
                System.out.print(new String(chars,0,readLen));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (fileReader!=null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

两个方法的运行结果都一样

   21世纪历史爱好者林枫,熬夜刷历史小说突然猝死,然后穿越到东汉末年,成为了玉门关守将。
   作为一个穿越者,林枫正在想自己未来出路在何方的时候,拥有各种功能的逆天系统出现了。
   人口功能:可以兑换无数人口、..

七.节点流和处理流 

1.相关概念

涉及到的类

 节点流使用场景

 注意:节点流是比较底层的数据流没有进行过多的封装,功能性并不是很强大,如图:操作文件与操作数组需要使用两种不同的类。

writer的类图

多样的类,使得BufferWriter拥有了更多的功能,更加灵活的使用方法。

处理流的功能相对更强大一些

注意:BufferReader当中有一个Reader属性,BufferReader可以拥有Reader所有子类的功能,例如FileReader,BufferWriter一样可以实现Writer所有子类的功能。 

节点流和处理流的区别

2.处理流的设计模式

代码举例

抽象类

package com.reader_;

public abstract class Reader_ {
    public void readString(){}
    public void readFile(){}
//     也可以使用read方法进行统一的管理,通过传入的子类对象不同,调用不同的子类实现方法
}

根据功能划分的抽象类的子类

FileReader_类

package com.reader_;

public class FileReader_ extends Reader_{
    public void readFile(){
        System.out.println("读取文件......");
    }
}

StringReader_类

package com.reader_;

public class StringReader_ extends Reader_{
    public void readString(){
        System.out.println("读取字符串。。。。");
    }
}

使用子类来处理数据的包装类

package com.reader_;

public class BufferReader_ extends Reader_{
    private Reader_ reader_;

    public Reader_ getReader_() {
        return reader_;
    }
//  穿传入子类也可以
    public BufferReader_(Reader_ reader_) {
        this.reader_ = reader_;
    }
//    让方法更加的灵活,多次读取文件
    public void readFiles(int num){
//        这里调用的是子类的方法
        for (int i =0;i<num;i++){
            reader_.readFile();
        }
    }
//    多次读取字符串
public void readStrings(int num){
//        通过方法来调用  而不是直接通过对象调用
    for (int i =0;i<num;i++){
        reader_.readString();
    }
}
//  读取一次
    public void readString(){
//        通过方法来调用  而不是直接通过对象调用
            reader_.readString();
    }
}

实际使用,传入抽象类的子类,指定使用的方法

package com.reader_;

public class Test_ {
    public static void main(String[] args) {
        BufferReader_ bufferReader_ = new BufferReader_(new FileReader_());
        bufferReader_.readFiles(10);
        BufferReader_ bufferReader_1 = new BufferReader_(new StringReader_());
        bufferReader_1.readString();
    }
}

运行结果

读取文件......
读取文件......
读取文件......
读取文件......
读取文件......
读取文件......
读取文件......
读取文件......
读取文件......
读取文件......
读取字符串。。。。

3.处理流BufferReader和BufferWriter

当然这两也是字符流

真正处理数据还是节点流,处理流是将处理流进行了包装

应用案例1  读取指定文件当中的文本到程序当中

 

代码

package com.reader_;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferReader01 {
    public static void main(String[] args) {
        String path = "d:\\story.txt";
        BufferedReader bufferedReader =null;
        try {
//            字符流在处理一些二进制文件的时候可能会出现文件的损失
            bufferedReader = new BufferedReader(new FileReader(path));

            String string ;
//            按行进行文件的读取  读取完后返回null
            while ((string =bufferedReader.readLine())!=null) {
                System.out.println(string);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (bufferedReader!=null){
                try {
//                    不用关闭节点流,因为包装流底层会自动关闭节点流
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果

  21世纪历史爱好者林枫,熬夜刷历史小说突然猝死,然后穿越到东汉末年,成为了玉门关守将。
   作为一个穿越者,林枫正在想自己未来出路在何方的时候,拥有各种功能的逆天系统出现了。
   人口功能:可以兑换无数人口、..

将指定文件的内容以字符的形式打印到了控制台

应用案例2  使用字符流,将文本输入到指定文件

 代码

package com.writer_;

import java.io.BufferedWriter;
import java.io.FileWriter;

public class BufferReader01 {
    public static void main(String[] args) throws Exception {
        String path = "d:\\story.txt";
//      在节点流上写true进行追加  最终执行的还是节点流的代码 处理流只是方便我们使用节点流创建的工具 类似于工具箱
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path));
        bufferedWriter.write("韩顺平教育。");
//        插入一个换行符
        bufferedWriter.newLine();
        bufferedWriter.write("你好,我正在向文本当中书写内容。");
        bufferedWriter.close();
    }
}

执行结果

 应用案例3 使用字符流拷贝文件

代码

package com.writer_;

import java.io.*;

public class BufferCopy {
    public static void main(String[] args) throws IOException {
        String path = "d:\\story.txt";
//        写入文件的时候,如果找不到文件,他会自动的创建文件
        String aimPath = "src\\test01.txt";

        BufferedWriter bufferedWriter = null;
        BufferedReader bufferedReader = null;

        bufferedReader = new BufferedReader(new FileReader(path));
        bufferedWriter = new BufferedWriter(new FileWriter(aimPath));

        String len = "";
        while ((len = bufferedReader.readLine())!=null){
//            读一行写一行
            bufferedWriter.write(len);
//            写完之后记得换行
            bufferedWriter.newLine();
        }
        if (bufferedWriter!=null){
            bufferedWriter.close();
        }
        if (bufferedReader!=null){
            bufferedReader.close();
        }
    }
}

运行结果

 在创建文档的时候将文本写入

注意:doc,pdf,word文档都属于二进制文档

案例4 使用字节流拷贝文件

 使用的是BufferInputString和BufferOutputStream

代码

package com.buffer_;

import java.io.*;

public class BufferCopy01 {
    public static void main(String[] args) throws IOException {
        //        读取文件的路径
        String filePath = "d:\\01.jpg";
//        输出文件的路径
        String aimPath = "src\\01.jpg";

        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream =null;

        bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
        bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(aimPath));

        byte[] bytes = new byte[1024];
        int readLen = 0;
        while ((readLen = bufferedInputStream.read(bytes))!=-1){
//            三个参数的含义  数据 数据开始读取位置 数据结束读取位置
            bufferedOutputStream.write(bytes,0,readLen);
        }
        if (bufferedInputStream!=null){
            bufferedInputStream.close();
        }
        if (bufferedOutputStream!=null){
            bufferedOutputStream.close();
        }
    }
}

运行结果

 图片文件拷贝成功

字节流什么文件都可以拷贝,因为计算机上的所有文件的底层都是由二级制源码构成的。可能效率上比较低一些。处理流和节点流的使用方式是差不多的,只是封装了的处理流,使用起来更加的方便一些,效率也更高一些。

4.对象处理流ObjectOutputStream和ObjectInputStream 序列化与反序列化

对象处理流的作用

保存java数据到文件当中,并且能从文件当中取出,转化为java形式的文件

 保存值外加保存数据类型

 

两个对象流属于处理流和字节流

 ObjectInputStream类图结构

 ObjectOutputStream类图

 序列化ObjectOutputStream

案例

代码

package com.outputstream;

import java.io.*;

public class ObjectOutputStream_ {
    public static void main(String[] args) throws Exception {
//        序列化之后,保存的文件格式不是纯文本的形式,而是按照他的格式来保存的
        String filePath = "d:\\data.dat";

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));

//        序列化文件到指定路径
        objectOutputStream.write(100);  //会进行自动的装箱  类型为Integer 并且实现了序列化接口
        objectOutputStream.writeBoolean(true);
        objectOutputStream.writeChar('a');
        objectOutputStream.writeUTF("韩顺平教育");
//        保存一个对象
        objectOutputStream.writeObject(new Dog(10,"旺财"));

        objectOutputStream.close();

    }
}
//      如果需要序列化就实现接口
class Dog implements Serializable{
    private int age;
    private String name;

    public Dog(int age, String  name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String  getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 运行结果

  反序列化ObjectInputStream

创建公共类Dog 

package com.outputstream;

import java.io.Serializable;

public class Dog implements Serializable{
    private int age;
    private String name;

    public Dog(int age, String  name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String  getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

 ObjectInputStream_类

package com.inputstream;



import com.outputstream.Dog;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class ObjectInputStream_ {
    public static void main(String[] args) throws Exception {
//        指定反序列化的文件
        String filePath = "d:\\data.dat";

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));

//        注意,读取的顺序应当与序列化的顺序是一致的  因为是一一对应的关系
//        在反序列化之前,一定要将方法重新执行一边 不然可能会不匹配
        System.out.println(objectInputStream.readInt());
        System.out.println(objectInputStream.readBoolean());
        System.out.println(objectInputStream.readChar());
        System.out.println(objectInputStream.readUTF());
        Object dog  = objectInputStream.readObject();

//        重要的细节  如果我们想要执行类当中的方法 应当将类拷贝到可以引用的地方  存放的类最好是公开的
        Dog dog1 = (Dog)dog;
        System.out.println(dog1.getName());
        System.out.println(dog.getClass());
        System.out.println(dog);


        objectInputStream.close();
    }
}

运行结果

 100
true
a
韩顺平教育
旺财
class com.outputstream.Dog
Dog{age=10, name='旺财'}

注意事项

1.顺序不一致,会导致类型不一致,会报错

 2. 兼容性,类修改之后,仍旧会被当成一个类来进行处理

3.static和transient不会被序列化,但是transient不能被序列化不是绝对的

4.对一个对象进行序列化,要求对象的所有属性都可以被序列化

5.序列化具有可继承性

transient关键字详解https://www.runoob.com/w3cnote/java-transient-keywords.html

5.标准输入与输出流System.in 和System.out

 属于字节流。代表着两个流,一个对应的位置是键盘,一个对应的位置是显示器

 代码

package com.standard;

import java.util.Scanner;

public class InputAndOutput {
    public static void main(String[] args) {
//      System 当中的in属性    public final static InputStream in = null;
//        编译类型为InputStream运行类型为BufferInputStream  表示标准输出键盘
        System.out.println(System.in.getClass());
//      运行类型和编译类型都是PrintStream  表示标准输出显示器
        System.out.println(System.out.getClass());

        System.out.println("韩顺平教育~~~~~~");
//      键盘输入的内容
        Scanner scanner = new Scanner(System.in);
        String next = scanner.next();
        System.out.println(next);
    }
}

运行结果

class java.io.BufferedInputStream
class java.io.PrintStream
韩顺平教育~~~~~~
nihao
nihao

 6.转换流InputStreamReader和OutputStreamWriter

运行类型是字符流,

转换流的作用,将字节流转化为字符流

解决读取文件乱码问题

 代码

package com.transformation;

import java.io.*;

public class CodeQuestion {
    public static void main(String[] args) throws Exception {
//        读取指定路径的文件到程序当中
        String path = "d:\\test.txt";
//        创建流进行指定文件当中信息的读取
        BufferedReader bufferedReader = null;
        bufferedReader = new BufferedReader(new FileReader(path));

        String s = bufferedReader.readLine();
//      输出的文件没有任何的问题  默认情况下是按照UTF-8进行解析的  使用其他编码表可能会出现问题
        System.out.println(s);
//      出现乱码的根本问题是因为你没有指定解析你密码的格式
    }
}

 结果

为这世间的一切献上美好的祝福

没有问题是因为使用的编码表是UTF-8

 

进行格式更换

再次运行程序

Ϊ�������һ���������õ�ף�� 

出现乱码

转换流可以指定编码的形式

介绍 

 

 InputStreamReader类

类图

案例

代码

package com.transformation;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class InputStreamReader_ {
    public static void main(String[] args) throws Exception {
//      将FileInputStream字节流转化为InputStreamReader字符流   字符流处理文本的效率更b高

        String path = "d:\\test.txt";
        InputStreamReader jbk = new InputStreamReader(new FileInputStream(path), "gbk");

//      最后还是用处理流BufferedReader进行信息的处理  进行了两次包装  一次指定编码表  一次指定信息处理的处理流
        BufferedReader bufferedReader = new BufferedReader(jbk);
        
//        bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
//        可以将上面的代码合成一句话,因为InputStreamReader是Reader的子类

//        进行读取
        String s = bufferedReader.readLine();

        System.out.println(s);

    }
}

 运行结果

璁╂垜浠潵璧炵編杩欎釜涓栫晫鐨勭編濂藉惂

第一次为乱码,当我们修改txt文件的编码表为我们指定的时候,输出

让我们来赞美这个世界的美好吧 

 正常输出

 OutputStreamWriter

类图

 

 案例

 代码

package com.transformation;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class OutputStreamWriter_ {
    public static void main(String[] args) throws Exception {
        String path = "d:\\test.txt";
        String charSet = "gbk";

        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(path),charSet);
        outputStreamWriter.write("你好,艾莉西亚");

        outputStreamWriter.close();
    }
}

运行结果

 

7.打印流PrintStream和PrintWriter

字节流PrintStream

类图

构造方法

可以将文件打印到一个指定的文件当中

代码

package com.printStream_;

import java.io.IOException;
import java.io.PrintStream;

public class PrintStream_ {
    public static void main(String[] args) throws IOException {
        PrintStream ps = System.out;
//      默认情况下PrintStream输出的位置是控制台也就是显示器
        ps.print("如果真爱有颜色那么一定是蓝色的。");
//        因为print底层使用的是write所以我们可以直接使用write进行输出
        ps.write("感觉不如惠".getBytes());

        ps.close();

//        修改文本输出的位置
        System.setOut(new PrintStream("d:\\test.txt"));

        System.out.println("薇尔莉特是世界上最好看的女性");
    }
}

 前两句输出的位置

修改输出路径之后的情况

字符流PrintWriter

 类图

构造方法

 案例

package com.printStream_;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriter_ {
    public static void main(String[] args) throws IOException {
        String path = "d:\\test01.txt";
        PrintWriter printWriter = new PrintWriter(new FileWriter(path));
        printWriter.write("世界上最美好的语言是谎言。");

        printWriter.close();  //这里边才是真正写数据的
    }
}

运行结果

依旧是close的时候真正的输出完成信息

之前追过这个方法

七.配置文件Properties

1.引出配置文件 

代码

package com.propertise;

import java.io.BufferedReader;
import java.io.FileReader;

public class Properties_ {
    public static void main(String[] args) throws Exception {

//        传统的方式比较麻烦
        BufferedReader bufferedReader = new BufferedReader(new FileReader("src\\mysql.properties"));
        String lin = "";
        while ((lin = bufferedReader.readLine())!=null){
            String[] split = lin.split("=");
            System.out.println(split[0]+"的值是:"+split[1]);
        }
        bufferedReader.close();

    }
}

 运行结果

ip 的值是: 192.127.100.100
user 的值是: root
pwd 的值是:12345

获取信息不是很方便 properties当中的属性

以后会有个更方便的xml实现方法


2.基本的使用

 使用方法

 应用案例1   读文件

package com.propertise;

import java.io.FileReader;
import java.util.Properties;

public class Properties01 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileReader("src\\mysql.properties"));
//      将k-v显示到控制台
        properties.list(System.out);
//        根据key获得对应的值
        String user = properties.getProperty("user");
        System.out.println(user);
    }
}

 运行结果

-- listing properties --
user=root
pwd=12345
ip=192.127.100.100
root

应用案例2   写文件

代码

package com.propertise;


import java.io.FileOutputStream;
import java.util.Properties;

public class Properties02 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();

//        进行添加信息  如果key存在就替换  底层的父类是HashCode
        properties.setProperty("charSet","utf-8");
        properties.setProperty("user","tom");
        properties.setProperty("pwd","abc111");

//        将内容写入文件   后面的参数是文件得注释
        properties.store(new FileOutputStream("src\\mysql01.properties"),null);

        System.out.println("保存配置文件成功。。。");
    }
}

运行结果

八.家庭作业

1.家庭作业一

 代码

package com.homework;

import java.io.*;

public class HomeWork01 {
    public static void main(String[] args) throws IOException {
//        创建文件夹
        String directoryPath = "d:\\mytemp";
        File file = new File(directoryPath);

        if (!file.exists()){
            if (file.mkdirs()){
                System.out.println(directoryPath+"创建成功");
            }else {
                System.out.println(directoryPath+"创建失败");
            }
        }

        String filePath = directoryPath+"\\hello.txt";
        file =new File(filePath);
//        不存在的话  返回true
        if (!file.exists()){
//            创建文件夹
            if (file.createNewFile()){
                System.out.println(filePath + "文件创建文件");
                BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
                bufferedWriter.write("你好,但愿我能看见世界的美好。。");
                bufferedWriter.close();
            }else {
                System.out.println(filePath + "文件创建失败");
            }
        }else {
            System.out.println(filePath + "已经存在,不再重复的创建");
        }

    }
}

控制台输出结果

d:\mytemp创建成功
d:\mytemp\hello.txt文件创建文

文件

2.家庭作业二

 代码

package com.homework;

import java.io.BufferedReader;
import java.io.FileReader;

public class HomeWork02 {
    public static void main(String[] args) throws Exception {
        String filePath = "d:\\test.txt";
        BufferedReader bufferedReader = null;
        String lin = " ";
        int i = 0;

        bufferedReader = new BufferedReader(new FileReader(filePath));


        while ((lin = bufferedReader.readLine())!=null){
            System.out.println(++i+":"+lin);
        }
        if (bufferedReader!=null){
            bufferedReader.close();
        }
        
    }
}

运行结果

1:如果天空总是黑暗的,那就摸黑生存;
2:如果发出声音是危险的,那就保持沉默;
3:如果自觉无力发光,那就蜷伏于墙角。
4:但不要习惯了黑暗就为黑暗辩护;
5:也不要为自己的苟且而得意;
6:不要嘲讽那些比自己更勇敢的人们。
7:我们可以卑微如尘土,但不可扭曲如蛆虫。

 修改文件存储的编码,利用转换流进行转化,才能正常输出

package com.homework;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class HomeWork02 {
    public static void main(String[] args) throws Exception {
        String filePath = "d:\\test.txt";
        BufferedReader bufferedReader = null;
        String lin = " ";
        int i = 0;
//      修改编码之后的操作
        bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gbk"));


        while ((lin = bufferedReader.readLine())!=null){
            System.out.println(++i+":"+lin);
        }
        if (bufferedReader!=null){
            bufferedReader.close();
        }

    }
}

3.家庭作业三

代码

package com.homework;


import java.io.*;
import java.util.Properties;

public class HomeWork03 {
    public static void main(String[] args) throws Exception {
        String filePath = "src\\dog.properties";
        Properties properties = new Properties();
        properties.load(new FileReader(filePath));
        String name = properties.get("name")+" ";
        int age = Integer.parseInt(properties.get("age")+"");
        String color = properties.get("color")+" ";

        Dog dog = new Dog(name, age, color);
        System.out.println(dog);

        String serFilePath = "d:\\dog.dat";

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(serFilePath));

        objectOutputStream.writeObject(dog);

        objectOutputStream.close();
        System.out.println("dog序列化完成。。");
    }
}

class Dog implements Serializable{
    private String  name;
    private int age;
    private String color;

    public Dog(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }
}

 运行结果

Dog{name='tom ', age=5, color='red '}

dat文件

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到