I/O是input/output的简称,表示输入输出,常用于软件系统跟显示设备,文件系统,控制台,网络系统之间的数据流控制。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
File类
File类是用来处理文件和文件夹的API,它可以表示一个文件,也可以表示文件夹。
文件夹属性:
public static void main(String[] args){
String path = "C:/Users/DG02/Desktop/接口重构";
File file = new File(path);
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否是文件夹:"+file.isDirectory());
System.out.println("是否是文件:"+file.isFile());
}
文件(夹)操作:
String dirname = "C:/Users/DG02/Desktop/接口重构/test";
File file1 = new File(dirname);
System.out.println("file1是否是文件夹"+file1.isDirectory());
file1.mkdir();//在已知路径下创建文件
System.out.println("file1是否是文件夹"+file1.isDirectory());
//file1.mkdirs();//可以在不存在的路径下创建文件
String filename = "C:/Users/DG02/Desktop/接口重构/test/test.text";
File file2 = new File(filename);
System.out.println("file2是否是文件"+file2.isFile());
file2.createNewFile();
System.out.println("file2是否是文件"+file2.isFile());
file2.delete();
System.out.println("file2是否是文件"+file2.isFile());
file1.delete();
System.out.println("file1是否是文件夹"+file1.isDirectory());
mkdir():创建已知路径的文件夹
mkdirs():创建不存在路径的文件夹,比如上面代码接口重构这个文件夹不存在。会先创建这个文件,然后再在这下面创建test文件
createNewFile():创建文件
delete():删除文件、文件夹
遍历文件:
遍历文件夹下所有文件名
String filepath = "C:/Users/DG02/Desktop/接口重构/jdk api 1.8_google";
File file4 = new File(filepath);
String[] filenames =file4.list();
for (String i:filenames){
System.out.println(i);
}
遍历文件下所有文件对象
//遍历文件夹下所有文件对象
File[] files = file4.listFiles();
for (File f :files){
System.out.println(f.isFile());
}
根据文件后缀过滤文件
for (File f: files){
if(f.getName().endsWith(".txt")){
System.out.println(f.getName());
}
}
getName():获取文件名
endWith():判断文件后缀名
过滤文件更加优雅的方式:
在listFiles方法里面传入一个FilenameFilter接口实现类对象,这个对象需要我们自己实现
public class JavaFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".txt")){
return true;
}
return false;
}
}
File[] files2 = file4.listFiles(new JavaFilenameFilter());
会根据实现类中设置的文件后缀名进行过滤。将true的文件添加到数组。
读写文件
一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
InputStream
是表示从某些数据源中读取数据时产生的一个流对象,流对象产生后,我们就开启了数据读取的通道。
InputStream下常用的有FileInputStream子类,可以帮助我们以字节为单位读取文件
常用方法,
close():关闭文件输入流
read(int r):根据输入流下一字节,返回对应的0-255的整数。该方法是一个个字节读取的。速度较慢
read(byte[] r):从输入流读取r.lenght长度的字节,返回读入数组缓冲区的总字节数。如果是文件结尾则返回-1
public static void main(String[] args){
try{
//被读取文件的路径
String filepath = "C:/Users/DG02/Desktop/test.txt";
//创建文件对象
File file = new File(filepath);
//创建文件流对象
InputStream in = new FileInputStream(file);
//创建接收字节的数组
//数组的长度决定了流对象能接收多少内容,所以创建一个和文件内容长度相同的数组
byte[] bytes = new byte[(int)file.length()];
//返回读取内容长度
int length = in.read(bytes);
while (length!=-1){
String s = new String(bytes,0,length);
length = in.read(bytes);
System.out.println(s);
}
//关闭流对象
in.close();
}catch (IOException e){
e.printStackTrace();
}
}
读取中文会乱码。
OutputStream
表示为某个文件(或其他数据源)输出数据的一个流对象。流对象产生后,我们就开启了写数据的通道。
OutputStream下常用的实现类是FileOutputStream,可以帮助我们输出内容(写文件)
close():关闭输出流
write(byte[] b):将b的内容写入
public static void main(String[] args) throws IOException {
//写入文件的路径,不在则新建
String filepath = "C:/Users/DG02/Desktop/test.txt";
//创建文件对象
File file = new File(filepath);
//创建输出流文件对象
OutputStream op = new FileOutputStream(file);
//创建字节数组保存要写入的字节内容
String content = "测试一下";
byte[] bytes = content.getBytes();
//写入
op.write(bytes);
op.close();
}
Writer与Reader
Writerde和Reader支持Unico字符,面向字符(非字节)的数据读取和写入API
Writer 和Reader下的FileWriter和FileReader 常用于处理文件。
对于Writer首先我们仍然要用File来表示文件,然后把文件对象传给输出对象(写对象),通过写对象来输出内容到文件。
public static void main(String[] args) throws IOException {
//写入文件的路径,不在则新建
String filepath = "C:/Users/DG02/Desktop/test.txt";
//创建文件对象
File file = new File(filepath);
FileWriter fw = new FileWriter(file);
fw.write("我使用了FileWrite");
fw.close();
}
对于Reader首先我们仍然要用File来表示文件,然后把文件对象传给输入对象(读对象),然后把内容读取到字符数组,最后把字符数组转化为字符串
public static void main(String[] args) throws IOException {
//写入文件的路径,不在则新建
String filepath = "C:/Users/DG02/Desktop/test.txt";
//创建文件对象
File file = new File(filepath);
//创建读取字符流对象
FileReader fr = new FileReader(file);
//创建字符数组,接收字符内容,需要根据文件内容长度创建
char[] cbuf = new char[(char)file.length()];
//读取了多少字符
int len = fr.read(cbuf);
System.out.println(new String(cbuf,0,len));
fr.close();
}
BufferedWriter与BufferedReader
BufferedWriter和BufferedReader可以通过缓冲的方式来实现高效的写和读,
对于writer,我们可以使用BufferedWriter来包装
public static void main(String[] args) throws IOException {
//写入文件的路径,不在则新建
String filepath = "C:/Users/DG02/Desktop/test.txt";
//创建文件对象
File file = new File(filepath);
FileWriter fw = new FileWriter(file);
BufferedWriter out = new BufferedWriter(fw);
out.write("Heelo world");
out.newLine();
out.write("next");
out.close();
}
对于Reader,我们可以使用BufferedReader来包装
public static void main(String[] args) throws IOException {
//写入文件的路径,不在则新建
String filepath = "C:/Users/DG02/Desktop/test.txt";
//创建文件对象
File file = new File(filepath);
FileReader fw = new FileReader(file);
BufferedReader in = new BufferedReader(fw);
String line = in.readLine();
while (line != null){
System.out.println(line);
//一定要加,不然会一直遍历下去
line = in.readLine();
}
in.close();
}