Java学习笔记(八)文件类与IO流,乱码原因与解决

一、文件类与IO流

1.File类

在Java.IO.File包下

File对象用于表示磁盘上的文件或者目录,使用File类中的方法操作File对象

构造方法:

File(文件路径\ 父目录,子文件\File文件(父目录)对象,子文件)

方法:

exists()–判断该文件对象是否存在

isFile() 判断对象表示的是否是文件,isDirectory()判断对象表示的是否是目录

getName() --获取文件或者目录名

canRead() 判断文件是否可读,canwrite–是否可写,canExecute()–是否可执行

lastModified()文件最后修改时间,返回的是Date类型的数据,new Date(数据).toString;

list(),返回当前目录下所有文件或者目录的名字,存放在String[]中

可以通过String类操作文件名,比如判断是否以指定字符串结尾,endsWith();

listFile(),返回当前目录下所有文件和目录对象,存放在File类类型的数组中,File[];

createNewFile(),判断是否存在该文件,若没有则可以使用该方法创建文件

delete() 删除当前文件

mkdir()判断该对象是否为目录,可以使用mkdir创建子目录,不能创建孙目录

mkdirs() 能在当前目录下创建孙目录

2、IO流

IO流作用:数据传输

根据传输方向可以分为输入流和输出流

根据传输处理单位可以分为字节流和字符流

根据功能可以分为:节点流,高级流

(1)字节输入流

inputStream抽象类,不能实例化,实现子类根据数据源不同划分

FileInputStream: 数据源是文件,数据源还可以是网络传输的数据(socket.getInputStream)

构造方法:

可以传入文件路径名,文件对象(推荐使用),append是true则传入的信息为追加

方法:

read(),每次读取一个字节的数据,i=一个字节

read(字节数组),将读取的数据存在字节数组中,String(字节,字符,字符串,空)

i=读取的字节数,还可以设置每次读取的长度read(字节数据,下标,下标);

 	byte[]  b=new  byte[5];
        int i=fin.read(b);

        while(i!=-1){
            System.out.println(new  String(b,1,i));
            i=fin.read(b);
        }

(2)字节输出流

outputStream–>实现类 FileOutputStream

String  s="好好学习,天天向上";
        byte[] bytes = s.getBytes();
        fout.write(bytes);

复制文件:即先读后写

byte[]  b=new  byte[1024];
        int i=fin.read(b);

        while(i!=-1){
              fout.write(b);
            i=fin.read(b);
        }

(3)字符流

InputStreamReader–字符输入流,OutputStreamWriter-- 字符输出流

实现类:以文件为数据源,FileReader,FileWriter

(4)字符流和字节流

字节流传输数据的单位是字节,字符是字符

字符流只能传输文本数据,字节能传输很多类型的数据

字符流写操作没有立即执行,等待刷新后执行,字节流写立即执行

(5)高级流

上述流只有基本读写功能

高级流是建立在节点流的基础上。

先建节点流,然后创建高级流。

转换流:

将字节流转为字符流,创建字节流,然后使用字符流的抽象父类

InputStreamReader,OutputStreamWriter

将创建的字节节点流作为参数传递给抽象父类

底层其实还是字节流,传输文本使用字节流方便

缓冲流

默认缓冲区大小:8192字节。

缓冲流读写原理:将读取的数据先临时存储在缓冲区;当缓冲区写满了,才会将缓冲区的数据写入目的端。减少了写的次数,

提高了IO效率,同时减少了对硬盘的损耗。

字节缓冲输入流:BufferedInputSteam

字节缓冲输出流:BufferedOutputStream

字符缓冲输入流:BufferedReader

字符缓冲输出流:BufferedWriter

使用方法同转换流

序列化流

对象存储或者传输时,必须是二进制形式,所以要进行序列化操作。

即需要将输入输出的数据单位转为类对象时:

序列化:输出对象–ObjectOutputSteam

反序列化:接收对象–ObjectInputStream

对象序列化前提:类必须实现序列化接口Serializable

为了防止修改该类时序列化版本号发生改变:

private static final long serialVersionUID=1L;

二、乱码

出现原因

机器只能识别二进制码,将字符编译为字节码需要使用字符集依据;

常见的字符集:gbk(英文、中文,windows默认–存储txt文件时注意转为utf—8,idea使用字符集为utf-8),utf-8(英文、中文、其他国家的符号)

所有字符集中都包含英文字符,且英文字符对应的编码都相同;所以英文不会乱码;

在读取文件时,文件的编码格式与java编译编码使用字符集不一致,输出的中文乱码;

解析时使用的字符集不含汉字编码

gbk中一个汉字占2个字节,utf-8中一个汉字占3个字节

并且对应的汉字编码不同,所以乱码

解决

使用一致的字符集

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值