文件流的实战应用

关于文件流:

文件字节输入流: FileInputStream类

  文件字节输入流可以从指定路径的文件中读取字节数据,文件字节输入流继承InputStream类,并且实现了读取输入流的各种方法

      创建文件字节输入流的构造方法:

      1.以File对象为参数创建FileInputStream

       new FileInputStream(File file)

  1. 以文件对象的绝对路径为参数创建FileInputStream实例

     new FileInputStream(String filePath)

文件字节输出流:  FileOutPutSteam

  文件字节输出流关联指定文件路径的文件,数据通过文件字节输出流以字节为单位输出并保存到文件中。文件字节输出流继承自OutputStream类,并实现OutputStream类的各种方法。

 

 创建文件字节输出流的构造方法语法如下:

  1.new FileOutPutStream(File file)

  2.new FileOutPutStream(String filepath)

 

字符输入流:Reader类

字符输入输出流 与 字节输入输出流有相同的功能,但传送数据的方式不一样,字节流以字节为单位传送数据,可以使任何类型的数据,例如文本、音频、视频、图片等。字符流以字符为单位传送数据,只能传送文本类型的数据。使用字符输入输出流的好处是,当读取中文时不会出现乱码问题,而使用字节输入输出流时,却不能保证这一点。

 

字符输出流类:writer类

文件字符输入流:FileReader 继承 Reader类

new FileReader(File file)
   
new FileReader(String path)

 

package com.zch.io;

import java.io.File;
import java.io.FileReader;

