一、IO基本分类
1、IO基本分类:(input and output stream)
1.字节流:byte[];没有缓冲区;
抽象基类:InputStream,OutputStream;
2.字符流:char[];有缓冲区;//读取文档使用,可以防止中文乱码;
抽象基类:Reader,Writer;
2、资源释放:jdk1.8新特性;
try(){}:小括号内写需要释放资源的代码,会自动释放;
//无需把close()写在finally代码块中;
二、File:
1、File类:用于文件管理;位于java.io包;
2、构造方法:File(String pathname);//File file=new File("c:/");
3、常用方法:
1.权限控制:
(1)boolean canExecute();查看是否有执行权;
(2)boolean canRead();查看是否有读取权;
(3)boolean canWrite();查看是否有读取权;
public classTest {public static voidmain(String[] args) {
File file= new File("e:/test");
System.out.println(file.canExecute());
System.out.println(file.canRead());
System.out.println(file.canWrite());
}
}
2.文件方法:
创建(1)boolean createNewFile();创建一个文件;
//返回值:如果创建成功返回true,如果已经存在创建不成功返回false,不会覆盖原有文件;
//文件必须包含文件名和扩展名;
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("e:/test.txt");boolean newFile1 =file.createNewFile();boolean newFile2 =file.createNewFile();
System.out.println(newFile1);//true
System.out.println(newFile2); //false
}
}
判断(2)boolean exists();判断目录或文件是否存在;
判断(3)boolean isFile();判断是否是标准文件;
判断(4)boolean isHidden();判断是否是隐藏文件;
删除(5)boolean delete();删除目录或文件;//返回值;删除成功返回true,失败返回false;
删除(6)void deleteOnExit();关闭jvm时删除文件;
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("e:/test.txt");
System.out.println(file.exists());//false
file.createNewFile();
System.out.println(file.exists());//true
System.out.println(file.isFile()); //true
System.out.println(file.isHidden()); //false
file.exists();
}
}
3.目录方法:
查询(1)String getName();返回目录或文件名;
查询(2)String getParent();返回文件的目录,不包含文件本身的名称;无可返回的值,返回null;
查询(3)String getPath();返回文件的目录,包含文件本身的名称;无可返回的值,返回null;
查询(4)String toString();返回文件的目录,包含文件本身的名称;
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("e:/test/test.txt");
System.out.println(file.getParent());//e:\test
System.out.println(file.getPath()); //e:\test\test.txt
System.out.println(file.toString()); //e:\test\test.txt
}
}
判断(5)boolean isDirectory();判断是否是一个目录;
获取(6)File[] listFiles();返回目录下所有的目录和文件的完整路径名的File数组;
获取(7)String[] list();返回目录下所有的目录和文件的本身名称的File数组;
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("e:/logs");
File[] files=file.listFiles();
System.out.println(Arrays.toString(files));//[e:\logs\dev, e:\logs\prod, e:\logs\sprintboot_2019-0722.log, e:\logs\test]
String[] list =file.list();
System.out.println(Arrays.toString(list));//[dev, prod, sprintboot_2019-0722.log, test]
}
}
获取(8)String[] list(FilenameFilter filter);返回
//传入一个匿名内部类;new FilenameFilter(){重写accpet方法}
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("e:/logs");
String[] list= file.list(newFilenameFilter(){
@Overridepublic booleanaccept(File dir, String name) {return name.endsWith(".log");
}
});
System.out.println(Arrays.toString(list));
}
}
创建(9)boolean mkdir();根据指定的File对象创建一个目录,不支持级联构建;
创建(10)boolean mkdirs();根据指定的File对象创建一个目录,支持级联构建;
三、Reader:所有字符流输入流的基类;不可创建对象;
1、抽象方法:
(1)int read();一次读取流中的一个字符,且会自动往下;
(2)int read(char[] arr);将字符读入数组;
//返回值为读出的个数,且重复调用会向后读(每次重复调用指针回0),如果没有读出返回-1;
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("e:/test.txt");
FileReader fileReader= newFileReader(file);char[] arr = new char[1024];int num = 0;while ((num = fileReader.read(arr))!=-1){
System.out.println(new String(arr,0,num));
}
fileReader.close();
}
}
(2).close();关闭此流,不会刷新;
2、FileReader:Read的操作文件子类;
构造方法:FileReader(String fileName);
//FileReader fw=new FileReader("demo.txt");
3、BufferedReader:Rreader的子类,用于提升效率;
(1)构造方法:BufferedReader(Reader in[, int sz]);
(2)特有方法:String readLine();读取一行,不返回回车符;读取到空行时,返回null;
4、LineNumberReader:BufferedWriter的子类;
(1)构造方法:LineNumberReader(Reader in);
(2)特有方法:
1)void setLineNumber(int lineNumber);设置当前行号;
2)int getLineNumber();获得当前行号;
四、Writer:所有字符流输出流的基类;不可创建对象;
1、抽象方法:
(1).writer(str);写入数据到该流缓冲中;
(2).fulsh();刷新该流缓冲;
(3).close();关闭此流,并刷新;
2、FileWriter:Writer的操作文件子类;
构造方法:FileWriter(String fileName, boolean append);参数二表示是否续写,true续写;
注释:\r\n:换行
//FileWriter fw=new FileWriter("demo.txt");
//会创建该文件到指定目录下,如果已经存在会被覆盖;
3、BufferedWriter:Writer的子类,用于提升效率;
(1)构造方法:BufferedWriter(Writer out[, int sz]);//sz指定大小;
(2)特有方法:newLine();换行;
4、示例和异常处理:
public classTest {public static voidmain(String[] args) {
FileWriter fw= null;try{//创建FileWriter对象
fw = new FileWriter("e:/test.txt");//写入数据;
fw.write("123");
}catch(Exception e) {
e.printStackTrace();
}finally{//关闭流;
try{if (fw != null) { //判断是否为空,为空则无需关闭;
fw.close(); //在finally中关闭流;防止try中产生异常无法关闭;
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
五、Reader/Writer文件复制:
public classTest {public static void main(String[] args) throwsException {
FileReader fr= new FileReader("e:/test.txt");
FileWriter fw= new FileWriter("e:/test2.txt");char[] arr = new char[1024];int len = 0;while ((len = fr.read(arr)) != -1) {
fw.write(arr,0, len);
}
fw.flush();
fw.close();
fr.close();
}
}
六、InputStream:所有字节流输入流的基类;不可创建对象;
1、抽象方法:
(1)void close();关闭;
(2)int read();读取一个字节;返回0-255的字节值;如无字节返回-1;
(3)int read(byte[] b);把数据流读入到名为b的byte类型的数组中;
//可多次读取,依次向后,每次返回读取的个数,如无数据可读返回-1;
(4)int read(byte[],int off,int len);把数据流中最多len个字节读入到byte数组的指定开始位置;
//参数:off:数组存储的开始位置;len:长度;
(5)int available();返回总字节数;//数据太大时不建议使用,会导致内存溢出;
2、FileIputStream:InputStream的核心实现类;
构造方法:
(1)FileInputStream(File file);构建一个FileInputStream对象指向一个File对象;
(2)FileInputStream(String name);构建一个FileInputStream对象指向一个name表示的路径对应的资源;
3、BufferedInputStream:InputStream的子类,用于提升效率;
七、OutputStream:所有字节流输入流的基类;不可创建对象;
1、抽象方法:
(1)void close();关闭,且刷新流;
(2)void flush();刷新了流;
(3)void write(int b);将一个字节写入;
(4)void write(byte[] b);把一个字节数组写入;
(5)void write(byte[] b,int off,int len);参数:off数组开始位置;len传入的长度;
2、FileOutputStream:OutputStream的核心实现类;
构造方法:
(1)FileOutputStream(File file[, boolean append]);
(2)FileOutputStream(String name[, boolean append]);
//会创建该文件到指定目录下,如果已经存在会被覆盖;
文件覆盖问题解决方案:
(1)每次生成一个新的文件;//用时间命名文件,getTime();
(2)在原文件的基础上追加内容;//构造函数
3、BufferedOutputStream:OutputStream的子类,用于提升效率;
4、代码示例,文件复制:
//try(){}catch{}在()中声明流可以自动关闭;1.8jdk
public classTest {public static void main(String[] args) throwsException {try (FileInputStream fis = new FileInputStream("D:/Users/Desktop/123.avi");
FileOutputStream fos= new FileOutputStream("D:/Users/Desktop/demo.avi");) {byte[] arr = new byte[1024];int len = 0;while ((len = fis.read(arr)) != -1) {
fos.write(arr,0, len);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}