字节流,字符流

File

绝对路径:
1.window是 - 从盘符开始C:\xx\xx…
2. Linux是 - /xx/xx (从根目录开始)
相对路径:
会有一个参考对象 a.txt
参考值:/Users/bonnie/Desktop 相对路径是: a.txt
a.txt的真实路径为/Users/bonnie/Desktop/a.txt

常用API

传入文件路径,构造File对象
注意:new出来的File对象,只是在JVM内存中有一个对象,和本地磁盘有没有这个文件无关

File file = new File("a.txt");

传入父路径和子路径,共同构造File对象

File file = new File("b/c","d/a.txt");

获得file的绝对路径

String path = file.getAbsolutePath();

file对应的文件或者目录存不存在

boolean exists = file.exists();

测试此抽象路径名表示的文件是否是一个目录。

boolean a = file.isDirectory()

测试此抽象路径名表示的文件是否是一个标准文件

boolean a = file.isFile()

测试此抽象路径名表示的文件或目录是否存在。

boolean a = file.exists()

创建一个文件
file.exists 返回true,就表示存在,就不能创建新的
如果文件不存在,则创建该文件
如果文件存在,则不创建,也不会报错

boolean newFile = file.createNewFile();

创建一个目录

boolean mkdir = file.mkdir();

创建一个目录,并且将不存在的父目录一起创建

boolean mkdirs =file.mkdirs();

删除此抽象路径名表示的文件或目录。

boolean delete = file.delete();

返回上一级目录

File file = new File(".");

列出这个目录中的所有文件和目录 -> File对象

File[] files = file.listFiles();

列出file目录下,所有的文件和目录的名字 -> String对象

String[] list = file.list();

重写筛选方式

file.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return XXX
    }
});

例:
这里用lanbda表达式
只想保留文件,不想保留目录

File[] files = file.listFiles(p -> {
    return p.isFile();
});

只保留.txt结尾的文件

File[] files1 = file.listFiles(p -> {
    return p.getName().endsWith(".txt");
});

IO:Input/Output

1.以单位来分: 字节流 字符流
2.以层级来分: 底层流 包装流

字节流: InputStream/OutputStream
子类: FileInputStream/FileOutputStream
字符流: Reader/Writer

文件复制:
BufferedInputStream/BufferedOutputStream
文件内容读写:
BufferedReader/PrintWriter
FileReader/FileWriter
对象读写:
ObjectInputStream/ObjectOutputStream

注意:
1.IO所有跟文件相关的流中, 构造方法中需要File作为参数的都可以使用文件路径直接取代
2.字节流写和读都是以字节为单位的, 单个字节能不能正常显示出来, 是不确定的

Input:读取
Output:写入

字节流API

Input

创建方法

InputStream is = new FileInputStream(new File("a.txt"));
InputStream is1 = new FileInputStream("a.txt");

读一个字节

is.read();

循环遍历的例子:

int i ;
while ((i = is.read())!=-1){
    System.out.println(i);
}

读一个字符数组

int length = is.read(byte[]);

内容保存在byte[]中,返回读取的长度length

指定开始位置和长度
i

is.read(bytes,int 起始下标, int 长度);

注: 以上三个方法, 返回 -1 都标记着读到文件末尾

Output

OutputStream os = new FileOutputStream(new File("a.txt"));
OutputStream os1 = new FileOutputStream("a.txt");

如果文件不存在,就创建新文件并写入
如果文件存在,会清空原来的内容,然后再写入

OutputStream os = new FileOutputStream("a.txt");
os.write(int);

想保留原来的内容,需要在后面加true

os.write(int,true);

如果文件不存在,就会输出FileNotFoundException

写入字符数组

os.write(byte[]);

指定开始位置和长度

os.write(bytes,int 起始下标, int 长度);

复制

public void copy01() throws IOException {
        InputStream is = new FileInputStream("a.jpg");
        OutputStream os = new FileOutputStream("a_1.jpg");
        int len;
        byte[] bs = new byte[1024];
        while ((len=is.read(bs))!=-1){
            os.write(bs,0,len);
        }
     }   

缓冲 buffered

public void test02Copy() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a_1.txt"));
        int len;
        byte[] bs = new byte[1024];
        while ((len = bis.read(bs)) != -1) {
            bos.write(bs,0,len);
        }
        //手动刷新缓冲区
        //bos.flush();

        bis.close();
        bos.close();
        ;
    }

字符流: Reader/Writer

构造方法
reader

InputStreamReader(InputStream in, String charsetName) - 指定字符集
InputStreamReader(InputStream in) - 默认字符集
int	read() //读一个字符
int	read(char[] cbuf) //将字符读入数组。
int read(char[] cbuf, int off, int len) //将字符读入数组的一部分。- 了解

注: 以上三个方法, 返回 -1 都标记着读到文件末尾

writer

OutputStreamWriter(OutputStream out, String charsetName)
OutputStreamWriter(OutputStream out)
void write(char[] cbuf) 写入一个字符数组。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写入单个字符

包装字符流 -> 缓冲字符流

通常用来读写文件内容
BufferedReader(Reader)

String readLine(): 读取一整行, 返回null 标记读到文件末尾

PrintWriter(Writer)

1.只能清空原文件内容, 但是可以指定字符集
PrintWriter(String fileName, String csn)
2.可以在原文件上追加内容, 但是不可以指定字符集, 可以自动刷新缓冲区
PrintWriter(OutputStream out, boolean autoFlush)
3.可以在原文件上追加内容, 可以指定字符集, 可以自动刷新缓冲区
PrintWriter(Writer out, boolean autoFlush)

void print(Object): 写出内容, 不加换行
void println(): 写出内容, 并且换行

注意: 自动刷新的功能, 只有println方法具有
print方法 必须手动刷新

对象输入输出流:Object

对象 -> 文件[字节] : 序列化
文件[字节] -> 对象 : 反序列化

ObjectInputStream(InputStream)
Object readObject()

ObjectOutputStream(OutputStream)
void writeObject(Object)

Serializable: 可序列化的
接口中没有常量, 也没有抽象方法, 空接口
序列化接口没有方法或字段,仅用于标识可串行化的语义。

serialVersionUID: 给类添加固定的序列版本号
transient: 修饰的变量, 在序列化的时候, 会被忽略掉

属性集: Properties, 仅支持String类型的属性映射

extends Hashtable implements Map
key - value
构造方法

Properties pro = new Properties();

推荐使用的方法

void setProperty(String key, String value)
String getProperty(String key)

加载属性集:

void load(Reader)
void load(InputStream)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值