目录
一、IO介绍
IO流体系
字节流
字节输出流:FileoutputStream
字节输入流FilelnputStream
字符流
字符输入流
字符输出流
缓冲流
字节缓冲流
字符缓冲流
序列化、反序列化流
序列化/对象操作输出流
反序列化/对象操作输入流
打印流
字节打印流
字符打印流
解压缩流
解压流
压缩流
IO流工具
一、IO介绍
Java IO流是Java中处理输入输出的机制。它是一种数据传输方式,用于在程序和外部设备(例如文件、网络连接、控制台)之间传输数据。Java IO流提供了一种灵活的方式来读取和写入数据,可以处理各种类型的数据,包括文本、二进制和对象数据。Java IO流包括输入流和输出流两种类型,其中输入流用于读取数据,输出流用于写入数据。在Java中,IO流是通过类和接口来实现的。
Java IO流提供了多种类型的流,包括字节流和字符流。字节流处理的是二进制数据,可以操作所有类型的文件,而字符流处理的是文本数据,只能操作纯文本文件(纯文本文件指:用windows系统自带的记事本打开并且能读懂的文件,例如:txt文件,md文件,xml文件,lrc文件等
)。字节流包括InputStream和OutputStream,而字符流包括Reader和Writer。此外,Java IO流还提供了缓冲流、数据流、对象流等类型的流,以便更方便地处理数据。
IO流体系
字节流
字节输出流:FileoutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
书写步骤:
1、创建字节输出流对象
2、写数据
3、释放资源
File f1 = new File( "D:\\a.txt" );boolean b1 = false;FileOutputStream fos = null;try {//在D盘创建文件b1 = f1.createNewFile();//创建输出流对象,数据传输通道fos = new FileOutputStream("D:\\a.txt" );//写入数据fos.write(97);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}System.out.println(b1);
细节1:参数是字符串表示的路径或者是File对象都是可以的
FileOutputStream fos = null;try {//创建输出流对象,数据传输通道fos = new FileOutputStream(new File( "D:\\a.txt" ) );//写入数据fos.write(97);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
细节3:如果文件已经存在,则会清空文件
细节: write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
FileOutputStream写数据的3种方式
方法名称 | 说明 |
void write(int b) | 一次写一个字节数据 |
void write(byte[ ] b) | 一次写一个字节数组数据 |
void write(byte[ ] b, int off, int len) | 一次写一个字节数组的部分数据 |
方式一:
public static void main(String[] args) {FileOutputStream fos = null;try {//创建输出流对象,数据传输通道fos = new FileOutputStream(new File( "D:\\aa\\a.txt" ) );//写入数据fos.write(97);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
方式二:
public static void main(String[] args) {FileOutputStream fos = null;try {//创建输出流对象,数据传输通道fos = new FileOutputStream(new File( "D:\\a.txt" ) );byte[] bytes = {97, 98, 99, 100};//写入数据fos.write(bytes);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
方式三:
public static void main(String[] args) {FileOutputStream fos = null;try {//创建输出流对象,数据传输通道fos = new FileOutputStream(new File( "D:\\a.txt" ) );byte[] bytes = {97, 98, 99, 100};//写入数据//参数一:数组 参数二:起始索引 参数三:写入的个数//b cfos.write(bytes,1,2);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
换行写入:
public static void main(String[] args) {FileOutputStream fos = null;try {//创建输出流对象,数据传输通道fos = new FileOutputStream(new File( "D:\\a.txt" ) );String str = "zhangsan";byte[] bytes1 = str.getBytes();fos.write(bytes1);String str2 = "\r\n";byte[] bytes2 = str2.getBytes();fos.write(bytes2);String str3 = "666";byte[] byte3 = str3.getBytes();fos.write(byte3);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
续写:
public static void main(String[] args) {FileOutputStream fos = null;try {//创建输出流对象,数据传输通道//参数1:文件1路径 参数2:续写开关,ture续写,false文件清空从新写入fos = new FileOutputStream(new File( "D:\\a.txt" ),true);String str = "zhangsan";byte[] bytes1 = str.getBytes();fos.write(bytes1);String str2 = "\r\n";byte[] bytes2 = str2.getBytes();fos.write(bytes2);String str3 = "666";byte[] byte3 = str3.getBytes();fos.write(byte3);} catch (IOException e) {e.printStackTrace();}finally {if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
字节输入流FilelnputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
书写步骤:
1、创建字节输入流对象
2、读数据
3、释放资源
public static void main(String[] args) {FileInputStream fis = null;try {//创建输入流对象,数据传输通道fis = new FileInputStream("D:\\a.txt" );//读取数据int read = fis.read();System.out.println((char) read);} catch (IOException e) {e.printStackTrace();}finally {if (fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
细节1:如果文件不存在,就直接报错。
细节2:读取数据,一次读一个字节,读出来的是数据在ASCII上对应的数字细节,读到文件末尾了, read方法返回 -1。
循环读取文件
public static void main(String[] args) {FileInputStream fis = null;try {//创建输入流对象,数据传输通道fis = new FileInputStream("D:\\a.txt" );//读取数据int b;while ((b = fis.read()) != -1){System.out.print((char) b);}} catch (IOException e) {e.printStackTrace();}finally {if (fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
拷贝文件
public static void main(String[] args) {FileInputStream fis = null;FileOutputStream fos = null;try {//创建输入流对象,数据传输通道fis = new FileInputStream("D:\\a.txt" );//创建输出流对象,数据传输通道fos = new FileOutputStream("D:\\b.txt");//读取数据,边读编写int b;while ((b = fis.read()) != -1){fos.write(b);}} catch (IOException e) {e.printStackTrace();}finally {if (fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
一次读取多个字节数据
public static void main(String[] args) {FileInputStream fis = null;try {//创建输入流对象,数据传输通道fis = new FileInputStream("D:\\a.txt" );byte[] bytes = new byte[2];//读取数据,返回读取元素的个数int len = fis.read(bytes);System.out.println(len);//从当前数组中,从第0个元素开始,读取len个元素String str = new String(bytes,0,len);System.out.println(str);} catch (IOException e) {e.printStackTrace();}finally {if (fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
字符流
字符流是Java IO流中的一种,用于处理文本数据。与字节流不同,字符流是面向字符的,可以处理Unicode字符集中的字符。Java中的字符流主要有两个类:Reader和Writer。
Reader类是抽象类,它提供了多种方法用于读取字符数据。常用的子类包括FileReader、InputStreamReader、CharArrayReader等。其中,FileReader用于读取文件中的字符数据,InputStreamReader用于读取字节流并将其转换为字符流,CharArrayReader用于读取字符数组中的数据。
Writer类也是抽象类,它提供了多种方法用于写入字符数据。常用的子类包括FileWriter、OutputStreamWriter、CharArrayWriter等。其中,FileWriter用于向文件中写入字符数据,OutputStreamWriter用于将字符流转换为字节流并写入输出流,CharArrayWriter用于向字符数组中写入数据。
与字节流不同,字符流可以自动处理字符集编码和解码的问题,因此在处理文本数据时更加方便和安全。同时,字符流也提供了缓冲区和转换器等功能,可以提高数据传输的效率。
总之,字符流是Java IO流中的一种,用于处理文本数据。它具有自动处理字符集编码和解码的功能,提供了缓冲区和转换器等功能,是处理文本数据的首选。
特点:
输入流:一次读一个字节,遇到中文时,一次读多个字节
输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
字符输入流
书写步骤:
1、创建字符输入流对象
2、读取数据
3、释放资源
public static void main(String[] args) throws IOException {/*第一步:创建对象public FileReader(File file) 创建字符输入流关联本地文件public FileReader(String pathname) 创建字符输入流关联本地文件第二步:读取数据public int read() 读取数据,读到末尾返回-1public int read(char[] buffer) 读取多个数据,读到末尾返回-1第三步:释放资源public void close( ) 释放资源/关流*/FileReader fr = new FileReader("D:\\a.txt");int ch;while ((ch = fr.read()) != -1){System.out.print((char) ch);}fr.close();}
read ()细节:
1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
2.在读取之后,方法的底层还会进行解码并转成十进制。最终把这个十进制作为返回值
一次读取多个字符
public static void main(String[] args) throws IOException {/*第一步:创建对象public FileReader(File file) 创建字符输入流关联本地文件public FileReader(String pathname) 创建字符输入流关联本地文件第二步:读取数据public int read() 读取数据,读到末尾返回-1public int read(char[] buffer) 读取多个数据,读到末尾返回-1第三步:释放资源public void close( ) 释放资源/关流*/FileReader fr = new FileReader("D:\\a.txt");char[] chars = new char[2];int len;//read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中//相当于空参的read +强转类型转换while ((len = fr.read(chars)) != -1){System.out.print(new String(chars,0,len));}fr.close();}
字符输出流
构造方法 | 说明 |
public Filewriter(File file) | 创建字符输出流关联本地文件 |
public Filewriter( string pathname) | 创建字符输出流关联本地文件 |
public Filewriter(File file, boolean append) | 创建字符输出流关联本地文件,续写 |
public Filewriter(string pathname,boolean append) | 创建字符输出流关联本地文件,续写 |
成员方法
成员方法 | 说明 |
void write(int c) | 写出一个字符 |
void write(string str) | 写出一个字符串 |
void write(String str, int off, int len) | 写出一个字符串的一部分 |
void write(char[ ] cbuf) | 写出一个字符数组 |
void write(char[ ] cbuf, int off, int len) | 写出字符数组的一部分 |
书写步骤:
1、创建字符输出流对象
2、写入数据
3、释放资源
public static void main(String[] args) throws IOException {//创建字符输出流对象FileWriter fw = new FileWriter("D:\\a.txt");//void write(int c) 写出一个字符fw.write(97);//void write(string str) 写出一个字符串fw.write("你好张三");//void write(String str, int off, int len) 写出一个字符串的一部分fw.write("你好张三",2,2);//void write(char[ ] cbuf) 写出一个字符数组char[] chars = {'1','2','3','你'};fw.write(chars);//void write(char[ ] cbuf, int off, int len) 写出字符数组的一部分fw.write(chars,2,2);fw.close();}
细节1:参数是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
细节4:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
字符流原理解析
创建字符输入流对象:
底层:关联文件,并创建缓冲区(长度为8192的字节数组)
读取数据:
1.判断缓冲区中是否有数据可以读取
2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-1
3.缓冲区有数据:就从缓冲区中读取。
空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
拷贝文件夹,带子文件夹
public static void main(String[] args) throws IOException {//拷贝一个文件夹//创建对象表示数据源File src = new File("D:\\aaa\\src");//创建对象表示拷贝目的地File temp = new File("D:\\aaa\\temp");//掉方法copyFile(src,temp);}/*** 拷贝文件* @param src 数据源* @param temp 目的地*/private static void copyFile(File src, File temp) throws IOException {//创建文件夹temp.mkdirs();//递归//进入数据源File[] files = src.listFiles();//遍历数组for (File file : files) {if (file.isFile()){//拷贝文件FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(temp,file.getName()));byte[] bytes = new byte[1024];int len;while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}fos.close();fis.close();}else {//文件夹递归//new File(temp,file.getName()) 创建文件夹,名字file.getName()copyFile(file,new File(temp,file.getName()));}}}
缓冲流
缓冲流(Buffered Stream)是一种流式输入输出(I/O)操作的方式。通常,缓冲流会在内存中创建一个缓冲区,将数据暂时存放在缓冲区中,然后再一次性地将缓冲区中的数据写入到文件或者网络中,或者从文件或者网络中读取一定量的数据到缓冲区中,再从缓冲区中读取数据。
缓冲流的作用是提高I/O操作的效率。因为在进行I/O操作时,每次读写一个字节或者一个字符都会涉及到磁盘或者网络的访问,这样会导致I/O操作的效率非常低下。而缓冲流的使用可以将多个I/O操作合并为一次操作,从而提高I/O操作的效率。
Java中的缓冲流有两种:BufferedInputStream和BufferedOutputStream。其中,BufferedInputStream是InputStream的子类,可以提高从输入流中读取数据的效率;BufferedOutputStream是OutputStream的子类,可以提高向输出流中写入数据的效率。在使用缓冲流时,需要注意及时关闭流,避免资源泄露和数据丢失
字节缓冲流
字节缓冲流拷贝文件
public static void main(String[] args) throws IOException {//创建缓冲流对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\b.txt"));//循环读取文件int len;while ((len = bis.read()) != -1){bos.write(len);}//释放资源bos.close();bis.close();}
一次读取多个字节
public static void main(String[] args) throws IOException {//创建缓冲流对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\b.txt"));byte[] bytes = new byte[1024];//循环读取文件int len;while ((len = bis.read(bytes)) != -1){bos.write(bytes,0,len);}//释放资源bos.close();bis.close();}
字符缓冲流
字符缓冲输入流特有方法 | 说明 |
public string readLine() | 读取一行数据,如果没有数据可读了,会返回null |
字符缓冲输出流特有方法 | 说明 |
public void newLine() | 跨平台的换行 |
字符缓冲输入流
public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt"));//读取数据,一次读一行String line = br.readLine();System.out.println(line);br.close();}
字符缓冲输出流
public static void main(String[] args) throws IOException {//创建字符缓冲输出流对象BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.txt"));//写入数据bw.write("123");//写入换行bw.newLine();bw.write("456");bw.close();}
序列化、反序列化流
Java中的序列化和反序列化可以使用ObjectOutputStream和ObjectInputStream来实现。ObjectOutputStream是OutputStream的子类,可以将对象序列化为字节流并写入到输出流中;ObjectInputStream是InputStream的子类,可以从输入流中读取字节流并反序列化为对象。
序列化和反序列化的作用是在网络传输或者持久化存储时,将对象转换为字节流进行传输或者存储,以便在需要时重新恢复对象。
序列化/对象操作输出流
构造方法 | 说明 |
public objectoutputstream(outputstream out) | 把基本流包装成高级流 |
成员方法 | 说明 |
public final void writeobject(object obj) | 把对象序列化(写出)到文件中去 |
注意:
-
序列化的对象必须实现Serializable接口,否则会抛出NotSerializableException异常。
-
序列化的对象中的属性也必须是可序列化的,否则也会抛出NotSerializableException异常。
-
序列化和反序列化的流必须在同一个JVM中,否则会抛出ClassNotFoundException异常。
-
序列化和反序列化的流必须及时关闭,避免资源泄露。
-
序列化和反序列化的过程中,可能会出现版本不兼容的问题,需要使用serialVersionUID来解决。
public static void main(String[] args) throws IOException {//创建对象Student student = new Student("张三",20);//创建序列化流对象/对象操作输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\a.txt"));//写入数据oos.writeObject(student);//释放资源oos.close();}
反序列化/对象操作输入流
可以把序列化到本地文件中的对象读取到程序中
构造方法 | 说明 |
public objectInputstream( Inputstream out) | 把基本流变成高级流 |
成员方法 | 说明 |
public object readobject() | 把序列化到本地文件中的对象,读取到程序中来 |
public static void main(String[] args) throws IOException, ClassNotFoundException {//创建反序列化流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\a.txt"));//读取数据Student student = (Student)ois.readObject();//System.out.println(student);//释放资源ois.close();}
打印流
打印流(PrintStream和PrintWriter)是Java中用于输出文本信息的流。它们可以将文本信息输出到控制台、文件、网络等地方。
PrintStream是OutputStream的子类,可以将文本信息输出到字节流中,它提供了多种打印方法,如print、println、printf等,可以输出不同类型的数据。PrintStream还提供了自动刷新缓冲区的功能,可以在每次输出后自动刷新缓冲区。
PrintWriter是Writer的子类,可以将文本信息输出到字符流中,它也提供了多种打印方法,如print、println、printf等,可以输出不同类型的数据。PrintWriter还提供了自动刷新缓冲区的功能,可以在每次输出后自动刷新缓冲区。
使用打印流的好处是可以方便地输出各种类型的数据,并且可以自动刷新缓冲区,避免输出数据不完整的问题。同时,打印流还提供了格式化输出的功能,可以根据需要进行格式化输出。
在使用打印流时,需要注意及时关闭流,避免资源泄露和数据丢失。另外,需要注意打印流的输出位置和目标,避免输出到错误的位置和目标。
字节打印流
构造方法 | 说明 |
public Printstream(outputstream/File/string) | 关联字节输出流/文件/文件路径 |
public Printstream(string fileName,charset charset) | 指定字符编码 |
public Printstream(outputstream out, boolean autoFlush) | 自动刷新 |
public Printstream(outputstream out,boolean autoFlush,string encoding) | 指定字符编码且自动刷新 |
成员方法 | 说明 |
public void write(int b) | 常规方法:规则跟之前一样,将指定的字节写出 |
public void println( Xxx Xx) | 特有方法:打印任意数据,自动刷新,自动换行 |
public void print(Xxx xx) | 特有方法:打印任意数据,不换行 |
public void printf(String format,0Object. .. args) | 特有方法:带有占位符的打印语句,不换行 |
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {//创建字节打印流对象PrintStream ps = new PrintStream(new FileOutputStream("D:\\a.txt"),true,"UTF-8");//写成数据ps.println(97);ps.print(true);ps.printf("%s爱上了%s","阿珍","阿强");//释放资源ps.close();}
字符打印流
构造方法 | 说明 |
public Printwriter(write/File/string) | 关联字节输出流/文件/文件路径 |
public Printwriter( String fileName,Charset charset) | 指定字符编码 |
public Printwriter(write w, boolean autoFlush) | 自动刷新 |
public PrintWriter(outputStream out,boolean autoFlush,Charset charset) | 指定字符编码且自动刷新 |
成员方法 | 说明 |
public void write(....) | 常规方法:规则跟之前一样,写出字节或字符串 |
public void println( Xxx Xx) | 特有方法:打印任意数据类型且换行 |
public void print(Xxx xx) | 特有方法:打印任意数据,不换行 |
public void printf(String format,Object. .. args) | 特有方法:带有占位符的打印语句 |
public static void main(String[] args) throws IOException {//创建字符打印流的对象PrintWriter pw = new PrintWriter(new FileWriter("D:\\a.txt"),true);//写数据pw.println("张三");//释放资源pw.close();}
解压缩流
解压流
解压本质:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
public static void main(String[] args) throws IOException {//创建一个file表示要解压的压缩包File src = new File("D:\\aaa.zip");//创建一个File表示解压的目的地File dest = new File("D:\\");//掉方法unzip(src,dest);}//定义一个解压方法private static void unzip(File src, File dest) throws IOException {//解压的本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中//创建一个解压缩流用来读取压缩包中的数据ZipInputStream zip = new ZipInputStream(new FileInputStream(src));//要先获取到压缩包里面的每一个zipentry对象// 表示当前在压缩包中获取到的文件或者文件夹ZipEntry entry;while ((entry = zip.getNextEntry()) != null){System.out.println(entry);if (entry.isDirectory()){//文件夹:需要在目的地dest处创建一个同样的文件夹File file = new File(dest,entry.toString());file.mkdirs();}else {//文件:需要读取到压缩包I的文件,并把他存放到目的地dest文件夹中(按照层级目录进行存放)FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));int b;while ((b = zip.read()) != -1){//写到目的地fos.write(b);}//表示在压缩包中的一个文件处理完毕了。fos.close();zip.closeEntry();}}zip.close();}
压缩流
压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中
压缩单个文件
public static void main(String[] args) throws IOException {//创建一个file表示要解压的压缩包File src = new File("D:\\a.txt");//创建一个File表示解压的目的地File dest = new File("D:\\");//掉方法tozip(src,dest);}/*** 压缩* @param src 要压缩的文件* @param dest 压缩包的位置* @throws IOException*/private static void tozip(File src, File dest) throws IOException {//创建压缩流关联对象ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip")));//2.创建ZipEntry对象,表示压缩包里面的每一个文件和文件夹ZipEntry entry = new ZipEntry("a.txt");//.把ZipEntry对象放到压缩包当中zos.putNextEntry(entry);//把src文件中的数据写到压缩包当中FileInputStream fis = new FileInputStream(src);int b;while ((b = fis.read()) != -1){zos.write(b);}zos.closeEntry();zos.close();}
压缩文件夹
public static void main(String[] args) throws IOException {//创建File对象表示要压缩的文件夹File src = new File("D:\\aaa");//创建File对象表示压缩包放在哪里(压缩包的父级路径)File destParent = src.getParentFile();//创建File对象表示压缩包的路径File dest = new File(destParent,src.getName() + ".zip");//创建压缩流关联压缩包ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));//获取src里面的每一个文件,变成ZipEntry对象,放入到压缩包当中tozip(src,zos,src.getName());zos.close();}/*** 获取src里面的每一个文件,变成ZipEntry对象,放入到压缩包当中* @param src 数据源* @param zos 压缩流* @param name 压缩包内部的路径*/private static void tozip(File src, ZipOutputStream zos, String name) throws IOException {//File[] files = src.listFiles();for (File file : files) {if (file.isFile()){//ZipEntry entry = new ZipEntry(name + "\\" + file.getName());zos.putNextEntry(entry);//FileInputStream fis = new FileInputStream(file);int b;while ((b = fis.read()) != -1){zos.write(b);}fis.close();zos.closeEntry();}else {tozip(file,zos,name + "\\" + file.getName());}}}
IO流工具
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
</dependency>
常见方法:
FileUtils类(文件/文件夹相关) | 说明 |
static void copyFile(File srcFile,File destFile) | 复制文件 |
static void copyDirectory(File srcDir,File destDir) | 复制文件夹 |
static void copyDirectoryToDirectory(File srcDir, File destDir) | 复制文件夹 |
static void deleteDirectory(File directory) | 删除文件夹 |
static void cleanDirectory(File directory) | 清空文件夹 |
static string readFileToString(File file,Charset encoding) | 读取文件中的数据变成成字符串 |
static void write(File file,CharSequence data,string encoding) | 写出数据 |
IOUtils类(流相关相关) | 说明 |
public static int copy(InputStream input,outputStream output) | 复制文件 |
public static int copyLarge(Reader input,writer output) | 复制大文件 |
public static string readLines(Reader input) | 读取数据 |
public static void write(String data,outputstream output) | 写出数据 |