文件上传下载以及读取压缩文件里面的指定内容等详细用法

这两个常用的方法是:read(),从此输入流中读取一个数据字节;read(byte[] b),从此输入流中将最多b.length个字节的数据读入一个byte数组中;read(byte[] b,int off,int len),从此输入流中将最多len个字节的数据读入一个byte数组中;write(byte[] b),将b.length个字节从指定byte数组写入此文件输出流中;write(byte [] b,int off,int len),将指定byte数组中从偏移量off开始的len个字节写入此文件输出流;write(int b),将指定字节写入此文件输出流;close(),关闭流。
①拷贝文件,一个一个字节的拷贝

@Test
public void t1() throws Exception{
    FileInputStream fis = new FileInputStream("H:\\javaio\\copy01.txt");//读取文件
    FileOutputStream fos = new FileOutputStream("H:\\javaio\\copy02.txt");//写
    int n;
    //这里面是n等于读取到的字节数,当读取到末尾时,返回的是-1,所以这里用!=-1来表示没有读到文件末尾
    while((n = fis.read()) != -1){
        fos.write(n);//读取完毕写入  H:\\javaio\\copy02.txt"
    }
    fos.close();
    fis.close();
}

②拷贝视屏:1024个字节1024个字节的拷贝

@Test
    public void t2() throws IOException{
        FileInputStream fis = new FileInputStream("H:\\javaio\\测试.avi");
        FileOutputStream fos = new FileOutputStream("H:\\javaio\\测试copy.avi");
        byte[] n = new byte[1024];
        int len;
        //这里是1024个字节的读取,所以在read()里面放的是每次读取的字节数
        while((len = fis.read(n)) != -1){
            fos.write(n, 0, len);
        }
        fos.close();
        fis.close();
    }

③利用FileOutputStream将数据写入文件

@Test
    public void t3() throws Exception{
        FileOutputStream fos = new FileOutputStream("H:\\javaio\\test1.txt");
        fos.write(98);//这里写入的是ASCII码
        //注意这里的getBytes(),这个是String类里面的方法,使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
        fos.write("sadsadsada".getBytes());
        fos.close();
    }

④实现对文件内容的追加,即不会覆盖掉原来的内容,在末尾继续添加

@Test
    public void t4() throws Exception{
        //从基础流考虑追加,在以后遇到的一些追加中,都要从基础流来考虑,即都是在FileOutputStream这个基础流上来实现添加的
        FileOutputStream fos = new FileOutputStream("H:\\javaio\\qianfengwrite1.txt",true);
        fos.write(98);
        fos.write("sadsadsada".getBytes());
        fos.close();
    }
⑤对文件的读取

@Test
    public void t5() throws Exception{
        FileInputStream fis = new FileInputStream("H:\\javaio\\qianfengwrite1.txt");
        int len;
        while((len = fis.read()) != -1){
            System.out.print((char)len);
        }
        fis.close();
    }

 

 