public class FileInAndOut {
    public static void main(String[] args) {
        //定义指定磁盘的文件的File对象
        File file = new File("D://word.txt");
        
        if(! file.exists()){
            System.out.println("对不起,不包含指定路径的文件");
        }else{
            //根据指定路径的File对象创建FileReader对象
            try {
                FileReader fr = new FileReader(file);
                
                char[] data = new char[23];         //定义char数组
                
                int length = 0;
                
                while((length = fr.read(data))>0){          //循环读取文件中的数据
                    String str = new String(data,0,length);         //根据读取文件的内容创建String 对象
                    System.out.println(str);                //输出读取内容
                }
                fr.close();                             //关闭流
                
                
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
}

 

文件字符输出流FileWriter

文件字符输出流继承自Writer类,提供了向文件输出的各种方法,数据通过文件字符输出流以字符为单位输出并保存到文件中

//创建指定文件
    File file=new File("path")
    
    try{
        if(!file.exists()){
            //如果指定的文件不存在,那么就新建文件
            file.createNewFile();   
        }
        FileReader fr=new FileReader("path")
        FileWriter fw=new FileWriter(file);//創建fileWriter對象
        while((length=fr.read()!=-1){//如果沒有读到文件末尾
            //向文件写入数据
            fw.write(length);
            
        }
              fr.close
              fw.close
    }

关于/和 \\ 的用法:

具体使用中都可以达到访问路径的效果,只不过有一点小区别

正斜杠的话,一般在配置文件路径时,指向下一个路径只要使用一个

例如:"c:/a/1.txt";

而反斜杠的话,在配置文件路径时,由于它本身在java中有特殊意义,作为转义符而存在,所以具体意义上的反斜杠要两个

例如:"c\\a\\1.txt";这里的第一个反斜杠是作为转义符存在的,第二个才是真正意义上的反斜杠

一般可以认为是"/"的作用等同于"\\"

在java中路径一般用"/"

windows中的路径一般用"\"

linux、unix中的路径一般用"/"

最好用“/”  因为java是跨平台的。“\”(在java代码里应该是\\)是windows环境下的路径分隔符,Linux和Unix下都是用“/”。而在windows下也能识别“/”。所以最好用“/”

File文件流常用方法:

/ 创建一个文件对象(可以是文件,可以是文件夹)
		File file = new File("e:/java_text.txt");
		// 基本属性
		boolean canWriter = file.canWrite();
		System.out.println("是否可写:" + canWriter);
		boolean canRead = file.canRead();
		System.out.println("是否可读:" + canRead);
		long size = file.length(); // 常用
		System.out.println("文件大小:" + size);
		boolean isFile = file.isFile(); // 常用
		System.out.println("是否是文件:" + isFile);
		boolean isDirectory = file.isDirectory();
		System.out.println("是否是文件夹:" + isDirectory);
		String filename = file.getName(); // 常用
		System.out.println("文件的名称:" + filename);
		String absolutePath = file.getAbsolutePath(); // 常用
		System.out.println("文件的绝对路径:" + absolutePath);
		String filepath = file.getPath();
		System.out.println("文件的绝对路径:" + filepath);
		boolean isExists = file.exists(); // 常用
		System.out.println("是否存在:" + isExists);
		boolean isDelete = file.delete(); // 常用
		System.out.println("是否已经被删除:" + isDelete);
		boolean isCreate = file.createNewFile();
		System.out.println("创建了没有:" + isCreate);

File 文件流实战:

file流实现复制文件夹:

需求: 将一个文件夹复制一份新的文件夹,因为这个原文件夹中既有文件又有文件夹,所以需要进行分开复制

package com.example.File;/*
 * Copyright 2013- Smartdot Technologies Co., Ltd. All rights reserved.
 * SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 */

import java.io.*;
import java.lang.reflect.Field;

/**
 * 通过File流实现文件的复制,还可以复制文件夹
 * @author <a href="mailto:heyf@smartdot.com.cn">heyf</a>
 * @version 1.0,
 * @class
 * @date
 * @see
 */
public class CopyFile {
    public static void main(String[] args) {
        File sourceFile =null;
        File desFile=null;

        String sourceFolder="D:/复制文件夹";
        String copyFolder="D:/cody";

        //实例化一个文件夹
        sourceFile =new File(sourceFolder);
        /**exists() 无论sourceFile是文件还是文件夹只要存在->true
         * isDirectory() 如果sourceFile是文件夹存在->true
         * isFile() sourceFile存在并且是一个文件的时候才会返回True
         */
        if(!sourceFile.exists()||!sourceFile.isDirectory()){
            System.out.println("源文件夹不存在");
        }else{
            desFile =new File(copyFolder);
            /**
             * mkdir:只能创建一层目录,不能带多级目录
             * mkdirs:可以创建完成的目录
             * 在使用mkdir()的时候可以配合getFileDir()来使用,如果知道完整路径,直接使用mkdirs比较好
             */
            desFile.mkdir();
            copy(sourceFile.listFiles(),desFile);
        }
    }

    /**
     * 创建copy方法,该方法用来接收文件数组和目标文件夹,把文件数组复制到目标文件夹下,如果目标文件夹不存在,那么通过mkdir来创建文件夹
     */
     public static void copy(File[] fl,File file){
         //如果复制的目标文件夹不存在
         if(!file.isDirectory()){
             //创建一个文件夹
             file.mkdirs();
         }
         for(int i=0;i<fl.length;i++){
             if(fl[i].isFile()){
                 try{
                     //将文件内容通过文件输入流的方式准备读取
                     FileInputStream fis=new FileInputStream(fl[i]);
                     
                     FileOutputStream fou=new FileOutputStream(new File(file.getPath()+File.separator+fl[i].getName()));

                     //在读写操作之前先知道数据流里面有多少个字节可以读取
                     int count=fis.available();
                     byte[] data=new byte[count];
                      //表示是否完整的读取整个文件或者读取完最后一个字符
                     if((fis.read(data))!=-1){
                         fou.write(data);
                     }
                 } catch (FileNotFoundException e) {
                     e.printStackTrace();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
             if(fl[i].isDirectory()){
                 File des=new File(file.getPath()+File.separator+fl[i].getName());
                 des.mkdirs();
                 //然后递归去看看文件内部是否还有文件
                 copy(fl[i].listFiles(),des);
             }

         }
     }
}

字符流的读取和写入(只能读取字符文件的信息):

//使用字符流读取文件
    public static void testReader() throws Exception{
        //创建文件对象
        File file = new File("e:/a/file.txt");
        //创建字符输入流对象
        Reader reader = new FileReader(file);
        //创建字符输出流对象
        File file2 = new File("e:/a/b/file_3.txt");
        Writer writer = new FileWriter(file2);
        char[] temp = new char[1000];
        int size =0;
        //通过循环边度编写
        do{
            size= reader.read(temp);  //读取字符内容
            if(size!=-1)
            {
                writer.write(temp, 0, size);
            }
        }while(size!=-1);
        //关闭
        writer.flush();
        writer.close();
        reader.close();
    }

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值