黑马程序员_IO流(二)

------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);
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值