目录
PrintStream打印流 、InputStream输入流
File类
File:文件和目录路径名的抽象表示形式。
File类和四大家族没有关系,所以File类不能完成文件的读和写。
FIle对象代表什么?文件和目录路径名的抽象表示形式。
File有可能调用的是目录,也有可能是文件
File只是一个路径名的抽象表示形式
需要掌握File类中常用的方法
File类常用方法
相对路径:junit测试方法下 :当前模块的根目录。main方法下 : 当前工程Project的根目录。
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
获取文件和目录基本信息的方法 | |
String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
String | getPath() //相对路径 将此抽象路径名转换为一个路径名字符串。 |
long | length() //文件字节数 返回由此抽象路径名表示的文件的大小。 |
long | lastModified() //毫秒值 返回此抽象路径名表示的文件最后一次被修改的时间。 |
各种路径问题 | |
String | getPath() //相对路径 将此抽象路径名转换为一个路径名字符串。 |
String | getAbsolutePath() //绝对路径 返回此抽象路径名的绝对路径名字符串。 |
File | getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。 |
String | getCanonicalPath() //可以识别../形式的路径 返回此抽象路径名的规范路径名字符串。 |
判断功能方法 | |
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否是一个文件。 |
创建删除功能的方法 | |
boolean | createNewFile() //返回true创建成功 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
boolean | mkdir() //创造单级目录 创建此抽象路径名指定的目录。 |
boolean | mkdirs() //创造多级目录 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
boolean | delete() //返回true删除成功,不能删除非空目录 删除此抽象路径名表示的文件或目录。 |
目录相关操作 | |
String[] | list() //当前目录下文件列表 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
File[] |
|
不常用↓ | |
static File | createTempFile(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
static File | createTempFile(String prefix, String suffix, File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
File | getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null 。 |
boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
long | lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 |
boolean | renameTo(File dest) 重新命名此抽象路径名表示的文件。 |
- 代码测试
//创建一个File对象
File f1 = new File("E:\\file");
//判断是否存在
System.out.println(f1.exists()); //false
//如果E:\file不存在,则以文件形式创建
/*if(!(f1.exists())){
f1.createNewFile();
}*/
//如果E:\file不存在,则以目录形式创建
if(!(f1.exists())){
f1.mkdir();
}
//可以创建多重目录吗?
//f1.mkdirs();
File f2 = new File("E:\\JavaSE\\IOfile\\temp");
//获取文件父路径
String parentPath = f2.getParent();
System.out.println(parentPath); //E:\JavaSE\IOfile
//获取绝对路径
File f3 = new File("E:\\JavaSE\\IOfile\\temp");
System.out.println("绝对路径:"+f3.getAbsolutePath()); //E:\JavaSE\IOfile\temp
File f1 = new File("E:\\JavaSE\\IOfile\\temp");
//获取文件名
System.out.println("文件名"+f1.getName()); //temp
//判断是否是一个目录
System.out.println(f1.isDirectory()); //fale
//判断是否是一个文件
System.out.println(f1.isFile()); //true
//获取文件最后一次修改时间 //从1970年到现在的总毫秒
long haoMiao = f1.lastModified();
//将总毫秒数转换成日期
Date time = new Date(haoMiao);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
System.out.println(sdf.format(time)); //2022-01-09 14:56:06 817
//获取文件大小
System.out.println(f1.length()); //6字节
//File[] listFiles()
//获取当前目录下所有的子文件。
File f = new File("E:\\JavaSE\\IOfile");
File[] files = f.listFiles();
//foreach
for(File file : files){
//可不使用getAbsolutePath()方法获取路径,FIle重写了toString
System.out.println(file);
System.out.println(file.getName());
}
数据流(DataOutputStream)(了解)
注意:读取时要按照存入顺序
- 数据流专属:
- java.io.DataInputStream
- java.io.DataOutputStream
- 标准输出流:
- java.io.PrintWriter
- java.io.PrintStream (掌握)
- 对象专属流:
- java.io.ObjectInputStream(掌握)
- java.io.ObjectOutputStream(掌握)
几乎不用DataOutputStream
DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流。 |
public static void main(String[] args) throws Exception{
//创建数据专属的字节输出流
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data"));
//写数据
byte b = 100;
int i = 300;
double d = 3.14;
boolean sex = false;
char c = 'a';
//写 把数据以及数据类型一并写入到文件当中
dos.writeByte(b);
dos.writeInt(i);
dos.writeDouble(d);
dos.writeBoolean(sex);
dos.writeChar(c);
//刷新
dos.flush();
//关闭最外层
dos.close();
}
- DataInputStream
DataInputStream(InputStream in) 使用指定的底层 InputStream 创建一个 DataInputStream。 |
/*
DataInputStreamTest 数据字节输入流
DataOutputStreamTest写的文件,只能使用DataInputStreamTest去读,并且读是时候需要知道写入时的顺序
读的顺序需要和写的顺序一致,才可以正常读出数据
*/
DataInputStream dis = new DataInputStream(new FileInputStream("IOfile\\dataTest"));
//开始读
byte b = dis.readByte();
int i = dis.readInt();
double d = dis.readDouble();
boolean sex = dis.readBoolean();
char c = dis.readChar();
System.out.println(b); //100
System.out.println(i); //300
System.out.println(d); //3.14
PrintStream打印流 、InputStream输入流
打印流只能输出,没有输入
PrintStream下方法
void | print(String s) 打印字符串。 |
PrintStream | printf(Locale l, String format, Object... args) 使用指定格式字符串和参数将格式化的字符串写入此输出流的便捷方法。 |
PrintStream | printf(String format, Object... args) 使用指定格式字符串和参数将格式化的字符串写入此输出流的便捷方法。 |
void | println() 通过写入行分隔符字符串终止当前行。 |
InputStream下方法
abstract int | read() 从输入流中读取数据的下一个字节。 |
int | read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 |
int | read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。 |
System.out | in (标准输出输入流)
InputStream is = System.in 标准输入流:从键盘读取数据
PrintStream ps = System.out 标准输出流
System.in 标准输入流 :从键盘读入数据 本质是一个字节打印流,输出数据到控制台
System.out 标准输出流 :输出到控制台(Scanner 底层) 本质是一个字节流,读入键盘录入的数据
System.err 标准错误输出流
PrintStream(OutputStream out) 创建新的打印流。 |
PrintStream(String fileName) 创建具有指定文件名称且不带自动行刷新的新打印流。 |
System下方法
static void | setIn(InputStream in) 重新分配“标准”输入流。 |
static void | setOut(PrintStream out) 重新分配“标准”输出流。 |
public static void main(String[] args) throws Exception{
//联合起来写
System.out.println("Hello world!");
//分开写
PrintStream ps = System.out;
ps.println("Hello zhangSan");
ps.println("Hello liSi");
//标准输出流不需要关闭
//可以改变标准输出流的输出方向吗? 可以
//标注输出流不再指向控制台,指向log文件
PrintStream printStream= new PrintStream("IOfile\\printStream");
//修改输出方向,将输出方向修改到"log"文件。
System.setOut(printStream);
//再输出 输出到了文件内 控制台不会显示
System.out.println("测试程序");
/*System.gc(); 之前用过的System类使用过的方法和属性。
System.currentTimeMillis();
PrintStream ps2 = System.out;
System.exit(0);
System.arraycopy(..)*/
}
日志工具实现:
/*
日志工具
*/
public class Logger {
public static void main(String[] args) {
//测试工具类是否好用
log("用户尝试进行登录,验证失败。");
log("尝试调用xx,失败");
}
//记录日志的方法
public static void log(String msg) {
try {
//指向一个日志文件
PrintStream out = new PrintStream(new FileOutputStream("log.txt",true));
//改变输出方向
System.setOut(out);
//日期当前时间
Date nowTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String strTime = sdf.format(nowTime);
System.out.println(strTime + ":"+msg);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
log.txt内容
2022-01-10 03:53:58 295:用户尝试进行登录,验证失败。
2022-01-10 03:53:58 332:尝试调用xx,失败
2022-01-10 03:54:18 161:用户尝试进行登录,验证失败。
2022-01-10 03:54:18 200:尝试调用xx,失败
- Scanner 实现
public static void main(String[] args) throws IOException {
//标准输入流:从键盘读取数据
InputStream is = System.in;
//需求:从键盘一次读取一行字符串
BufferedReader br=new BufferedReader(new InputStreamReader(is));
System.out.println("请输入数据:");
String line = br.readLine();
System.out.println("line = " + line);
}
-
JDK7之后的try...catch语句
解决 关闭流 代码 繁杂问题
自动释放资源
try(需要关闭的资源对象的声明){
业务逻辑代码,可能发生异常的代码
}catch(异常类型 e){
处理异常代码
}catch(异常类型 e){
处理异常代码
}