File
File是一个类,File类是用于描述文件或文件夹,由JDK提供。
所以使用时只需要创建对象,用其方法
File的构造函数
1.
File(String pathname)
参数:文件或文件夹所在位置
如:File file = new File("E:\\work");
表示E盘下,work文件夹下
2
File(URI uri)
参数:文件或文件夹所在位置
URI:统一资源标识符
URL:统一资源定位符
如:
URI uri = URI.create("E:\\work");
File file2 = new File(uri);
表示E盘下的work文件夹
3.
File(String parent, String child)
参数:String parent:上级文件夹路径
String child:目标的文件或文件夹
如:File file3 = new File("E:","work");
表示E盘下的work文件夹
4.
File(File parent, String child)
参数: File parent:上级文件夹
String child:目标文件夹或文件夹
例:
File file = new File("E:\\work");
File file4 = new File(file, "新建文件夹.txt");
表示:表示E盘下的work文件夹中的 新建文件夹.txt文件
注意:参数中文件夹的位置可用相对路径也可以用绝对路径
相对路径:相对于当前项目根目录的位置
绝对路径:从盘符开始写
File的属性
public static final String separator = "" + separatorChar;
separator此属性用于获取当前操作系统的路径分隔符
如:
System.out.println(File.separator);
代码里的有两个\\,是编译器自己给加上的一个,用于区分
实际上真的可以这样写,不过没必要
File file = new File("E:"+File.separator+"work");
File的常用方法
1.createNewFile() 创建文件
File file = new File("E:\\work\\test1.txt");//创个绝对路径
File file1 = new File("test2.txt");//创个相对路径
file.createNewFile();
file1.createNewFile();
2.mkdir() 创建一级文件夹
File file = new File("E:\\work\\新建1");
file.mkdir();
File file2 = new File("新建2");
file2.mkdir();
注意:文件夹与文件不可重名
3.mkdirs() 创建多级文件夹
File file = new File("E:\\work\\01\\02\\03");
file.mkdirs();
4.delete() 删除文件或空文件夹
File file = new File("E:\\work\\新建1");
file.delete();
5.exists() 判断文件或文件夹是否存在返回值为boolean
File file = new File("E:\\work\\新建1");
file.mkdir();//创建
System.out.println(file.exists());
file.delete();//删除
System.out.println(file.exists());
6.length() 获取文件或文件夹字节数
File file2 = new File("E:\\work\\01");
File file3 = new File("E:\\work\\新建文本文档.txt");
System.out.println(file2.length());
System.out.println(file3.length());
给文件里写个数字,就有的变化
文件的字节数是文件中内容的大小 文件夹字节数为0
7.getAbsolutePath() 获取文件或文件夹的绝对路径,返回值为String
System.out.println(file2.getAbsolutePath());
8.getAbsoluteFile() 获取文件或文件夹的绝对路径,返回值为file型
file.getAbsoluteFile();
9.getName() 获取文件或文件夹名称
file.getName();//返回值为String
10.getParent() 获取当前文件的上级文件夹路径
file.getParent();//返回值String
11.isFile() 判断file对象对应的是否为文件
file.isFile();
12.isDirectory() 判断file对象对应的是否为文件夹
file.isDirectory();
13.listFiles() 获取当前文件夹下所有的文件与文件夹(不包含子级文件与文件夹)
例:
File file = new File("E:\\work");
File[] files= file.listFiles();//获取目录下的所有文件文件夹
for (File f : files) {遍历
System.out.println(f.getAbsolutePath());获取其绝对路径
}
注意,此方法读取不到文件夹子目录的东西
练一练:写一个方法能读取文件夹下的所有的文件
public class Read {
public static void main(String[] args) {
File file = new File("E:\\javanew");
read(file);
}
public static void read(File file) {//传入所遍历的文件夹
if(file.isDirectory()) {//如果是文件夹
File[] files=file.listFiles();//获取其所有文件夹与文件
for (File f : files) {//
System.out.println(f.getAbsolutePath());//遍历它并打印
read(f);//自己调自己
}
}else {//如果是文件
System.out.println(file.getAbsolutePath());//直接打印
}
}
}
找一下java文件
public static void read(File file) {//传入所遍历的文件夹
if(file.isDirectory()) {//如果是文件夹
File[] files=file.listFiles();//获取其内部所有文件夹与文件
for (File f : files) {
read(f);//自己调自己
}
}else {//java肯定是文件
if(file.getAbsolutePath().endsWith(".java")) {//使用下String方法,是否.java结尾
System.out.println(file.getAbsolutePath());//直接打印
}
}
}
过滤器
下边两个就是过滤器,没有参数就是全拿,有参数就是过滤一下
FileFilter:文件过滤器,需要重写accept方法,每获取一个文件都会调用一下此方法
public class Guolu {
public static void main(String[] args) {
File file = new File("E:\\javanew");
File[] listFiles1 = file.listFiles(new FileFilter() {
//比如我想要文件,不要文件夹
@Override
public boolean accept(File pathname) {//会把所有文件都拿出来,同样不能访问子文件夹
if(pathname.isFile()) { //是否为文件
return true;
}//此处就是自己定义过滤方法的,不要的返回thrue
return false;//要的返回false就行
}
} );
//这样listFilses1拥有的就是过滤后的东西
}
}
FilenameFilter:文件名称过滤器
例如:
参数:
File dir:构造方法给出的被遍历的目录
String name:使用listFiles方法遍历目录获取的每一个文件/文件夹的名称
File[] listFiles2 = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".java")) {//String name得到的是文件名
return false;//使用名称过滤
}
return true;
}
});
I/O流
作用:将程序中的数据输出到控制台,文件,网络
将其它地方的内容输入到程序中,总体来书就是传输数据
分类:
流向分类:
输入流:给程序中输入数据
输出流:将程序中的数据输出到其它地方
按传输数据的最小单位分类:
字节流:可传输的最小单位为字节(byte),可传输任意一种数据
字符流:传输的最小单位字符(char),只能传递文本类文件,如文本文档:txt.word
按功能:
节点流:将数据直接读取或写入
过滤流:在节点流基础上增加功能
字节流
体系:
InputStream:输入字节流的定级接口
FileInputStream:文件输入流
BufferedInputStream:字节缓存流(输入)
ByteArrayInputStream:内存流(输入流)
ObjectInputStream:对象流(输入流)
OutputStream:输出字节流的顶级接口
FileOutputStream:文件输出流
BufferedOutputStream:字节缓冲流(输出流)
ByteArrayOutputStream:内存流(输出流)
ObjectOutputStream:对象流(输出流)
InputStream提供的方法
1字节(byte)=8位(bit) 1024字节=1K 1024k=1M
在txt文本中 字母占 1bit 汉字占 2bit
1.int read()
作用:一次最多读取一个字节,返回值就是读取到的数据,如果没有读取到数据返回-1
File f1=new File("a.txt");
f1.createNewFile();//相对路径创一个文件
FileInputStream fis = new FileInputStream("a.txt");//
int data01 = fis.read();//读取
System.out.println(data01);//
int data02 = fis.read();//读取
System.out.println(data02);//
int data03 = fis.read();//读取
System.out.println(data03);//
int data04 = fis.read();//读取
System.out.println(data04);//
一次只读一个
2.int read(byte b[])
作用:一次读取一组字节到数组b中,最多一次可以读b数组长度个字节,返回值为读取到的字节长度,值 为-1表示结束
byte[] b = new byte[10];
int len = fis.read(b);
System.out.println(len);
for (byte c : b) {
System.out.println(c);
}
3.int read(byte b[], int off, int len)
作用:一次读取一组字节到数组b中,最多可以读取len个长度的字节返回值为读取到的字节长度,值为-1 表示结束,off本次读取的字节数据在数组b中存储开始的下标
4.void close()
作用:关流
多个流先关输出在关输入
fis.close();
例:将文件读入程序中
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("E:\\Javanew\\week2\\src\\io\\Test2.java");//将这个代码读到控制台中
byte[] b=new byte[1024];//存储读取数据的数组
int len = 0;//记录本次数据长度,fis.read(b)的返回值,没读取到就为-1了
while ((len=fis.read(b))!=-1) {
String Str =new String(b,0,len);//最后一次读取,数据不一定和数组长度一致
//则会把上一轮数组的数据取出来。而0为开始长度,len为结束长度,可排除脏数据
System.out.println(Str);
}
fis.close();
}
}
OutputStream提供的方法
1.void write(int b)
作用:一次输出一字节
FileOutputStream fos = new FileOutputStream("b.txt");//没有就自己创建一个
//fos.write (97);用这个得传入Acssll码值
2.void write(byte b[])
作用:将b中的字节一次输出
FileOutputStream fos = new FileOutputStream("b.txt");//没有就自己创建一个
//fos.write (97);用这个得传入Acssll码值
byte[]b="你好,世界".getBytes();//将字符串转为byte数组
fos.write(b);
fos.flush();
fos.close();
3.void write(byte b[], int off, int len)
作用:将b中字节从off位置开始输出len个
FileOutputStream fos = new FileOutputStream("b.txt");//没有就自己创建一个
byte[]b="你好,世界".getBytes();//将字符串转为byte数组
fos.write(b,0,6);
fos.flush();
fos.close();
4.void flush()
作用:冲刷
5.void close()
作用:关流
如果不关流,程序不关,则此文件一直再被操作,此对象一直持有文件的引用,会浪费内存。
文件字节流
FileInputStream
作用:将指定的文件中的数据读取到程序中
构造函数:
1. FileInputStream(String name)
参数: name:指定的文件路径
FileInputStream fis = new FileInputStream("c.txt");
2. FileInputStream(File file)
参数: file:指定的文件
File file = new File("d.txt");
FileInputStream fis1 = new FileInputStream(file);
FileOutputStream
作用:将程序中的数据传递到指定的文件中
构造函数:
FileOutputStream(File file)
参数:
file:指定的文件
FileOutputStream(String name)
参数:
name:指定的文件路径
FileOutputStream(File file,boolean append)
参数:
file:指定的文件
append:是否追加,默认值为false
FileOutputStream(String name,boolean append)
参数:
name:指定的文件路径
append:是否追加,默认值为false
注意:
append为false时,如果指定文件不存在,则新建一级文件夹,
如果文件存在,那么删除原有文 件后,重新创建
append为true时,
如果指定文件不存在,则新建一级文件夹,
如果文件存在,在原有文件尾部写 入新内容
FileOutputStream fis = new FileOutputStream("b.txt");//创建一个,
byte[] b = "为世界上所有的美好而战".getBytes();//将字符转为byte数组
fis.write(b);//写入
fis.flush();//冲刷
fis.close();//关闭
File file = new File("b.txt");//读取此文件
FileInputStream fis1 = new FileInputStream(file);
byte[] c = new byte[1024];//创建存储的byte数组
int len = 0;//读取的长度
while((len=fis1.read(c))!=-1){
String str=new String(c,0,len);
sout(str)
}
fis1.close();
System.out.println(len);
System.out.println(new String(c)); //将byte数组转为字符串,打印到操作台上