毕向东Java视频学习笔记【day21-IO流<2>】

23-IO流(演示键盘录入)

一旦 System.in流 被关闭了,再创建一个对象in2没有用,会抛出异常。

        InputStream in = System.in;

        int ch = in.read();//阻塞式方法。     
        System.out.println(ch);
        int ch1 = in.read();//阻塞式方法。        
        System.out.println(ch1);
        int ch2 = in.read();//阻塞式方法。        
        System.out.println(ch2);

        in.close();

        InputStream in2 = System.in;
        int ch3 = in2.read();

24-IO流(读取键盘录入)


import java.io.IOException;
import java.io.InputStream;

/*
 * 读取一个键盘录入的数据,并打印在控制台上。
 * 
 * 键盘本身就是一个标准的输入设备。
 * 对于java而言,对于这种输入设备都有对应的对象。
 */
public class ReadKey {
    public static void main(String[] args) throws IOException {
        readKey2();
    }
    public static void readKey2() throws IOException {
        /*
         * 获取用户键盘录入的数据,
         * 并将数据变成大写显示在控制台上,
         * 如果用户输入的是over,结束键盘录入。
         * 
         * 思路:
         * 1,因为键盘录入只读取一个字节,要判断是否是over,需要将读取到的字节拼成字符串。
         * 2,那就需要一个容器。StringBuilder.
         * 3,在用户回车之前将录入的数据变成字符串判断即可。 
         * 
         */
        //1,创建容器。
        StringBuilder sb = new StringBuilder();

        //2,获取键盘读取流。        
        InputStream in = System.in;

        //3,定义变量记录读取到的字节,并循环获取。         
        int ch = 0;

        while((ch=in.read())!=-1){

//          在存储之前需要判断是否是换行标记 ,因为换行标记不存储。 
            if(ch=='\r')
                continue;
            if(ch=='\n'){
                String temp = sb.toString();
                if("over".equals(temp))
                    break;
                System.out.println(temp.toUpperCase());
                sb.delete(0, sb.length());
            }
            else
            //将读取到的字节存储到StringBuilder中。
            sb.append((char)ch);
        }
    }
    public static void readKey() throws IOException {
        InputStream in = System.in;
        int ch = in.read();//阻塞式方法。     
        System.out.println(ch);
        int ch1 = in.read();//阻塞式方法。        
        System.out.println(ch1);
        int ch2 = in.read();//阻塞式方法。        
        System.out.println(ch2);
    }
}

25-IO流(转换流)

  • InputStreamReader 将字节流转换成字符流的桥梁。转换流。
  • OutputStreamWriter 字符流转换成字节流。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

26-IO流(转换流-需求演示)

1.需求:将键盘录入的数据写入到一个文件中


BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));

2.需求:将一个文本文件内容显示在控制台上。

BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out);

3.需求,将一个文件内容复制到另一个文件中。

BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));

27-IO流(流的操作基本规律)

  • 转换流:

    • InputStreamReader:字节到字符的桥梁,解码。
    • OutputStreamWriter:字符到字节的桥梁,编码。
  • 流的操作规律:

    • 之所以要弄清楚这个规律,因为流对象太多,开发时要清楚用哪一个对象合适。

想知道开发时用哪些对象,只要通过四个明确即可。

  1. 明确源和目的(汇)
    1. 源: InputStream Reader
    2. 目的:OutputStream Writer
  2. 明确数据是否纯文本数据。
    1. 源:
      1. 是纯文本:Reader
      2. 否纯文本:InterStream
    2. 目的:
      1. 是纯文本:Writer
      2. 否纯文本:OutputSream
        ###到这里,就可以明确需求中具体要使用哪个体系。
  3. 明确具体的设备。
    1. 源设备:
      1. 硬盘: File
      2. 键盘: System.in
      3. 内存: 数组
      4. 网络: Socket流
    2. 目的设备:
      1. 硬盘: File
      2. 控制台:System.out
      3. 内存: 数组
      4. 网络: Socket流
  4. 是否需要其他额外功能。
    1. 是否需要高效(缓冲区)
      1. 是:加上Buffer
    2. 转换

28-IO流(流的操作基本规律-需求体现-1)

需求1:复制一个文本文件。

1. 明确源和目的。
    1. 源:InputStream Reader
    2. 目的:OutputStream Writer
2. 是否纯文本?
    1. 是
        1. 源:Reader
        2. 目的:Writer
3. 明确具体设备。
    1. 源:硬盘:File
    2. 目的:硬盘:File


FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");

4. 需要额外功能:高效
BufferReader bufr = new BufferReader(new FileReader("a.txt"));
BufferWriter bufw = new BufferWriter(new FileWriter("b.txt"));

需求2:读取键盘录入信息并且写入一个文件中

1. 明确目标源
    1. 源:InputStream Reader
    2. 目的:OutputStream Writer
2. 是否纯文本
    1. 是
        1. 源:Reader
        2. 目的:Writer
3. 明确具体设备
    1. 源:键盘:System.in
    2. 目的:硬盘: File

InputSteam in = System.in;
FileWriter fw = new FileWriter("b.txt");

这样做可以完成但是麻烦,将读取的字节数据转成字符串,在由字符流操作。

