javaSE之文件类和字节字符流


活动地址:CSDN21天学习挑战赛

File类

File 类定义了一些与平台无关的方法来操作文件,File类主要用来获取或处理与磁盘文件相关的信息,像文件名、 文件路径、访问权限和修改日期等,还可以浏览子目录层次结构。

示例

利用File类查找某盘下的所有文件

package 查找文件;

import java.io.File;

/**
 * 查找e盘下所有文件
 */
public class FileManage {
    public static void main(String[] args) {
        findFile(new File("E:/"));
    }

    public static void findFile(File file){
        if(file ==null) return;
        //如果文件是目录
        if(file.isDirectory()){
            File[] files =file.listFiles();
            if(files !=null){//避免因系统文件而产生空对象
                for(File file1:files){
                    findFile(file1);//递归调用来找到每个文件夹类所有的txt文件
                }
            }
        }else{
            //如果文件是各类文件
            String name=file.getName().toLowerCase();
            System.out.println(file.getAbsolutePath());

        }
    }
}

字节流和字符流

  • 字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位);
  • 字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到中文(文本)的,用字符流好点(1Unicode = 2字节 = 16位);

  所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

  字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

  字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

最简单的区分字节流和字符流

万物皆文件,那就将文件在记事本里面打开,如果打开后能看的懂的就是字符流,如果看不懂那就是字节流

字节流应用示例

输入输出流复制文件

package 复制文件_输入输出流;

import java.io.*;

public class CopyFileDemo {
    public static void main(String[] args) {
        copy(new File("E:\\帅.txt"),new File("E:\\美.txt"));
    }
    private static void copy(File oldfile,File newfile){
        InputStream inputStream=null;
        OutputStream outputStream=null;
        try {
            inputStream = new FileInputStream(oldfile);
            outputStream=new FileOutputStream(newfile);
            StringBuilder stringBuffer =new StringBuilder();
            byte [] bytes=new byte[1024];
            int len;
            while ((len=inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
            }

            System.out.println("FINISH");

        } catch (IOException e){
            e.printStackTrace();
        } finally {
            if(inputStream!=null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outputStream!=null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

字符流应用示例

package 字符流;

import java.io.*;

/**
 *
 * 字符流:
 * 字符输出流:超类 Writer,对文件的操作使用使用子类:FileWriter
 * 字符输入流:超类 Reader,对文件的操作使用使用子类:FileReader
 * 每次操作的单位是一个字符
 * 文件字符操作流会自带缓存,默认大小为1024字节,在缓存满后,或手动刷新缓存,或关闭流时,会把数据写进文件
 *
 */
public class CharStreamDemo {
    public static void main(String[] args) {
        out();
        in();
    }
    private  static void in(){
        //1.确定目标文件
        File file =new File("E:\\帅.txt");
        //2.新建一个输入流对象
        try {
            FileReader fileReader =new FileReader(file);
            char[] cs =new char[1];
            StringBuffer stringBuffer =new StringBuffer();
            int len =-1;//表示每次读取的字节长度
            //把数据读取到字节数组中,并且返回读取的字节数,若字节数为-1,则表示已经读完
            while((len=fileReader.read(cs))!=-1){
                stringBuffer.append(new String(cs));
            }
            //关闭流
            fileReader.close();
            System.out.println(stringBuffer);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public static void out(){
        //1.确定目标文件
        File file =new File("E:\\帅.txt");
        //2.新建一个输出流对象
        try {
            FileWriter writer =new FileWriter(file,true);
            //append为true表示追加
            //3.确定要输出的内容
            String info ="狗头,狗头,";// \r\n 表示换行
            //4.向目标文件写入内容
            writer.write(info);
            System.out.println("写入成功");
            //5.关闭流
            writer.close();
            } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
            }


    }
}

字符字节流互相转换

package 字节字符流转换;

import java.io.*;

/**
 * OutputStreamWriter:可以将输出的字符流转换为字节流的输入形式
 * InputStreamReader:可以将输入的字节流转换为字符流的输入形式
 */
public class ChangeStreamDemo {
    public static void main(String[] args) throws FileNotFoundException {
        InputStream in = new FileInputStream("E:\\帅.txt");
        OutputStream out = new FileOutputStream("E:\\帅.txt",true);
        writer(out);
        read(in);
    }
    private static void writer(OutputStream out){
        Writer writer =new OutputStreamWriter(out);
        try {
            writer.write("匡同帅");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void read(InputStream in){
        //将字节流转换为字符流,方便文本的写入
        Reader reader =new InputStreamReader(in);
        char[] cs =new char[1024];
        int len=-1;
        try {
            if (((len=reader.read(cs))!=-1)){
                System.out.println(new String(cs,0,len));
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值