例题:将E盘的文本文档的内容复制到c盘中
public static  void main(String[]args){
        try {
            FileInputStream   in=new FileInputStream("E:\\ee\\title.txt");
            FileOutputStream  out=new FileOutputStream("C:\\复制.txt");
            
            byte[]b=new byte[12];
            int len=0;
            while((len=in.read(b))!=-1){
                out.write(b, 0, len);
            }
            
            in.close();
            out.close();
        } catch (Exception e) {
            
            e.printStackTrace();
        }

用字节流FileInputStream和FileOutputStream来读写文件


public class File_Stream {
    public static void main(String[] args) throws IOException {
        Scanner sca=new Scanner(System.in);
 
        //写文件
        System.out.print("请输入文件名:");
        String name=sca.next();
        File file=new File(name+".txt");//文件名        相对路径(项目名根目录下)
//      FileOutputStream fs=new FileOutputStream(file);                //如果文件存在 覆盖
        FileOutputStream fos=new FileOutputStream(file,true);//true表示追加,如果文件存在 向里面继续添加内容
        System.out.println("请输入写入的内容:");
        String str=sca.next();
        byte bytes[]=str.getBytes();         //FileOutputStream 是基于字节流  把要写入的信息 保存到字节数组中
        fos.write(bytes,0,bytes.length);//将字节数组中全部内容写到文件中   从0—数组的长度
        fos.close();//关闭流
        System.out.println("文件写入成功!");
 
        //读文件
        FileInputStream fis=new FileInputStream(file);
        byte bt[]=new byte[1024];//1KB       每次最多读取的1KB  根据文件大小而定
        int temp=0;
        while((temp=fis.read(bt))!=-1){    //将数据保存到数组(缓冲区)中 并返回读取的字节数  -1表示读完了
            System.out.println(new String(bt,0,temp));//输出数组中保存内容 按照每次读取的字节数
        }
        fis.close();
    }
}

用字节流FileInputStream和FileOutputStream来Copy文件

package FileStream;
 
import java.io.*;
 
public class File_Copy {
    public static void main(String[] args) throws IOException {
        File file=new File("dome.txt");
        if(!file.isFile()){    //判断文件是否存在
            System.out.println("该文件不存在,无法Copy!");
            return;
        }
 
        FileInputStream fis=new FileInputStream(file);   //"src\\"+file.getName()
        FileOutputStream fos=new FileOutputStream("src/"+file.getName());//把文件拷(输出)到src下
 
        byte bytes[]=new byte[1024];
        int temp=0;  //边读边写
        while((temp=fis.read(bytes))!=-1){  //读
            fos.write(bytes,0,temp);   //写
        }
        fis.close();
        fos.close();
        System.out.println("文件拷贝成功!");
    }
}

 ---------file常用的属性和方法-------

代码如下:


public class FileDemo {
     public static void main(String[] args){
         //构造函数File(String pathname)
         File f1 =new File("c:\\abc\\1.txt");
         //File(String parent,String child)
         File f2 =new File("c:\\abc","2.txt");
         //File(File parent,String child)
         File f3 =new File("c:"+File.separator+"abc");//separator 跨平台分隔符
         File f4 =new File(f3,"3.txt");
         System.out.println(f1);//c:\abc\1.txt

     }

 }

 

//***************************************************************************************************************************************************

 //通过上传文件的名字删除上传的文件(删除服务器上的文件)
        //strPath url  ,fileName 文件名
        public  void refreshFileList(String strPath,String fileName) {
            File dir = new File(strPath);
            File[] files = dir.listFiles();
            if (files == null)
            {
                System.out.println("该目录下没有任何一个文件!");
                return;
            }
            for (int i = 0; i < files.length; i++) {
                //一个目录则返回true isDirectory检查是不是文件夹  是返回true  
                if (files[i].isDirectory()) {
                    refreshFileList(files[i].getAbsolutePath(),fileName);
                }else {
                    //获取到每一个文件的根目录转换成小写
                    String strFileName = files[i].getAbsolutePath().toLowerCase();
                    //
                    if(strFileName.endsWith(fileName)){
                        System.out.println("正在删除:" + strFileName);
                        files[i].delete();
                    }
                }
            }
        }

 

//删除本地的文件夹

String path = Config.version_url+fileName;//文件所在的目录
    File file = new File(path);
    if(file.exists()&&(!file.isDirectory())){
        file.delete();
    }

//**********************************************************************************************************************************************
创建方法

String path ="E:\\data\\a\\b\\c";
Boolean result = new File(path).mkdir();//当c的父目录存在时 返回true当c的父目录不存在时 返回false
System.out.println(result);

//******************************************************************************************************************************

String path ="E:\\data\\a\\b\\c";
Boolean result = new File(path).mkdirs();//当c父的目录不存在时,mkdirs会创建父目录 返回true
System.out.println(result);
System.in.read();
//******************************************************************************************************************************

1.boolean createNewFile() 不存在返回true 存在返回false
2.boolean mkdir() 创建目录
3.boolean mkdirs() 创建多级目录

String path ="D:\\data\\a\\b\\c";
        File file = new File(path); //读取文件
        Boolean result = file.mkdirs(); //创建多级目录
        /**
         *  .exists()测试此抽象路径名表示的文件或目录是否存在.文件或目录存在时,返回true;否则返回false;
         *  .isDirectory()是检查一个对象是否是文件夹返回值是boolean类型的。如果是则返回true,否则返回false。
                                  调用方法为:对象.isDirectory()  无需指定参数。
         *  
         */
        
        if(!file.exists() && !file.isDirectory()){
            System.out.println("文件不存在");
        }
        System.err.println(result); //true
//*******************************************************************************************************************************************************

文件下载

       @RequestMapping(value="/appDownloadImg.action",method= {RequestMethod.GET})
        @ResponseBody

        //downloadURL 要下载文件名字
        public  Response appDownloadImg(String downloadURL,HttpServletResponse response){
            Response result = new Response ();
            try{
                if(StringUtils.isEmpty ( downloadURL )){
                    result.setError ( "下载路径不可以为空!" );
                    result.setSuccess ( false );
                    return  result;
                }
                String file_url = Config.upload_url+downloadURL;//文件得根目录 如:Root/a/ddd/dasdasdasd_sdad.zip
                File f = new File(file_url);
                if(f.exists()){
                    response.setHeader("content-type", "application/octet-stream");
                    response.setContentType("application/octet-stream");
                    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadURL, "UTF-8"));
                    byte[] buffer = new byte[1024];
                    FileInputStream fis = null;
                    BufferedInputStream bis = null;
                    try {
                        fis = new FileInputStream(f);
                        bis = new BufferedInputStream(fis);
                        OutputStream os = response.getOutputStream();
                        int i = bis.read(buffer);
                        while (i != -1) {
                            os.write(buffer, 0, i);
                            i = bis.read(buffer);
                        }
                    }
                    catch (Exception e) {
                        throw new Exception(e.getMessage());
                    }
                    finally {
                        if (bis != null) {
                            try {
                                bis.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        if (fis != null) {
                            try {
                                fis.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
                response.setHeader("content-type","application/json");
                result.setSuccess(false);
                result.setError("下载失败");
                try{
                    response.getWriter().println( JSONObject.fromObject(result).toString());
                }catch(Exception e1){
                    e1.printStackTrace();
                }
            }
            result.setError ( "下载成功!" );
           return  result;
        }

JAVA遍历文件下的所有文件和文件夹

@Test
    public void traverseFolder1( ) {
        String path = "D:\\TEST";
        int fileNum = 0;
        int folderNum = 0;
        int foldeNum = 0;
        File file = new File(path);
        if (file.exists()) {
            LinkedList<File> list = new LinkedList<File>();

            //list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组

            //listFiles()方法是返回某个目录下所有文件和目录的绝对路径,返回的是File数组
            File[] files = file.listFiles();
            for (File file2 : files) {
                if (file2.isDirectory()) {
                    System.out.println("文件夹:" + file2.getAbsolutePath());
                    list.add(file2);
                    foldeNum++;
                } else {
                    System.out.println("文件:" + file2.getAbsolutePath());
                    fileNum++;
                }
            }
            File temp_file;
            while (!list.isEmpty()) {
                temp_file = list.removeFirst();//删除第一个元素,也就是找到数组中的第一个元素返回一个File去判断,说白了就是循环分别找到每个文件下面对应的是文件还是文件夹,如果循环下一级还是文件夹则继续循环直到结束(思想就是一层一层去判断查找知道找到所有的文件和文件夹)
                files = temp_file.listFiles();
                for (File file2 : files) {
                    if (file2.isDirectory()) {//如果是个目录(文件夹)则返回true
                        System.err.println("文件夹:" + file2.getAbsolutePath());
                        list.add(file2);
                        folderNum++;
                    } else {//输出文件
                        System.out.println("文件:" + file2.getAbsolutePath());//返回文件的完整路径。
                        fileNum++;
                    }
                }
            }
        } else {
            System.out.println("文件不存在!");
        }
        System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);
    }

 例子:

LinkedList list=new LinkedList();
list.add("a");
list.add(1);
list.add('b');
String kk=(String) list.removeFirst(); // (String) 这代表强制转换 原理同上
char   k=(char) list.removeLast();//删除最后一个元素
System.out.println(kk);
System.out.println(k);
}
}
结果为:

a
b

//读取文件按指定的格式输出到指定的位置

public static List readFile() throws FileNotFoundException{  
        //读
        File file = new File("D:\\新建文本文档 (5).txt");  
        //写
        FileOutputStream fos = new FileOutputStream("D:\\result.txt");
         List list = new ArrayList();  
        try {  
            FileInputStream fileInputStream = new FileInputStream(file);  
            InputStreamReader io = new InputStreamReader(fileInputStream,"gbk");  
            BufferedReader reader = new BufferedReader(io);  
            String terminalInfo = null;  
            while((terminalInfo=reader.readLine())!=null){//循环读取每一行内容
                list.add(terminalInfo);  //放入到集合当中
            }  
            reader.close();  
            io.close();  
            fileInputStream.close();  
            BufferedOutputStream bOutputStream = new BufferedOutputStream(fos);//写
            String result = "";
            for(int  i = 0;i < list.size();i++)
            {
                String add  = "INSERT INTO `excel_title` VALUES (%s, '%s', '%s');\n";//按指定格式拼接
                String[] tmp = list.get(i).toString().split("        ");
                String id = tmp[0];
                String title = tmp[1];
                String insert = String.format(add, (i + 1) + "",id,title);
                
                result = result + insert;
            }
            
            bOutputStream.write(result.getBytes("gbk"));//写入
            bOutputStream.flush();
            bOutputStream.close();
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }finally{  
        }  
        return list;  
          
    }

 

//*******************************************************************************************************************************************************

//将文件大小转换转换成 "B", "KB", "MB", "GB", "TB"

public static String readableFileSize(long size) {
        if (size <= 0) return "0";
        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};//直接给数组赋值
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
        return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
    }

删除方法

1.boolean delete()
2.boolean deleteOnExit() 文件使用完成后删除

复制代码 代码如下:

import java.io.File;
import java.io.IOException;

public class FileDemo2 {
    public static void main(String[] args){
        File f =new File("d:\\1.txt");
        try {
            System.out.println(f.createNewFile());//当文件存在时返回false
            System.out.println(f.delete());//当文件不存在时返回false
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}



列出磁盘下的文件和文件夹

 代码如下:

public class FileDemo3 {
     public static void main(String[] args){
         File[] files =File.listRoots();
         for(File file:files){
             System.out.println(file);
             if(file.length()>0){
                 String[] filenames =file.list();
                 for(String filename:filenames){
                     System.out.println(filename);
                 }
             }
         }
     }

 }


文件过滤

代码如下:

import java.io.File;
 import java.io.FilenameFilter;
 public class FileDemo4 {
     public static void main(String[] args){
         File[] files =File.listRoots();
         for(File file:files){
             System.out.println(file);
             if(file.length()>0){
                 String[] filenames =file.list(new FilenameFilter(){
                     //file 过滤目录 name 文件名
                     public boolean accept(File file,String filename){
                         return filename.endsWith(".mp3");
                     }
                 });
                 for(String filename:filenames){
                     System.out.println(filename);
                 }
             }
         }
     }

 }


File[]  listFiles()

File[] listFiles(FilenameFilter filter)

利用递归列出全部文件

代码如下:

public class FileDemo5 {
    public static void main(String[] args){
        File f =new File("e:\\音樂");
        showDir(f);
    }
    public static void showDir(File dir){
        System.out.println(dir);
        File[] files =dir.listFiles();
        for(File file:files){
            if(file.isDirectory())
                showDir(file);
            else
                System.out.println(file);
        }
    }

}

 

//读取压缩文件里面的文件,不需要解压 ,读取指定得文件和内容。

假如我们读取的是 “D:\\测试1.zip”;测试文件该文件下面有四个文件我们只读取 “20887027411111110156_20180105_业务明细.csv” 这个文件

 

 该文件里面的内容:

 

 我们只要支付宝交易号,其余的不要我们应该怎么读取?

 @Test
    public  void  sss() throws  Exception{
        //获取文件输入流
        FileInputStream input = new FileInputStream("D:\\测试1.zip");
        //获取ZIP输入流(一定要指定字符集Charset.forName("GBK")否则会报java.lang.IllegalArgumentException: MALFORMED)
        ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
        //定义ZipEntry置为null,避免由于重复调用zipInputStream.getNextEntry造成的不必要的问题
        ZipEntry ze = null;
        //循环遍历
        while ((ze = zipInputStream.getNextEntry()) != null) {
            String[] split = ze.getName().split("_");
             if(split.length == 3){
                 if("业务明细".equals(split[2].substring(0,split[2].lastIndexOf(".")))){
                     System.out.println("文件名:" + ze.getName() + " 文件大小:" + ze.getSize() + " bytes");
                     BufferedReader br = new BufferedReader(new InputStreamReader(zipInputStream,Charset.forName("GBK")));
                     String line;
                     //内容不为空,输出
                     List<String> list = new ArrayList<>();
                     while ((line = br.readLine()) != null) {
                         String strr = line.trim();
                         String[] abc = strr.split(",");
                         String businesNumbers = abc[0];
                         //是数字开头并且是不是“#号”开头
                         if(isNumbers(businesNumbers) && !businesNumbers.contains("#") ){
                             System.out.println("支付宝交易号:"+businesNumbers);
                         }
                     }
                 }
             }
        }
        //一定记得关闭流
        zipInputStream.closeEntry();
        input.close();
    }
 
    /**
     * 判断是不是数字
     * @param businesNumbers
     * @return
     */
    public  static  boolean isNumbers(String businesNumbers){
        Pattern pattern = Pattern.compile("[0-9].*") ;
        Matcher isNum = pattern.matcher(businesNumbers.charAt(0)+"");
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

打印结果:

支付宝交易号:2018010521001004610298615123    
支付宝交易号:2018010521001004610298615123    
支付宝交易号:2018010521001004610298046342    
支付宝交易号:2018010521001004610298046342    
支付宝交易号:2018010521001004610298046371

 

 


移动文件

找出d盘下所有的 .java 文件,拷贝至 c:\jad 目录下,并将所有文件的类型由.java 修改为.jad 。

代码如下:


public class Test5 {
    public static void main(String[] args){
        File f1 = new File("d:\\");
        moveFile(f1);
    } public static void moveFile(File dir){
    File[] files=dir.listFiles();
    for(File file:files){
        if(file.isDirectory())
            moveFile(file);
        else{
            if(file.getName().endsWith(".java"))
                file.renameTo(new File("c:\\jad\\"+
            file.getName().substring(0,file.getName().lastIndexOf('.'))+".jad"));
            }
        }
    }
}

1 常用方法
       a、createNewFile方法

  public boolean createNewFile() throws IOException

  该方法的作用是创建指定的文件。该方法只能用于创建文件,不能用于创建文件夹,且文件路径中包含的文件夹必须存在。

       方法介绍:当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

       使用: File file = new File("D:\\test\\1.txt"); boolean res = file.createNewFile(); if(!res)System.out.println("创建失败!");
       如果D:/test 目录下没有 1.txt文件,则创建该文件;如果没有test目录,直接抛出异常,如果1.txt已经存在,那么文件创建失败。

       可以得知,createNewFile() 方法,根据抽象路径创建一个新的空文件,当抽象路径制定的文件存在时,创建失败。


  b、delete方法

  public boolean delete()

  该方法的作用是删除当前文件或文件夹。如果删除的是文件夹,则该文件夹必须为空。如果需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写一定的逻辑代码实现。

  c、exists方法

  public boolean exists()

  该方法的作用是判断当前文件或文件夹是否存在。

  d、getAbsolutePath方法

  public String getAbsolutePath()

  该方法的作用是获得当前文件或文件夹的绝对路径。例如c: est1.t则返回c: est1.t.

  e、getName方法

  public String getName()

  该方法的作用是获得当前文件或文件夹的名称。例如c: est1.t,则返回1.t.

  f、getParent方法

  public String getParent()

  该方法的作用是获得当前路径中的父路径。例如c: est1.t则返回c: est.

  g、isDirectory方法

  public boolean isDirectory()

  该方法的作用是判断当前File对象是否是目录。

  h、isFile方法

  public boolean isFile()

  该方法的作用是判断当前File对象是否是文件。

  i、length方法

  public long length()

  该方法的作用是返回文件存储时占用的字节数。该数值获得的是文件的实际大小,而不是文件在存储时占用的空间数。

  j、list方法

  public String[] list()// 并不包含其属性。

  该方法的作用是返回当前文件夹下所有的文件名和文件夹名称。说明,该名称不是绝对路径。

  k、listFiles方法

        public File[] listFiles()

  该方法的作用是返回当前文件夹下所有的文件对象。包含其属性。

 

      获取文件的名字:文件.getOriginalFilename ();

 

       //获取文件的大小
        Long fileSize = apk_name.getSize();     


  l、mkdir方法

  public boolean mkdir()

  该方法的作用是创建当前文件文件夹,而不创建该路径中的其它文件夹。假设d盘下只有一个test文件夹,则创建d: estabc文件夹则成功,如果创建d:a文件夹则创建失败,因为该路径中d:a文件夹不存在。如果创建成功则返回true,否则返回false.

  m、mkdirs方法

  public boolean mkdirs()

  该方法的作用是创建文件夹,如果当前路径中包含的父目录不存在时,也会自动根据需要创建。

  n、renameTo方法

  public boolean renameTo(File dest)

  该方法的作用是修改文件名。在修改文件名时不能改变文件路径,如果该路径下已有该文件,则会修改失败。

  o、setReadOnly方法

  public boolean setReadOnly()

  该方法的作用是设置当前文件或文件夹为只读。
      p、File(String pathname)
     public File(String pathname)
     可以使用绝对路径也可以使用相对路径。
    q、File(String parent, String child)
    public File(String parent, String child)

    也可以使用父路径和子路径结合,实现代表文件路径。
2 常用属性
CanWrite():返回文件是否可写。 

CanRead():返回文件是否可读。

CompareTo(File pathname):检查指定文件路径间的顺序。

Delete():从文件系统内删除该文件。

DeleteOnExit():程序顺利结束时从系统中删除文件。

Equals(Object obj):检查特定对象的路径名是否相等。

Exists():判断文件夹是否存在。

GetAbsoluteFile():返回文件的完整路径。

GetAbsolutePath():返回文件的完整路径。

GetName():返回文件名称。

GetParent():返回文件父目录路径。

GetPath():返回文件的潜在相对路径。

GetParentFile():返回文件所在文件夹的路径。

HashCode():返回文件哈希码。

IsDirectory():判断该路径指示的是否是文件夹。

IsFile():判断该路径指示的是否是文件。

LastModified() :返回文件的最后修改时间标志。

Length():返回文件长度。

List():返回文件和目录清单。

Mkdir():生成指定的目录。

RenameTo(File dest):更名文件。

SetReadOnly():将文件设置为可读。

ToString():返回文件状态的字符串。

ToURL():将文件的路径字符串转换成URL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-03-14 11:15  UnmatchedSelf  阅读(1615)  评论(0编辑  收藏  举报

导航