IO流
File类
File类在java中表示(带路径的)文件或者目录。
File常用属性和方法
file.canread() file.canWrite() file.delete();
创建文件时会抛出检查时异常IOException
File的路径相关
绝对路径: file.getAbsolutePath();
如果file是相对路径,相对路径的当前路径是工程目录(java17)
目录的创建
public static void main(String[] args) {
File file = new File("d:\javatest\c\d\e");
if(!file.exists()) {
boolean r;
try {
// 一次只能创建一个目录
// r = file.mkdir();
r = file.mkdirs();
if(r) {
System.out.println("目录创建成功");
}
} catch (Exception e) {
e.printStackTrace();
}
}
目录的遍历
list():返回一个file表示的目录中的子目录或者文件,字符串数组类型
listFiles():返回一个file表示的目录中的子目录或者文件,File数组类型
public static void main(String[] args) {
// 需求:遍历d:javatest目录
// list()
File file = new File("d:\javatest");
/*
String[] list = file.list();
for (String str : list) {
System.out.print(str);
File f = new File(file.getPath()+"\"+str);
if(f.isDirectory()) {
System.out.println(" 目录");
}else {
System.out.println(" 文件");
}
}*/
// listFiles();
File[] listFiles = file.listFiles();
for (File f : listFiles) {
System.out.print(f.getName());
if(f.isDirectory()) {
System.out.println(" 目录");
}else {
System.out.println(" 文件");
}
}
}
流
流(stream):流是一连串流动的数据(字节、字符),以先进先出的方式发送的信息的通道中
输入流和输出流
输入流
数据从源数据源流入程序的过程称为输入流。可以理解为从源数据源读取数据到程序的过程
输出流
数据从程序流出到目的地的过程称为输出流。可以理解为把数据从程序写入目的地的过程
数据源一般指提供数据的原始媒介,一般常见有文件、数据库、云端、其他硬件等能提供数据的媒介。
流的分类
按照流向分为输入流和输出流
按照处理单元分为字节流和字符流
按照功能分为节点流和转换流。
1.1 InputStream/OutputStream
InputStream 是所有字节输入流的抽象父类,提供了
read 读取一个字节
read(byte[] buf) 读取一定量的字节到缓冲区数组 buf中。
OutputStream 是所有字节输出流的抽象父类,提供了
write() 写入一个字节
write(byte[] buf) 写入一定量的字节到输出流
FileInputStream 文件字节输入流,专门用于从文件中读取字节到程序内存中。
FileOutputStream 文件字节输出流,专门用于从内存中写入字节到文件中。
FileInputStream:
步骤:
[a]:创建管道
FileInputStream in = new FileInputStream(file);
【b】:从管道读取一个字节
用read方法;
【c】; 关闭流管道
in.close();
FileOutpurStream:
步骤:
[a]:创建管道
FileOutputStream in = new FileOutputStream(file);
【b】:从管道写一个字节
用write方法;
【c】; 关闭流管道
in.close();
Reader/Writer
Reader 是字符输入流的抽象父类,提供了
read 一次读取一个字符
read(char[] cbuf) 一次读取多个字符到字符缓冲区cbuf,返回长度表示读取的字符个数。
Writer 是字符输出流的抽象父类,提供了
write
write(char[] cbuf)
write(string)
FileReader 文件字符输入流,专门用于读取默认字符编码文本性文件。
FileWriter 文件字符输出流,专门用于写入默认字符编码的文本性文件。为了提高效率,FileWriter内部存在一个字节缓冲区,用于对待写入的字符进行统一编码到字节缓冲区,一定要在关闭流之前,调用flush方法刷新缓冲区。
转换流
InputStreamReader 继承于Reader,是字节流通向字符流的桥梁,可以把字节流按照指定编码 解码 成字符流。
OutputStreamWriter 继承于Writer,是字符流通向字节流的桥梁,可以把字符流按照指定的编码 编码 成字节流。
[1]win平台默认的utf8编码的文本性文件带有BOM,java转换流写入的utf8文件不带BOM。所以用java读取手动创建的utf8文件会出现一点乱码(?hello中国,?是bom导致的)
[2]用字符集编码,一定用字符集解码!!
1.1 BufferedReader/BufferedWriter
BufferedReader 继承于Reader,提供了
read
read(char[] cbuf)
readLine() 用于读取一行文本,实现对文本的高效读取。
BufferedReader 初始化时需要一个reader,本质上BufferedReader在reader的基础上增加readLine()的功能。
BufferedWriter继承于Writer,提供了
write
write(char[] cbuf)
write(string)
newline() 写入一个行分隔符。