目录
前言
总结了自己学习过程中的笔记
一、File类
file类是java.io包下的类、代表与平台无关的问价和目录 * 1、file能创建、删除、重命名文件和目录,也能检测、访问文件和目录本身 * 2、File不能访问文件中的内容,如果要访问内容、则需要使用输入、输出流
File file = null;
//创建文件
file = new File("E:/filetest/1.txt");//在fileTest下面创建一个1.txt文件
file.createNewFile();//创建出一个文件
/**
* //删除文件
* file.delete();
*/
//修改文件名
file.renameTo(new File("E:/filetest/2.txt"));//将1改成2.txt
//判断文件
System.out.println("是否存在:" + file.exists());
System.out.println("是否文件:" + file.isFile());
System.out.println("是否可读:" + file.canRead());
System.out.println("是否可写:" + file.canWrite());
System.out.println("是否绝对路径:" + file.isAbsolute());
//访问
System.out.println("文件名:" + file.getName());
System.out.println("文件路径:" + file.getPath());
System.out.println("文件绝对路径:" + file.getAbsolutePath());
System.out.println("文件上级目录:" + file.getParent());
System.out.println("修改时间:" + file.lastModified());
//目录操作
file = new File("E:/filetest/on");
file.mkdir();
//删除、改名、判断、访问对目录也适用
//相对路径
file = new File("3.txt");//相对于项目根目录的位置创建
file.createNewFile();
System.out.println("文件绝对路径:" + file.getAbsolutePath());
System.out.println("文件上级目录:" + file.getParent());
System.out.println("修改时间:" + file.lastModified());
过滤文件: * File类的ListFiles()方法可以接受一个参数,用于列举文件时候对其过滤 * File类会一次将文件传给过滤器,当个过滤器返回True时,File类才会列举该文件
//文价过滤
File dir = new File("E:/filetest");
File[] files2 = dir.listFiles();//无参
files2 = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
System.out.println(pathname);
if (pathname.getName().endsWith(".txt")){
return true;
}
return false;
}
});
System.out.println(Arrays.toString(files2));
二、IO流相关
1.IO流的四种抽象基类
1、字节输入流:InputStream * int read() 读取下一个字节 * int read(byte[] b) 读取下一批字节。将其存入数组,放回读取的字节数 * int read(byte[] b, int off, int len) 从off开始最多读取len个字节,将其存入数组,返回读 取的字节数 2、字节输出流:OutputStream * void write(int b) 输出指定的字节 * void write(byte[] b) 输出指定的字节数组 * void write(byte[] b, int off, int len) 输出指定的字节数组,从off开始最多输出len个字节 3、字符输入流:Reader * int read() 读取下一个字符 * int read(char[] b) 读取下一批字节。将其存入数组,放回读取的字符数 * int read(char[] b, int off, int len) 从off开始最多读取len个字符,将其存入数组,返回读取的字符数 4、字符输出流:Writer * void write(int b) 输出指定的字符 * void write(char[] b) 输出指定的字符数组 * void write(char[] b, int off, int len) 输出指定的字符数组,从off开始最多输出len个字符 * void write(String str) 输出指定的字符串 * void write(String str, int off, int len) 输出指定的字符串,从off开始最多输出len个字符
* 注意: * 上述四类都是抽象类,不能实例化 * 上述死个类都定义了colse()方法,在使用流之后调用此方法关闭 * 无论是否发生异常、使用流之后都要尝试关闭它,通常在finally中关闭 * 上述四个类都实现了Closeable接口,因此可以在try()中创建流,以便自动关闭
代码如下(示例):
public static void main(String[] args){
//测试字节流拷贝
copyByteFile("E:/filetest/on/1.png","E:/filetest/on/1-copy.png");
copyTextFile("E:/filetest/on/1.txt","E:/filetest/on/1-copy.txt");
}
/**
* 实现文件拷贝方法,本次采用字节流
*/
public static void copyByteFile(String srcFilePath,String destFilePath){//传入来源和目的路径
try(FileInputStream fis = new FileInputStream(srcFilePath);//输入读取
FileOutputStream fos = new FileOutputStream(destFilePath); ){//输出
byte[] bytes = new byte[128];
int len = 0;//实际读取的字节数
//采用循环读取文件
while ((len = fis.read(bytes,0,128)) > 0){//调用输入流的read方法
//读取之后写入目标文件
fos.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
throw new IllegalArgumentException("文件路径不存在");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void copyTextFile(String srcFilePath,String destFilePath){//传入来源和目的路径
try(FileReader fis = new FileReader(srcFilePath);//输入读取
FileWriter fos = new FileWriter(destFilePath); ){//输出
char[] chars = new char[128];
int len = 0;//实际读取的字节数
//采用循环读取文件
while ((len = fis.read(chars,0,128)) > 0){//调用输入流的read方法
//读取之后写入目标文件
fos.write(chars,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2.缓冲流
缓冲流:BufferedInputStream、 BufferedOutputStream、 BufferedReader、 BufferedWriter
1、这四个类都是处理流、需要关联对应的节点流,即实例化时需要传入节点流的实例 2、缓冲流内部维护了一个缓冲区、通过与缓冲区的交互、减少与设备的交互次数 3、使用缓冲流输入流时,他每次会读取到一批数据将缓冲区填满,每次调用读取的方法并不直接从设备中读取,而是从缓冲区取值,当缓冲区为null时候,他将会再一次读取数据,将缓冲区填满 4、使用缓冲输出流时,每次调用写入方法并不是直接写入到设备,而是写入缓冲区,当缓冲区填满时候他会自动刷入设备,也可以调用flush()方法触发刷新(关闭流的时候自动调用它)
代码如下(示例):
public static void main(String[] args){
copyByteFile("E:/filetest/on/1.png","E:/filetest/on/1-copy2.png");
}
public static void copyByteFile(String srcFilePath,String destFilePath){//传入来源和目的路径
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath));//从节点流重读数据
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
) {
byte[] bytes = new byte[128];
int len = 0;
while ((len = bis.read(bytes,0,128)) > 0){//调用输入流的read方法
//读取之后写入目标文件
bos.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3.转换流
转换流:InputStreamReader 、 OutputStreamWriter * 这两个类都是处理流、需要关联相应的节点流、即实例化时候需要传入节点流实例 * Scanner所提供的的输入方法,底层采用的是InputStreamReader实现 * PrintStream所提供的的输出方法,其底层采用的是OutputStreamWriter实现
代码如下(示例):
public static void main(String[] args) {
try(
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader);//提高效率包装为缓冲流
){
String line = null;
while ((line = br.readLine())!= null){//读取一行
if(line.equalsIgnoreCase("exit")){//当键盘输入exit字符之后强制退出
break;
}
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
4.打印流
打印流:PrintStream 、 PrintWriter * 这两个类都是处理流,要关联对应的节点流,即实例化时需要传入节点流实例 * System.out是PrintStream类型 * PrintStream 、 PrintWriter的功能和方法基本相同,后者的设计更合理
代码如下(示例):
public static void main(String[] args) {
printStreamDemo();
printWriterDemo();
}
public static void printStreamDemo(){
try(
FileOutputStream fos = new FileOutputStream("E:/filetest/on/1.txt");//获取节点流
PrintStream ps = new PrintStream(fos);//包装打印流
){
//利用PringStream打印、
ps.println("一直迷路的猿");//将在E:/filetest/on/1.txt文件中输出打印内容
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void printWriterDemo(){
try(
FileWriter fw = new FileWriter("E:/filetest/on/1-copy.txt");
PrintWriter pw = new PrintWriter(fw);
){
pw.println("一直迷路的猿");//将在E:/filetest/on/1-copy.txt文件中输出打印内容
} catch (IOException e) {
e.printStackTrace();
}
}
5.重定向
重定向: * System提供三个重定向的方法 * 1、public static void setIn(InputStream in) * 1、public static void setOutIn(InputStream out) * 1、public static void setErr(InputStream err) * 这些重定向方法用于修改标准输入、标准输出、错误输出的目标设备
代码如下(示例):
public static void main(String[] args) {
rediectOutputDemo();//执行重定向输入时候时将重定向输出注释掉
rediectInputDemo();
}
//重定向输出流到文件
public static void rediectOutputDemo(){
try(
PrintStream ps = new PrintStream(new FileOutputStream("E:/filetest/out.txt"));
){
//改变标准输出流
System.setOut(ps);
System.out.println("一直迷路的猿");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
//重定向输入流,输入源是文件
public static void rediectInputDemo(){
try(
FileInputStream fis = new FileInputStream("E:/filetest/out.txt");
){
System.setIn(fis);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){//如果有进一步输入
System.out.println(scanner.next());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
总结
提示自己IO流使用的相关方法