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();
}
练习:
- 将键盘录入的数据写入到一个文件中
- 将一个文本文件内容显示在控制台
- 将一个文件中的内容复制到另一个文件
流的操作规律
转换流的编解码
//用指定码表写入文件
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);
什么时候使用转换流?
- 源或者目的对应的设备是字节流,但操作是文本数据,可以使用转换流作为桥梁
- 一旦操作文本涉及到具体的指定编码表,必须使用转换流
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");
}
}
练习
- 深度遍历文件夹
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);
- 递归
- 递归一定要明确条件,否则容易栈溢出
- 要注意递归次数,次数过多也会溢出
- 需要通过递归改变的对象,不能再递归函数内生成,不然每次递归都会生成新对象,所以需要将该对象作为递归函数的参数
- 删除带内容的目录
需要从最里面往外逐层删,深度遍历的应用
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);