IO流
-
File类是文件和目录路径名的抽象表示,文件和目录是可以通过File封装成对象的;对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以存在也可以不存在,将来时要通过具体操作把这个路径的内容转换为具体存在的。
方法名 | 说明 |
---|---|
File (String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 |
File (String parent,String child) | 从父路径名字符串和子路径名字符串创建新的File实例 |
File (File parent, String child) | 从父抽象路径名和子路径名字符串创建新的File实例 |
public class FileDemo{ public static void main(String[] args){ File f1 = new File("E:\\itcast\\java.txt"); System.out.println(f1); File f2 = new File("E:\\itcast","java.txt"); System.out.println(f2); File f3 = new File("E:\\itcast"); File f4 = new File(f3,"java.txt"); System.out.println(f4); } }//指向某个文件,三个方法任意一个都可以
-
File类的创建功能
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录 -
File类判断和获取功能
方法名 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为目录 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或者目录的名称 public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组 public boolean delete() 删除由此抽象路径名表示的文件或目录 //绝对路径:有完整的路径名,不需要任何其他信息就可以定位它所表示的文件(如:E:\\ itcast\\java.txt)
相对路径:必须使用取自其他路径名的信息进行解释(如:myFile \ \ java.txt)
//删除目录时注意事项:如果一个目录中有内容(目录,文件),不能直接删除,应该先删除目录中的内容,最后才能删除目录。
-
递归指的是方法定义中调用方法本身的现象,思路是把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归只需要少量程序就可以描述处解题过程所需要的多次重复计算。递归要有出口,否则会出现内存溢出。
public class DiGuiDemo{ public static void main(String[] args){ int[] arr = new int[20]; arr[0] = 1; arr[1] = 1; for(int i = 2; i< arr.length; i++){ arr[i] = arr[i-1] + arr[i-2]; } System.out.println(arr[19]); //递归求解 System.out.println(f(20)); } public static int f(int n){ if(n==1||n==2){ return 1;} else{ return f(n-1) + f(n-2); } } }
-
按照数据流向分为输入流(读数据)和输出流(写数据);如果按照数据类型分为字节流(字节输入流和输出流)和字符流(字符输入流和字符输出流)。一般都是按照数据类型来分类的。如果数据通过Window自带的记事本软件打开,我们可以读懂里面内容,就使用字符流,否则就是使用字节流;如果不好分辨就使用字节流。
//InputStream:这个抽象类是表示字节输入流的所有类的超类 //OutStream:这个抽象类是表示字节输出流的所有类的超类。
子类名称都是以其父类名作为子类名的后缀。FileOutputStream:文件输出流用于将数据写入File(FileOutputStream(String name):创建文件输出流以指定的名称写入文件)
//使用字节输出流写数据:创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件);调用字节输出流对象的写数据方法;释放资源(关闭文件输出流并释放与此流相关联的任何系统资源)
public class FileOutputStreamDemo{ public static void main(String[] args) throws IOException{ //创建字节流输出对象 FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt"); //void write (int b):将指定的字节写入此文件输出流 fos.write(97); //void close():关闭此文件输出流并释放与此流相关联的任何系统资源 fos.close(); } }
-
字节流写数据的3种方法
方法名 说明 void write (int b) 将指定的字节写入此文件输出流一次写一个字节数据 void write (byte[] b) 将b.length字节从指定的字节数组写入此文件输出流 void write (byte[]b, int off , int len) 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据
-
字节流写数据后,加换行符:windows: \r \n linux: \n max: \r
字节流写数据实现追加写入:public FileOutputStream(String name, boolean append) 如:
FileOutputStream fos = new FileOutputStream("myByteStream \\ fos.txt" , true);
-
字节流写数据加异常处理:finally:在异常处理时提供finally块来执行所有清除操作。如:io流中的释放资源。被finally控制的语句一定会执行,除非JVM退出。
try{ 可能出现异常的代码;}catch(异常类名 变量名){异常的处理代码;}finally{执行所有清除操作;}
-
FileputStream:从文件系统中的文件获取输入字节 FileputStream(String name):通过打开与实际文件的连接来创建一个FileputStream,该文件由文件系统中的路径名name命名。
public class FileInputStreamDemo{ public static void main(String[] args) throws IOException{ //创建字节输入流对象 FileInputStream fis = new fileInputStream("myByteStream\\fos.txt"); //调用字节输入流对象的读数据方法 //int read():从该输入流读取一个字节的数据 int by = fis.read(); System.out.println(by); System.out.println((char)by);//强制转换字符 fis.close(); //如果读到文件末尾,读到-1 int by = fis.read(); while(by != -1){ System.out.print((char)by); by = fis.read(); } int by; while((by=fis.read())!=-1){ System.out.print((char)by); } //读取一个数组 byte[] bys = new byte[1024];//读取数据长度一般是1024及其整数倍 int len; while((len=fis.read(bys))!=-1){ System.out.println(new String(bys,0,len)); } fis.close();//释放资源 } }
-
复制文本文件:把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)。
数据源:E:\\itcast\\窗里窗外.txt----读数据----inputStream----FileputStream
目的地:myByteStream\\窗里窗外.txt----写数据----OutputStream----FileOutputStream
public class CopyTxtDemo{ public static void main(String[] args) throws IOException{ //根据数据源创建字节输入流对象 FileInputStream fis = new FileInputStream("E:\\itcast\\窗里窗外.txt"); //根据目的地创建字节输出流对象 FileOutputStream fos = new FileOutputStream("myByteStream\\窗里窗外.txt"); //读取数据,复制文本文件(一次读取一个字节,一次写入一个字节) int by; while((by=fis.read())!=-1){ fos.write(by); } //数值图片 //根据数据源创建字节输入流对象 FileIputStream fis = new FileInputStream("E:\\itcast\\mn.jpg"); //根据目的地创建字节输出流对象 FileOutputStream fos = new FileOutputStream("myByteStream\\mn.jpg"); //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组) byte[] bys = new byte[1024]; int len; while((len=fis.rea(bys))!=-1){ fos.write(bys,0,len); } //释放资源 fos.close(); fis.close(); } }
//复制视频,四种方法
public class CopyAviDemo{ public Static void main(String[] args) throws IOException{ //记录开始时间 long startTime = System.currentTimeMillis(); //复制视频 method1(); method2(); method3(); method4(); //记录结束时间 long endTime = System.currentTimeMillis(); System.out.println("共耗时:"+(endTime - startTime)+"毫秒"); } //基本字节流一次读写一个字节(结果共耗时64565毫秒) public static void method1() throws IOException{ FileInputStream fis = new FileInputStream("E:\\itcast\\视频.avi"); FileOutputStream fos = new FileOutputStream("myByteStream\\视频.avi"); int by; while((by=fis.read())!=-1){ fos.write(by); } fos.close(); fis.close(); } //基本字节流一次读写一个字节数组(共耗时107毫秒) public static void method2() throws IOException{ FileInputStream fis = new FileInputStream("E:\\itcast\\视频.avi"); FileOutputStream fos = new FileOutputStream("myByteStream\\视频.avi"); byte[] bys = new byte[1024]; int len; while((len=fis.read(bys))!=-1){ fos.write(bys,0,len); } fos.close(); fis.close(); } //字节缓冲流一次读写一个字节(共耗时405毫秒) public static void method3() throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\视频.avi")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutStream("myByteStream\\视频.avi")); int by; while((by=bis.read()!=-1)){ bos.write(by); } bos.close(); bis.close(); } //字节缓冲流一次读写一个字节数组(共耗时60毫秒) public static void method4() throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\视频.avi")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutStream("myByteStream\\视频.avi")); byte[] bys = new byte[1024]; int len; while((len=bis.read(bys)!=-1)){ bos.write(bys,0,len); } bos.close(); bis.close(); } }
-
字节缓冲流,BufferOutputStream(该类实现缓冲输出流,应用程序可以向底层输出流写入字节,不必为写入的每个字节导致底层系统的调用) Buffer额度Input Stream(创建BufferedInputStream将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节)
构造方法:字节缓冲输出流:BufferedOutputStream(Output Stream out) 字节缓冲输入流:BufferedInputStream(InputStream in)
public class BufferStreamDemo{ public static void main(String[] args) throws IOException{ //字节缓冲输出流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("myByteStream\\bos.txt")); //写数据 bos.write("hello\r\n".getBytes()); bos.write("world\r\n".getBytes()); //字节缓冲输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myByteStream\\bos.txt")); int by;//一次读取一个字节数据 while((by=bis.read())!=-1){ System.out.print((char)by); } //释放资源 bos.close(); bis.close(); } }
-
字符流:一个汉字的存储(GBK编码,占用2个字节 UTF—8编码,占用3个字节)
方法名 | 说明 |
---|---|
void write (int c) | 写一个字符 |
void write (char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
void wtite (String str) | 写入一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
flush() | 刷新流,还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
public class OutputStreamWriterDemo{ public static void main(String[] args) throws IOException{ //创建一个使用默认字符编码的OutputStreamWriter OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt")); //写一个字符 osw.write(97); //刷新流 osw.flush(); //写入一个字符数组 char[] chs = {'a','b','c','d','e'}; //写入字符数组的一部分 osw.write(chs,0,chs.length); osw.write(chs,1,3); //写一个字符串 osw.write("abcd"); //写一个字符串的一部分 osw.write("abcd",0,"abcd".length()); osw.write("abcd",1,3); //释放资源 osw.close(); } }
-
小结
字节流: 1.字节输入流InputStream(读数据:int read():一次读一个字节 int read(byte[] bys):一次读取一个字节数组)分为: FileInputStream BufferedInputStream
2. 字节输出流OutputStream(写数据:void write(int by):一次写一个字节 void write(byte[] bys,int index,int len):一次写 一个字节数组的一部分)分为:FileOutputStream BufferedOutputStream
//字节流可以复制任意文件数据,有4种方式一般采用字节缓冲流一次读写一个字节数组方式
字符流: 1.字符输入流Reader(读数据:int read():一次读一个字符 int read(char[] chs):一次读取一个字符数组) :分为 InputStreamReader有子类FileReader BufferedReader(String readLine():一次读取一个字符串)
2. 字符输出流Writer (写数据:void write(int ch):一次写一个字符 void write(char[] chs,int index,int len):一次写一个字 符数组的一部分) 分为OutputStreamWriter有子类FileWriter BufferedWriter(void newLine(): 写一个换行符 void write(String line):一次写一个字符串)
//字符流只能复制文本数据,有5种方式,一般采用字符缓冲流的特有功能