day22

IO流

键盘录入

public static void readkeyboard() throws IOException{
InputStream  i = System.in;//默认输入设备
int ch = i.read();//读取单个字符并打印
System.out.println(ch);
int ch1 = i.read();
System.out.println(ch1);
int ch2 = i.read();
System.out.println(ch2);
//关闭后无法再通过创建新对象开启,默认输入和输出设备都不需要关闭
i.close();
InputStream  i2 = System.in;
int ch = i2.read();		 
}
  • 上述代码输入d回车后会打印三个数字,100,13,10,因为’\r’=13,’\n’=10
  • 一个汉字有两个字节组成,用字节流的方式会返回两个数字

流转换

字节流转成字符流(解码)
private static void readkeyboard2() throws IOException{
InputStream  i = System.in;//字节流
//将字节转成字符的桥梁
InputStreamReader isr = new InputStreamReader(i);			
BufferedReader br = new BufferedReader(isr);//字符流
String line = null;
//使用readLine()读取一整行输入字符,并转成大写输出
while((line=br.readLine())!=null) {
	if("over".equals(line))
		break;
	System.out.println(line.toUpperCase());
 }
}

字符流转成字节流(编码)
InputStream  i = System.in;
InputStreamReader isr = new InputStreamReader(i);			
BufferedReader br = new BufferedReader(isr);
OutputStream o = System.out;
OutputStreamWriter owr = new OutputStreamWriter(o);			
BufferedWriter bw = new BufferedWriter(owr);
//上述代码可以简化成两行
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=br.readLine())!=null) {
	if("over".equals(line))
		break;
	bw.write(line.toUpperCase());
  bw.newLine();
  bw.flush();
 }

练习:

  1. 将键盘录入的数据写入到一个文件中
  2. 将一个文本文件内容显示在控制台
  3. 将一个文件中的内容复制到另一个文件

流的操作规律

在这里插入图片描述在这里插入图片描述

转换流的编解码

//用指定码表写入文件
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("xxx.txt"),"GBK");
osw.write("你好");
osw.close();

FileWriter fw = new FileWriter("xxx.txt");
fw.write("你好");
fw.close();
//这两段代码等效
  • FileWriter就是操作文件的字节流+本机默认的编码表
  • 如果需要明确具体的编码,则必须用转换流
//用指定的码表读取文件
InputStreamReader isr = new InputStreamReader(new FileInputStream("xxx.txt"),"utf-8");
char[] buf = new char[10];
int len = isr.read(buf);
String str = new String(buf,0,len);
System.out.println(str);

在这里插入图片描述
什么时候使用转换流?

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

File类

构造函数
File f1 = new File("c:\\a.txt");
File f2 = new File("c:\\","a.txt");
File f = new File("c:\\");//封装成对象
File f3 = new File(f,"a.txt");
File f4 = new File("c:"+File.separator+"a.txt");//分隔符字段
获取
File f = new File("a.txt");
String name = f.getName();//获取文件名称
String abspath = f.getAbsolutePath();//绝对路径
String path = f.getPath();//相对路径
long len = f.length();//文件大小
long time = f.lastModified();//修改时间
创建与删除
文件的创建和删除
File f = new File("a.txt");
boolean b = f.createNewFile();
//如果文件不存在则创建,存在则不创建,这里不会发生覆盖
boolean b = f.delete();
文件夹的创建与删除
File dir = new File("abc");
File dir1 = new File("abc\\c\\d");//创建多级目录
boolean b = dir.mkdir();
boolean b = dir.delete();//文件夹不为空时,无法删除
其它方法
判断
File f = new File("a.txt");
boolean b = f.exists();//判断文件是否存在
boolean a = f.isFile();
boolean c = f.isDirectory();
重命名
File f1 = new File("c:\\1.mp3");
File f2 = new File("c:\\9.mp3");//改变路径则为剪切功能
boolean b = f1.renameTo(f2);
容量获取
File f = new File("d:\\");
file.getFreeSpace();//获取d盘的剩余容量
过滤器
File dir = new File("c:\\");
String[] names = dir.list(new filefilter());
for(String name : names){
	System.out.println(name);
}
//建立一个过滤java文件过滤器
public class filefilter implements FilenameFilter {
public boolean accept(File dir, String name) {
	return name.endsWith(".java");
	}
}

在这里插入图片描述

练习
  1. 深度遍历文件夹
public static void listAll (File dir){
	System.out.println("dir:"+dir.getAbsolutePath());
	File[] files = dir.listFiles();
	for(int x=0; x<files.length; x++){
		if(files[x].isDirectory()){
			listAll(files[x]);
		}
		else {
			System.out.println("file:"+files[x].getAbsolutePath());
		}
	}
}
File dir = new File("f:\\java_learning");
listAll(dir);
  1. 递归
  • 递归一定要明确条件,否则容易栈溢出
  • 要注意递归次数,次数过多也会溢出
  • 需要通过递归改变的对象,不能再递归函数内生成,不然每次递归都会生成新对象,所以需要将该对象作为递归函数的参数
    在这里插入图片描述
  1. 删除带内容的目录
需要从最里面往外逐层删,深度遍历的应用
public static void removedir(File dir){
	File[] files = dir.listFiles();
	for(File file : files){
		if(file.isDirectory()){
			removedir(file);
		}
		else{
			System.out.print(file+":"+file.delete());
		}
	}
	System.out.println(dir+":"+dir.delete());
}
File dir = new File("f:\\java_learning");
removedir(dir);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值