10-Java的File和IO

File

File概述和构造方法

File是文件和目录路径名的抽象表示。

  • 文件和目录可以通过FIle封装为对象的
  • 对File,其封装的并不是一个真正的文件,仅仅是一个路径名,可以存在也可以不存在,将来是要通过具体的操作把这个路径的内容转换为具体存在的。
    10-Java的File和IO_第1张图片
File f = new File("/home/cenjw/java.txt");

File类创建功能

10-Java的File和IO_第2张图片

// 创建文件
File f = new File("./javaTest.txt");
 f.createNewFile();

// 创建目录
File f2 = new File("/home/cenjw/javase");
f2.mkdir();

// 创建多级目录
File f3 = new File("/home/cenjw/javaee/html/imgs");
f3.mkdirs();

File类判断与获取功能

10-Java的File和IO_第3张图片
10-Java的File和IO_第4张图片

字节流

IO流概述

  • IO:输入/输出
  • 流:抽象概念,对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
    • 常见的应用:文件复制、文件上传、文件下载

IO流分类

  • 按数据的流向
    • 输入流:读数据
    • 输出流:写数据
  • 按数据类型
    • 字节流:字节输入流;字节输出流
    • 字符流:字符输入流;字符输出流

tips
一般来说,IO流是按照数据类型分的

两种流都在什么情况下使用?

  • 如果数据通过记事本打开,我们还能读懂内容,就使用字符流;否则使用字节流。不知道流类型,则使用字节流

字节流写数据

  • InputStream:表示字节输入流的所有类的超类
  • OutputStream:表示字节输出流的所有类的超类
  • 子类特点:子类名称都是以其父类名作为子类名的后缀
    FileOutputStream(String name):创建文件输出流以指定的名称写入文件
    字节输出流写数据的步骤:
  • 创建字节输出流对象(1.调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
  • 调用字节输出流对象的写数据方法
  • 释放资源(关闭此文件输出流并释放与此相关的任何系统资源)

字节流写数据的3中方式
10-Java的File和IO_第5张图片

字节流写数据如何换行?

  • 写完数据后加换行符
    • windows: \r\n
    • linux: \n
    • mac: \r

字节流写数据如何实现追加写入呢?

FileOutputStream file = new FileOutputStream(pathname, true);

字节流读数据

一次读一个字节
FileInputStream(String name)
使用字节输入流读数据的步骤

  • ① 创建字节输入流对象
  • ② 调用字节输入流对象的读数据方法
  • ③ 释放资源
        FileInputStream file = new FileInputStream("D:\\myMajor\\j2se\\fos.txt");

        int by;
        while ((by = file.read()) != -1)
        {
            System.out.print((char) by);
        }

        file.close();

一次读一个字节数组

        FileInputStream stream = new FileInputStream("D:\\myMajor\\j2se\\fos.txt");

        byte[] bys = new byte[1024]; // 1024及其整数倍
        int len;
        while ((len = stream.read(bys)) != -1) {
            String str = new String(bys, 0, len);
            System.out.println(str);
        }
        stream.close();

字节缓冲流

字节缓冲流:

  • BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
  • BufferedlnputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
  • 构造方法:
    字节缓冲输出流:BufferedOutputStream(OutputStream out)字节缓冲输入流: BufferedInputStream(InputStream in)

为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

  • 字节缓冲仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象操作
// 写
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("xxx.txt"));
out.write("hello world".getBytes());
// 读
BufferedInputStream in = new BufferedInputStream(new FileInputStream("xxx.xxx"));
// 1
int b;
while ((b=in.read())!=-1) {
	print((char) b);
}
//2
byte[] bys = new byte[1024];
int len;
while((len=in.read(bys))!=-1) {
	String str = new String(bys, 0, len);
	print(str);
}

字符流

为什么会出现字符流?

答:由于字节流操作中文不方便,所以Java提供字符流
字符流=字节流+编码表
用字节流复制文本文件时也有中文,但没问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文?
汉字在存储时,无论选择何种编码存储,第一个字节都是负数

字符串中编/解码问题

编码

  • byte[] getBytes(): 默认字符集
  • byte[] getBytes(String charsetName):使用指定字符集
    解码
  • String(byte[] bytes):默认字符集解码
  • String(byte[] bytes, String charsetName):指定字符集解码

字符流中的编码解码问题

字符流抽象基类

  • Reader:字符输入流的抽象类
  • Writer:字符输出流的抽象类
    字符流中和编码解码问题相关的两个类
  • InputStreamReader
    • InputStreamReader in = new InputStreamReader(new FIleInputStream(filename));
  • OutputStreamWriter
    • OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(filename));

字符缓冲流

BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"));
BufferedReader br = new BufferedReader(new FileReader("file.txt"));

字符缓冲流特有功能

字符缓冲流特有功能
BufferedWriter:

  • void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
    BufferedReader:
  • public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null

小结

字节流
10-Java的File和IO_第6张图片
10-Java的File和IO_第7张图片
字符流
10-Java的File和IO_第8张图片
10-Java的File和IO_第9张图片

你可能感兴趣的:(Java,eclipse,maven,java-ee,database)