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:字符到字节的桥梁,编码。
流的操作规律:
- 之所以要弄清楚这个规律,因为流对象太多,开发时要清楚用哪一个对象合适。
想知道开发时用哪些对象,只要通过四个明确即可。
- 明确源和目的(汇)
- 源: InputStream Reader
- 目的:OutputStream Writer
- 明确数据是否纯文本数据。
- 源:
- 是纯文本:Reader
- 否纯文本:InterStream
- 目的:
- 是纯文本:Writer
- 否纯文本:OutputSream
###到这里,就可以明确需求中具体要使用哪个体系。
- 源:
- 明确具体的设备。
- 源设备:
- 硬盘: File
- 键盘: System.in
- 内存: 数组
- 网络: Socket流
- 目的设备:
- 硬盘: File
- 控制台:System.out
- 内存: 数组
- 网络: Socket流
- 源设备:
- 是否需要其他额外功能。
- 是否需要高效(缓冲区)
- 是:加上Buffer
- 转换
- 是否需要高效(缓冲区)
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()显示所有文件名目录