目录
先看两张图:转载自://blog.csdn.net/m0_37721946/article/details/103538660
一、普通文件
读文件:
FileInputStream fis= new FileInputStream(路径);//节点类
InputStreamReader isr= new InputStreamReader(fis);//转化类
BufferedReader br =new BufferedReader(isr);//装饰类
br.readLine();
写文件:
FileOutputStream fos= new FileOutputStream(路径);//节点类
OutputStreamWriter osr= new OutputStreamWriter(fos);//转化类
BufferedWriter bw =new BufferedWriter(osr);//装饰类
bw.write(内容);写入内容
bw.newLine();//新的一行
二、二进制文件
读文件:
FileInputStream fis= new FileInputStream(路径);
BufferedInputStream bis= new BufferedInputStream(fis);
DataInputStream dis=new DataInputStream(bis);
dis.readUTF()
dis.readInt()
写文件:
FileOutputStream fos= new FileOutputStream(路径);
BufferedOutputStream bos= new BufferedOutputStream(fos);
DataOutputStream dos=new DataOutputStream(bos);
dos.writeUTF("a");
dos.writeInt(20);
三、压缩文件
压缩文件:
File file =new File(路径);
File zipFile =new File(路径.zip);
InputStream input = new FileInputStream(file);
FileOutputStream fos =new FileOutputStream(zipFile);
ZipOutputStream zos=new ZipOutputStream(fos);
zos.putNextEntry(new ZipEntry(file.getName())) ;
内容=input.read();
zos.write(内容);
压缩文件夹:
File file =new File(路径);
File zipFile =new File(路径.zip);
FileOutputStream fos =new FileOutputStream(zipFile);
ZipOutputStream zos=new ZipOutputStream(fos);
判断file是否是文件夹,是则File lists[] = file.listFiles() ;找出文件夹下所有文件路径
然后进行遍历:
InputStream input = new FileInputStream(lists[i]);
zos.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ;
内容=input.read();
zos.write(内容);
补充:此处只实现文件夹一层压缩,若需多层压缩则结合压缩文件和压缩文件夹进行递归
解压缩文件:
File zipFile =new File(路径.zip);
FileInputStream fis =new FileInputStream(zipFile);
ZipInputStream zis=new ZipInputStream(fis);
遍历:判断ZipEntry entry =zis.getNextEntry();
{File file =new File(zipFile的上层目录+entry.getName())
判断压缩文件的文件夹是否已经被创建,若未创建,则创建文件夹
OutputStream output = new FileOutputStream(file);
InputStream is =zipFile.getInputStream(entry);
内容=is.read();
output.write(内容);
}
解压缩文件夹:
File zipFile =new File(路径.zip);
FileInputStream fis =new FileInputStream(zipFile);
ZipinputStream zis=new ZipinputStream(fis);
判断file是否是文件夹,是则File lists[] = file.listFiles() ;找出文件夹下所有文件路径
然后进行遍历:
InputStream input = new FileInputStream(lists[i]);
zos.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ;
内容=input.read();
zos.write(内容);
补充:此处只实现文件夹一层解压缩,若需多层解压缩则结合解压缩文件和解压缩文件夹进行递归
四、代码举例
一、普通文件
读文件:
FileInputStream fis= new FileInputStream(路径);//节点类
InputStreamReader isr= new InputStreamReader(fis);//转化类
BufferedReader br =new BufferedReader(isr);//装饰类
br.readLine();
public static void readFile1() {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream("c:/temp/abc.txt"); // 节点类
isr = new InputStreamReader(fis, "UTF-8"); // 转化类
//isr = new InputStreamReader(fis);
br = new BufferedReader(isr); // 装饰类
// br = new BufferedReader(new InputStreamReader(new
// FileInputStream("c:/temp/abc.txt")))
String line;
while ((line = br.readLine()) != null) // 每次读取一行
{
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
br.close(); // 关闭最后一个类,会将所有的底层流都关闭
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void readFile2() {
String line;
//try-resource 语句,自动关闭资源
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("c:/temp/abc.txt")))) {
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
写文件:
FileOutputStream fos= new FileOutputStream(路径);//节点类
OutputStreamWriter osr= new OutputStreamWriter(fos);//转化类
BufferedWriter bw =new BufferedWriter(osr);//装饰类
bw.writer(内容);写入内容
bw.newLine();//新的一行
public static void writeFile1() {
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
fos = new FileOutputStream("c:/temp/abc.txt"); // 节点类
osw = new OutputStreamWriter(fos, "UTF-8"); // 转化类
//osw = new OutputStreamWriter(fos); // 转化类
bw = new BufferedWriter(osw); // 装饰类
// br = new BufferedWriter(new OutputStreamWriter(new
// FileOutputStream("c:/temp/abc.txt")))
bw.write("我们是");
bw.newLine();
bw.write("Ecnuers.^^");
bw.newLine();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
bw.close(); // 关闭最后一个类,会将所有的底层流都关闭
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void writeFile2() {
//try-resource 语句,自动关闭资源
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:/temp/abc.txt")))) {
bw.write("我们是");
bw.newLine();
bw.write("Ecnuers.^^");
bw.newLine();
} catch (Exception ex) {
ex.printStackTrace();
}
}
二进制文件
读文件:
FileInputStream fis= new FileInputStream(路径);
BufferedInputStream bis= new BufferedInputStream(fis);
DataInputStream dis=new DataInputStream(bis);
dis.readUTF()
dis.readInt()
//try-resource 语句,自动关闭资源
try (DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("c:/temp/def.dat")))) {
String a, b;
int c, d;
a=dis.readUTF();
c=dis.readInt();
d=dis.readInt();
b=dis.readUTF();
System.out.println("a: "+a);
System.out.println("c: "+c);
System.out.println("d: "+d);
System.out.println("b: "+b);
}
catch(Exception ex)
{
ex.printStackTrace();
}
写文件:
FileOutputStream fos= new FileOutputStream(路径);
BufferedOutputStream bos= new BufferedOutputStream(fos);
DataOutputStream dos=new DataOutputStream(bos);
dos.writeUTF("a");
dos.writeInt(20);
FileOutputStream fos = null;
DataOutputStream dos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream("c:/temp/def.dat"); // 节点类 写字节
bos = new BufferedOutputStream(fos); // 装饰类 写字节数据到缓冲区
dos = new DataOutputStream(bos); // 转化类 负责数据类到字节的转换
dos.writeUTF("a");
dos.writeInt(20);
dos.writeInt(180);
dos.writeUTF("b");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
dos.close(); // 关闭最后一个类,会将所有的底层流都关闭
} catch (Exception ex) {
ex.printStackTrace();
}
}
压缩文件
压缩文件:
File file =new File(路径);
File zipFile =new File(路径.zip);
InputStream input = new FileInputStream(file);
FileOutputStream fos =new FileOutputStream(zipFile);
ZipOutputStream zos=new ZipOutputStream(fos);
zos.putNextEntry(new ZipEntry(file.getName())) ;
内容=input.read();
zos.write(内容);
import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipOutputStream ;
import java.io.FileOutputStream ;
public class SingleFileZip{
public static void main(String args[]) throws Exception{
File file = new File("c:/temp/abc.txt") ; // 定义要压缩的文件
File zipFile = new File("c:/temp/single2.zip") ; // 定义压缩文件名称
InputStream input = new FileInputStream(file) ; // 定义文件的输入流
ZipOutputStream zipOut = null ; // 声明压缩流对象
zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 设置ZipEntry对象
zipOut.setComment("single file zip") ; // 设置注释
//压缩过程
int temp = 0 ;
while((temp=input.read())!=-1){ // 读取内容
zipOut.write(temp) ; // 压缩输出
}
input.close() ; // 关闭输入流
zipOut.close() ; // 关闭输出流
System.out.println("single file zip done.");
}
}
压缩文件夹:
File file =new File(路径);
File zipFile =new File(路径.zip);
FileOutputStream fos =new FileOutputStream(zipFile);
ZipOutputStream zos=new ZipOutputStream(fos);
判断file是否是文件夹,是则File lists[] = file.listFiles() ;找出文件夹下所有文件路径
然后进行遍历:
InputStream input = new FileInputStream(lists[i]);
zos.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ;
内容=input.read();
zos.write(内容);
补充:此处只实现文件夹一层压缩,若需多层压缩则结合压缩文件和压缩文件夹进行递归
//文件夹压缩
import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipOutputStream ;
import java.io.FileOutputStream ;
public class MultipleFileZip{
public static void main(String args[]) throws Exception{ // 所有异常抛出
File file = new File("c:/temp/multiple") ; // 定义要压缩的文件夹
File zipFile = new File("c:/temp/multiple2.zip") ; // 定义压缩文件名称
InputStream input = null ; // 定义文件输入流
ZipOutputStream zipOut = null ; // 声明压缩流对象
zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
zipOut.setComment("multiple file zip") ; // 设置注释
//开始压缩
int temp = 0 ;
if(file.isDirectory()){ // 判断是否是文件夹
File lists[] = file.listFiles() ; // 列出全部子文件
for(int i=0;i<lists.length;i++){
input = new FileInputStream(lists[i]) ; // 定义文件的输入流
zipOut.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ; // File.separator为/,设置ZipEntry对象
System.out.println("正在压缩" + lists[i].getName());
while((temp=input.read())!=-1){ // 读取内容
zipOut.write(temp) ; // 压缩输出
}
input.close() ; // 关闭输入流
}
}
zipOut.close() ; // 关闭输出流
System.out.println("multiple file zip done.");
}
}
解压缩文件:
File zipFile =new File(路径.zip);
FileInputStream fis =new FileInputStream(zipFile);
ZipInputStream zis=new ZipInputStream(fis);
遍历:判断ZipEntry entry =zis.getNextEntry();
{File file =new File(zipFile的上层目录+entry.getName())
判断压缩文件的文件夹是否已经被创建,若未创建,则创建文件夹
OutputStream output = new FileOutputStream(file);
InputStream is =zipFile.getInputStream(entry);
内容=is.read();
output.write(内容);
}
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipInputStream ;
public class SingleFileUnzip{
public static void main(String args[]) throws Exception{
//待解压文件, 需要从zip文件打开输入流,读取数据到java中
File zipFile = new File("c:/temp/single.zip") ; // 定义压缩文件名称
ZipInputStream input = null ; // 定义压缩输入流
input = new ZipInputStream(new FileInputStream(zipFile)) ; // 实例化ZIpInputStream
ZipEntry entry = input.getNextEntry() ; // 得到一个压缩实体
System.out.println("压缩实体名称:" + entry.getName()) ; //获取压缩包中文件名字
//新建目标文件,需要从目标文件打开输出流,数据从java流入
File outFile = new File("c:/temp/" + entry.getName());
OutputStream out = new FileOutputStream(outFile) ; // 实例化文件输出流
int temp = 0 ;
while((temp=input.read())!=-1){
out.write(temp) ;
}
input.close() ; // 关闭输入流
out.close() ; // 关闭输出流
System.out.println("unzip done.") ;
}
}
解压缩文件夹:
File zipFile =new File(路径.zip);
FileInputStream fis =new FileInputStream(zipFile);
ZipinputStream zis=new ZipinputStream(fis);
判断file是否是文件夹,是则File lists[] = file.listFiles() ;找出文件夹下所有文件路径
然后进行遍历:
InputStream input = new FileInputStream(lists[i]);
zos.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ;
内容=input.read();
zos.write(内容);
补充:此处只实现文件夹一层压缩,若需多层压缩则结合压缩文件和压缩文件夹进行递归
import java.io.File ;
import java.io.OutputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipFile ;
import java.util.zip.ZipInputStream ;
import java.io.FileInputStream ;
import java.io.FileOutputStream ;
public class MultipleFileUnzip{
public static void main(String args[]) throws Exception{
//待解压的zip文件,需要在zip文件上构建输入流,读取数据到Java中
File file = new File("c:/temp/multiple.zip") ; // 定义压缩文件名称
File outFile = null ; // 输出文件的时候要有文件夹的操作
ZipFile zipFile = new ZipFile(file) ; // 实例化ZipFile对象
ZipInputStream zipInput = null ; // 定义压缩输入流
//定义解压的文件名
OutputStream out = null ; // 定义输出流,用于输出每一个实体内容
InputStream input = null ; // 定义输入流,读取每一个ZipEntry
ZipEntry entry = null ; // 每一个压缩实体
zipInput = new ZipInputStream(new FileInputStream(file)) ; // 实例化ZIpInputStream
//遍历压缩包中的文件
while((entry = zipInput.getNextEntry())!=null){ // 得到一个压缩实体
System.out.println("解压缩" + entry.getName() + "文件") ;
outFile = new File("c:/temp/" + entry.getName()) ; // 定义输出的文件路径
if(!outFile.getParentFile().exists()){ // 如果输出文件夹不存在
outFile.getParentFile().mkdirs() ;
// 创建文件夹 ,如果这里的有多级文件夹不存在,请使用mkdirs()
// 如果只是单纯的一级文件夹,使用mkdir()就好了
}
/* if(!outFile.exists()){ // 判断输出文件是否存在
if(entry.isDirectory())
{
outFile.mkdirs();
System.out.println("create directory...");
}
else
{
outFile.createNewFile() ; // 创建文件
System.out.println("create file...");
}
} */
if(!entry.isDirectory())
{
input = zipFile.getInputStream(entry) ; // 得到每一个实体的输入流
out = new FileOutputStream(outFile) ; // 实例化文件输出流
int temp = 0 ;
while((temp=input.read())!=-1){
out.write(temp) ;
}
input.close() ; // 关闭输入流
out.close() ; // 关闭输出流
}
}
input.close() ;
}
}
参考中国大学mooc《JAVA核心技术》