IO
in 和 out
File
文件和目录路径名的抽象表示。描述的就是某个文件。
delete() 删除此抽象路径名表示的文件或目录。
createNewFile() 当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。true如果指定的文件不存在且已成功创建; false如果指定的文件已存在
getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
exists() 测试此抽象路径名表示的文件或目录是否存在。
isFile() 测试此抽象路径名表示的文件是否为普通文件。
isDirectory() 测试此抽象路径名表示的文件是否为目录。
listFiles() 返回一个抽象路径名数组,表示此抽象路径名表示的目录中的文件。
list() 返回一个字符串数组,用于命名此抽象路径名表示的目录中的文件和目录。
mkdir() 创建此抽象路径名指定的目录。
mkdirs() 创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。
renameTo(File dest) 重命名此抽象路径名表示的文件。
文件搜索代码的实现:
public static void main(String[] args) {
File e = new File(pathname:"e:\\");
File[] files = e.listFiles();
listFiles(files);
}
public static void listFiles(File[] files) {
if (files != null && files.Length > 0) {
for (File file : files) {
if (file.isFile()) {
//文件
if (file.getName().endsWith(" . avi")) {
//找到了一个avi文件
if (file.Length() > 200 * 1024 * 1024) {
file.deLete();
System.out.printLn(file.getAbsoLutePath() + "已删除");
}
}
//System.out.printLn("找到了一个avi文件:" + file.getAbsoLutePath());
}
}
eLse {
//文件夹
File[] files2 = file.listFiles();
listFiles(files2);
}
}
}
public static void main(String[] args) {
File e = new File("e:\\");
listFiles(e);
}
public static void listFiles(File file) {
//1.创建一个过滤器并描述规则
FileFilter filter = new AVIFileFilter();
//2.通过文件获取子文件夹
File[] files = file.listFiles(filter);
if (files != null && files.length > 0)
for (File f : files) {
if (f.isDirectory()) {
listFiles(f);
} else {
System.out.println("发现一个avi:" + f.getAbsolutePath());
}
}
}
static class AVIFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(" .avi") || pathname.isDirectory())
return true;
return false;
}
}
相对路径和绝对路径
绝对路劲:从盘符开始,是一个完整的路径例如:c://a.txt
相对路径:在Java代码中是相对于项目路径,这是一个不完整的便捷路径。在Java开发中很常用。例如:a.txt
IO流
可以将这种数据传输操作,看作一种数据的流动,按照流动的方向分为输入Input和Output
Java中的IO操作主要指的是java.io包下的一些常用类的使用,通过这些常用类对数据进行读取(输入Input)和写出(输出Output)
分类
按照流的方向来分,可以分为:输入流和输出流。
按照流的数据类型来分,可以分为字节流和字符流
字节流:
输入流:InputStream
输出流:OutputStream
字符流:
输入流:Reader
输出流:Writer
字节流
一切皆字节:
计算机中的任何数据(文本、图片、视频、音乐等)都是以二进制的形式储存的。在数据传输时也都是以二进制的形式储存的。后续学习的任何流,在传输时都是二进制。
OutputStream
此抽象类是表示输出字节流的所有类的超类。
方法:
close():关闭此输出流并释放与此流关联的所有系统资源。
flush():刷新此输出流并强制写出任何缓冲的输出字节。
write(int b) 将指定的字节写入此输出流。
write(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。
write(byte[] b, int off, int len) 将从偏移量 off开始的指定字节数组中的 len字节写入此输出流。
InputStream
read() 从输入流中读取下一个数据字节。从输入流中读取下一个数据字节。 值字节返回int ,范围为0至255 。如果由于到达流末尾而没有可用字节,则返回值-1 。
read(byte[] b) 从输入流中读取一些字节数并将它们存储到缓冲区数组 b 。 如果b的长度为零,则不读取任何字节,并返回0 ; 否则,尝试读取至少一个字节。 如果由于流位于文件末尾而没有可用字节,则返回值-1 ; 否则,至少读取一个字节并存储到b 。
任何数据 ^相同的数据两次结果就是其本身
字符流
Writer
append(char c) 将指定的字符追加到此writer。
write(char[] cbuf) 写一个字符数组。
write(char[] cbuf, int off, int len) 写一个字符数组的一部分。
write(int c) 写一个字符。
write(String str) 写一个字符串。
write(String str, int off, int len) 写一个字符串的一部分。
flush
刷新缓存空间,强制将缓存区域文字输入。
Reader
read() 读一个字符。
字符读取,为0到65535( 0x00-0xffff )范围内的整数,如果已到达流末尾, 0x00-0xffff -1
read(char[] cbuf) 将字符读入数组。
读取的字符数,如果已到达流的末尾,则返回-1
read(char[] cbuf, int off, int len) 将字符读入数组的一部分。
read(CharBuffer target) 尝试将字符读入指定的字符缓冲区。
转换流
将字节流 装饰(转换)为字符流:使用了装饰者设计模式。
FileInputstream fis = new FileInputStream(name: "c://a.txt");
//将字节输入流,转换为字符输入流
//参数1.要转换的字节流
//参数2.指定编码名称
```java
InputstreamReader isr = new InputStreamReader(fis, charsetName: "gbk");
while(true){
int c = isr.read();
if(c == -1){
break;
}
System.out.println((char)c);
}
FileOutputStream fos = new FileOutputStream(name: "c://a.txt");
outputstreamWriter osw = new OutputStreamWriter(fos);
osw.write(str:"床前明月光");
osw.flush();
osw.close();
字符输出(打印流)
PrintStream ps = new PrintStream(fileName:"c://c.txt" );
ps.println("1");
ps.println("2");
ps.println("3");
PrintWriter ps = new PrintWriter(fileName: "c://c.txt");
pw.println("1");
ps.println("2");
ps.println("3");
pw.flush();
//也可用于转换
缓存读取流
将字符输入流 转换为带有缓存可以一次读取一行的缓存字符读取流。
FileReader fw = new FileReader( fileName: "c://c.txt");
BufferedReader br = new BufferedReader(fw);
String text = br.readLine();
System.out.println(text);
收集异常日志
try{
string s = null;
s.toString();
}catch(Exception e){
PrintWriter pw = new PrintWriter( fileName: "c://bug.txt");
e.printStackTrace(pw);
pw.close();
}
Properties
store();将此 Properties表中的此属性列表(键和元素对)以适合使用 load()方法加载到 Properties表的格式写入输出流。
list(PrintStream out);list(PrintWriter out)将此属性列表打印到指定的输出流。