文章目录
- 前言
- File类
- IO字符流与字节流
- 字符流
- 字节流
- 打印流
- 缓冲流
前言
File类
是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
方法有三类:1获取、2判断、3创建或删除
public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。
public long length() :返回由此File表示的文件的长度。
public boolean exists()
:此File表示的文件或目录是否实际存在。public boolean isDirectory()
:此File表示的是否为目录。public boolean isFile()
:此File表示的是否为文件。
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
public static void main(String[] args) throws Exception {
String pathSeparator = File.pathSeparator; //路径分隔符
String separator = File.separator;//文件名分隔符
System.out.println(pathSeparator +"文件名分隔符"+separator);
File f = new File("D:\\Work\\aaa.txt");
//System.out.println(f.getAbsolutePath());
System.out.println(f.exists());//exists()` :此File表示的文件或目录是否实际存在
System.out.println(f.isDirectory());//此File表示的是否为目录。
System.out.println(f.isFile());//此File表示的是否为文件。
System.out.println("----------------1---------------------------");
File f2 = new File("newDir");
System.out.println(f2.exists());//此File表示的文件或目录是否实际存在
System.out.println(f2.mkdir());//创建由此File表示的目录
System.out.println(f2.exists());//此File表示的文件或目录是否实际存在
System.out.println(f2.getAbsolutePath());
System.out.println("---------------2----------------------------");
System.out.println(f2.delete());
File f3 = new File("newDir\\newDirb");
System.out.println(f3.mkdirs());
}
输出:
;文件名分隔符\
false
false
false
----------------1---------------------------
true
false
true
E:\ENV20\20220905\newDir
---------------2----------------------------
false
false
IO字符流与字节流
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流 InputStream | 字节输出流 OutputStream |
字符流 | 字符输入流 Reader | 字符输出流 Writer |
字符流
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
输出流
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("fw.txt"); //创建输出流对象
fw.write(98); //98对应字符'b'
fw.write("b");
fw.write("c");
fw.write(30000); //30000对应中文编码表里的汉字:田
fw.flush(); //刷新缓冲区,流对象继续使用
// fw.close();//刷新缓冲区,流对象不能继续使用 ,资源释放了
}
运行后,右键项目选择【Properties】,然后选择该文件的路径
点进去就可以看到生成的【fw.txt】,输出:bbc田
输入流
// 输入流,需要在文件路径下先建文件(这里建的是fr.txt)写东西
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("fr.txt"); //创建字符输入流对象
int b;//b用来保存数据
while((b=fr.read()) != -1) {
//如果读到数据,那么就向下读 fr.read()每次可以读取一个字符的数据,读到文件末尾返回-1
System.out.print((char)b); //如果直接输出b则以int型输出
}
fr.close();
}
字节流
public static void main(String[] args) throws IOException{
DataInputStream in = new DataInputStream(new FileInputStream("fr.txt"));
BufferedReader d = new BufferedReader(new InputStreamReader(in));//逐行读取,br extends reader
// String count;
// while((count = d.readLine()) != null) {
// System.out.println(count);
// }
DataOutputStream out = new DataOutputStream(new FileOutputStream("test1.txt"));
String count;
while((count = d.readLine()) != null) {
out.writeBytes(count+",");
}
d.close();
out.close();
}
打印流
平时我们在控制台打印输出,是调用 print方法 和 println方法完成的,这两个方法都来自于 java.io.PrintStream类,该类能够方便地打印任意类型的值。
public static void main(String[] args) throws IOException{
System.out.println(97); //正常参数类型为字符串型,如果没加引号,也是以打印流形式直接输出了
PrintStream ps = new PrintStream("ps.txt"); //实例化打印流对象,输出到ps.txt文件里
ps.write(99); //输出99对应的Ascii
System.setOut(ps);//调用系统的打印流,改变输出语句的目的地址,保存在ps.txt文件里
}
缓冲流
能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。
这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。
例:将括号内的文本信息恢复顺序
【5.半卷红旗临易水,7.报君黄金台上意,3.角声满天秋色里,1.黑云压城城欲摧,8.提携玉龙为君死!4.塞上燕脂凝夜紫。2.甲光向日金鳞开。6.霜重鼓寒声不起。】
1.使用HashMap
2.逐行读信息
3.读完之后把读到的信息放到HashMap
4.通过循环按顺序输出
首先在项目路径下新建一个txt文件,这里起名(ps.txt),然后把要恢复的内容放进去
public static void main(String[] args) throws IOException {
// 创建map集合,保存文本数据,键为序号,值为文字
/* 1.使用HashMap * */
HashMap<String, String> lineMap = new HashMap<>();
// 创建流对象
BufferedReader br = new BufferedReader(new FileReader("ps.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("fos.txt"));
// 读取数据 2.逐行读信息
String line = null;
while ((line = br.readLine()) != null) {
// 解析文本
String[] split = line.split("\\.");
// 保存到集合
// 3.读完之后把读到的信息放到HashMap
lineMap.put(split[0], split[1]);
}
// 释放资源
br.close();
// 遍历map集合 4.通过循环按顺序输出
for (int i = 1; i <= lineMap.size(); i++) {
String key = String.valueOf(i);
// 获取map中文本
String value = lineMap.get(key);
// 写出拼接文本
bw.write(key + "." + value);
// 写出换行
bw.newLine();
}
// 释放资源
bw.close();
}
这种写法就是在项目路径下生成了 fos.txt ,里面内容则是恢复顺序后的文本信息