------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
八、键盘录入
System.out:对应的是标准输出设备,控制台。
System.in:对应的标准输入设备,键盘。
InputStream in=System.in;//键盘输入
in.read();//读取键盘输入
读取转换流InputStreamReader
通过readLine方法完成键盘录入的一行数据,readLine方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字节流InputStream的方法,所以需要将字节流转
成字符流再使用字符流缓冲区的readLine方法
InputStreamReader 属于字符流,因此可以作为参数传入BufferedReader。它可以将字节流转成字符流,是字节流通向字符流的桥梁。
代码示例
public static void main(String[] args) throws IOException {
//获取键盘录入对象
InputStream in = System.in;
//将字节流对象转成字符流对象,使用转换流,InputStreamReader
InputStreamReader isr = new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr = new BufferedReader(isr);
/*将上述三句话合并成一句话
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
*/
String line = null;
while((line=bufr.readLine())!=null) {
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
bufr.close();
}
写入转换流OutputStreamWriter
OutputStreamWriter是由字符流通向字节流的桥梁
OutputStreamReader只接受参数字节流对象OutputStream
代码示例
import java.io.*;
class TransStreamDemo2 {
public static void main(String[] args) throws IOException {
//获取键盘录入对象
InputStream in=System.in;
//将字节流对象转成字符流对象,使用转换流,InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
//将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr=new BufferedReader(isr);
//将字符流转换成字节流,同时进行缓冲区技术高效操作
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bufr.readLine())!=null) {
if("over".equals(line))//输入over时,跳出录入
break;
bufw.write(line.toUpperCase());//写入数据
bufw.newLine();//跨平台换行
bufw.flush();
}
bufr.close();
}
}
九、流操作的规律
要进行流的操作必须要三个明确
1、明确源和目的
源:输入流。分为字节流InputStream,字符流Reader
目的:输出流。分为字节流OutputStream,字符流Writer
2、操作的数据是否是纯文本数据
是,使用字符流
不是,使用字节流
3、虽然确定了一个体系,但是该体系中有太多的对象,到底用哪一个呢
数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)
如果需要就进行装饰
需求1:复制一个文本文件
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是
源:Reader
目的:Writer
3、明确具体设备。
源:硬盘:File
目的:硬盘:File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
4、需要额外功能吗?
需要,高效
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
需求2:读取键盘录入信息,并写入到一个文件中
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是
源:Reader
目的:Writer
3、明确具体设备。
源:键盘:System.in
目的:硬盘:File
FileReader fr = new System.in;
FileWriter fw = new FileWriter("b.txt");
这样做可以完成,但是麻烦。将读取的字节数据转成字符串,再由字符流操作。
4、需要额外功能吗?
需要,转换。将字节流转成字符流,因为明确的源是Reader,这样操作文本数据更快捷。
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"));
需求3:将一个文本文件数据都显示在控制台上
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是
源:Reader
目的:Writer
3、明确具体设备。
源:硬盘:File
目的:硬盘:System.out
FileReader fr = new FileReader("a.txt");
FileWriter fw = System.out;//PrintStream
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、明确额外功能?
需要,转换。因为都是字节流,但是操作的却是文本数据。所以使用字节流操作起来更为便捷。
InputSreamReader 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));
任何Java识别的字符数据使用的都是Unicode码表,但是FileWriter写入本地文件使用的是本地编码,也就是GBK码表。
而OutputStreamWriter可使用指定的编码将要写入流中的字符编码成字节。
UTF-8编码,一个中文三个字节。GBK码表一个中文两个字节。
凡是操作设备上的文本数据涉及编码转换必须使用转换流。
异常的日志信息:
当程序在执行的时候,出现的问题是不希望直接打印给用户看的,是需要作为文件存储起来,方便程序员查看,并及时调整的。
代码示例
import java.io.*;
import java.text.*;
import java.util.*;
class ExceptionInfo {
public static void main(String[] args) {
try {
int[] arr =new int[2];
System.out.println(arr[3]);//人为制造一个异常
}
catch (Exception e) {
try {
Date d=new Date();//创建时间对象
//用SimpleDateFormat自定义格式对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s=sdf.format(d);//将时间格式化
PrintStream ps=new PrintStream("ExceptionInfo.log");//打印流对象
System.setOut(ps);//修改输出流设备
ps.println(s);//输出时间
}
catch (IOException ex) {
throw new RuntimeException("文件创建失败");
}
e.printStackTrace(System.out);//将异常信息输出指定输出流
}
}
}
系统属性信息存入文本
Properties getProperties();//获取系统信息
void list(PrintStream out);//将信息输出到指定输出流中
new PrintStream("systeminfo.txt");//将输出流中数据存入指定文件中
代码示例
import java.util.*;
import java.io.*;
class SystemInfo {
public static void main(String[] args) throws IOException {
//获取系统信息
Properties prop = System.getProperties();
//创建输出流对象,将输出流数据存入指定文件
ps = new PrintStream("sysinfo.txt")
//将属性列表输出到指定的输出流
prop.list(ps);
}
}
十、File类
概述
将文件系统中的文件和文件夹封装成对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。这些是流对象办不到的,因为流只操作数据。
方法
1、创建
boolean createNewFile();//在指定目录下创建文件,如果文件已经存在,则不创建返回false
boolean mkdir();//创建一级目录
boolean mkdirs();//创建多级目录
2、删除
boolean delete();//删除此抽象路径名表示的文件或者目录,如果失败返回false
void deleteOnExit();//在虚拟机退出时删除
注意:在删除文件时,必须保证这个文件夹中没有任何内容,才可以将该文件夹用delete删除。
3、获取
long length();//获取文件大小
String getName();//返回文件或者目录的名称
String getPath();//将此抽象路径名转换成一个路径名字符串
String getAbsolutePath();//返回此抽象路径名的绝对路径名字符串
String getParent();//返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定的父目录,则返回null
long lastModified();//返回此抽象路径名表示的文件最后一次被修改的时间
4、判断
boolean exists();//判断文件或者文件夹是否存在
boolean isDirectory();//测试次抽象路径名表示的文件夹是否是一个目录
boolean isFile();//测试此抽象路径名表示的文件是否是一个标准文件
boolean isHidden();//测试此抽象路径名指定的文件夹是否是一个隐藏文件
boolean isAbsolute();//测试此抽象路径名是否为绝对路径名
5、重命名
boolean renameTo(File dest);//可以实现移动的效果。剪切+重命名
过滤
需求:过滤.bmp文件并且列出全部.bmp文件名称
File dir=new File(“c:\\”);
//FilenameFilter是一个过滤器接口,用匿名内部类传入filter对象
String[] arr=dir.list(new FilenameFilter() {
//复写FilenameFilter接口的accept(File file,String name)方法,并判断name是否是bmp文件
public boolean accept(File dir,String name) {
Return name.endsWith(“.bmp”)
}
});
//遍历String数组
for(String name:arr) {
System.out.println(name);
}