4. 需要而外功能吗?
    1. 需要转换,将字节流转成字符流。因为明确的源是Reader,这样操作文本数据更便捷。
    所以,将已有的字节流转换成字符流,使用字节-->字符。InputStreamReader

    用字符流

    InputStreamReader isr = new InputStreamReader(System.in);
    FileWriter fw = new FileWriter("b.txt");    

还需要功能吗?
需要:想高效。
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));

29-IO流(流的操作基本规律-需求体现-2)

需求3:将一个文本文件数据显示在控制台上。

1. 明确目标源
    1. 源:InputStream Reader
    2. 目的:OutputStream Writer
2. 是否纯文本
    1. 是
        1. 源:Reader
        2. 目的:Writer
3. 明确具体设备
    1. 源:硬盘:File
    2. 目的:控制台: System.out

    FileReader fr = new FileReader("a.txt");
    OutputStream out = System.out;

4. 需要而外功能吗?
    需要:转换。用字符流

    FileReader fr= new FileReader("a.txt");
    OutputStreamWriter osw = new OutputStreamWriter(System.out);

    需要,高效。 
    BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

需求4:读取键盘录入数据,显示在控制台上。

1. 明确源和目的。
    源:InputStream Reader
    目的:OutputStream  Writer
2. 是否是纯文本呢?
    是:
        源:Reader
        目的:Writer
3. 明确设备。
    源:
        键盘:System.in
    目的:
        控制台:System.out

    InputStream in = System.in;
    OutputStream out = System.out;

4. 明确额外功能?
    需要转换,因为都是字节流,但是操作的却是文本数据。
    所以使用字符流操作起来更为便捷。
    InputStreamReader isr = new InputStreamReader(System.in);
    OutputStreamWriter osw = new OutputStreamWriter(System.out);

    为了将其高效。
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

30-IO流(转换流的编码解码)

需求5:将一个中文字符串数据按照指定的编码表写入到一个文本文件中.

1. 目的。OutputStream,Writer
2. 是纯文本,Writer。
3. 设备:硬盘File 
FileWriter fw = new FileWriter("a.txt");
fw.write("你好"); 



    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk_3.txt"),"GBK");
    FileWriter fw = new FileWriter("gbk_1.txt");

    /*
     * 这两句代码的功能是等同的。 
     * FileWriter:其实就是转换流指定了本机默认码表的体现。而且这个转换流的子类对象,可以方便操作文本文件。
     *             简单说:操作文件的字节流+本机默认的编码表。
     *              这是按照默认码表来操作文件的便捷类。
     * 
     * 如果操作文本文件需要明确具体的编码。FileWriter就不行了。必须用转换流。 
     * 
     */


注意:既然需求中已经明确了指定编码表的动作。
那就不可以使用FileWriter,因为FileWriter内部是使用默认的本地码表。
只能使用其父类。OutputStreamWriter.
OutputStreamWriter接收一个字节输出流对象,既然是操作文件,那么该对象应该是FileOutputStream

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);

需要高效吗?
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));

什么时候使用转换流呢?

1. 源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。提高对文本操作的便捷。
2. 一旦操作文本涉及到具体的指定编码表时,必须使用转换流。

31-IO流(File对象-构造函数&字段)

  • File对象的几种重载
    • 1.File f1 = new File(“c:\a.txt”);
    • 2.File f2 = new File(“c:\”,”a.txt”);
    • 3.
      • File f = new File(“c:\”);
      • File f3 = new File(f,”a.txt”);
    • 4.在不同系统中用file.separator
      -File f4 = new File(“c:”+File.separator+”abc”+File.separator+”a.txt”);

32-IO流(File对象-常见功能-获取)

  • 获取文件名:
    • String name = file.getName();
  • 获取绝对路径:(带盘符)
    • String absPath = file.getAbsolutePath();//绝对路径。
  • 获取路径:
    • String path = file.getPath();
  • 获取文件大小:
    • long len = file.length();
  • 获取修改时间:
    • long time = file.lastModified();
    • 这个方法单独开了一个线程。每隔三秒检测文件时间是否更改,一旦改写,重新加载文件内容。

33-IO流(File对象-常见功能-创建和删除)

  • File.creatNewFile()创建一个tet文件
    • 可以返回boolean的值 创建成功返回true 否则false
  • File.delete() 删除一个txt文件
    • 也是返回boolean型
  • File.mkdir():boolean 创建一个单级文件夹
  • File.delete():boolean 删除一个文件夹(若文件夹里有文件,则无法删除)
  • File.mkdirs() 创建多级目录
    • 创建多级目录后,再使用删除File.delete只会删除最根级文件

34-IO流(File对象-常见功能-判断)

  • File.exists() 判断文件是否存在

最好现在判断前判断是否存在该文件

  • isFile判断是否是文件
  • isDirectory判断是否是目录

35-IO流(File对象-常见功能-重命名)

  • renameTo() 重命名

36-IO流(File对象-常见功能-系统根目录和容量获取)

  • listRoots()获取根目录 (盘)
  • getTotalSpace()获取总容量
  • getFreeSpace()获取剩余容量
  • getUsableSpace()获取已使用容量

37-IO流(File对象-常见功能-获取目录内容)

  • list():string 返回当前目录下所有文件名(包含隐藏文件)

38-IO流(File对象-常见功能-过滤器)

  • filter() 先用list获取所有文件名 然后匹配符合条件的过滤
  • listFiles()显示所有文件名目录
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值