File--字节流--字符流

File类

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录创建、查找和删除等操作。

1.构造方法

public File(String pathname) :通过将给定的路径字符串创建新的 File实例。
public File(String parent, String child) :通过父路径字符串和子文件名创建新的 File实例。
public File(File parent, String child) :从File对象和子文件创建新的 File实例。

实例demo

// 文件路径名
String pathname = "D:\aaa.txt";
File file1 = new File(pathname);

// 文件路径名
String pathname2 = "D:\aaa\bbb.txt";
File file2 = new File(pathname2);

// 通过父路径和子路径字符串
String parent = "d:\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);

// 通过父级File对象和子路径字符串
File parentDir = new File("d:\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

注:

  1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
  2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

2.常用方法

2.1获取功能的方法
public String getAbsolutePath() :返回此File的绝对路径。
public String getPath() :将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。
public long length() :返回由此File表示的文件的长度。

实例demo

File f = new File("d:/aaa/bbb.java");
System.out.println("文件绝对路径:"+f.getAbsolutePath());
System.out.println("文件构造路径:"+f.getPath());
System.out.println("文件名称:"+f.getName());
System.out.println("文件长度:"+f.length()+"字节");
File f2 = new File("aaa");
System.out.println("目录绝对路径:"+f2.getAbsolutePath());
System.out.println("目录构造路径:"+f2.getPath());
System.out.println("目录名称:"+f2.getName());
System.out.println("目录长度:"+f2.length());

文件绝对路径:d:aaabb.java
文件构造路径:d:aaabb.java
文件名称:bbb.java
文件长度:0字节
目录绝对路径:F:javaStudyFinallyjavaStudy20191028studyjavaaaa
目录构造路径:aaa
目录名称:aaa
目录长度:0
2.2判断功能的方法
public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile() :此File表示的是否为文件。

实例demo(d盘下有一个名称为aaa的文件夹)

File f = new File("d:\aaa\bbb.java");
File f2 = new File("d:\aaa");
// 判断是否存在
System.out.println("d:\aaa\bbb.java 是否存在:"+f.exists());
System.out.println("d:\aaa 是否存在:"+f2.exists());
// 判断是文件还是目录
System.out.println("d:\aaa 文件?:"+f2.isFile());
System.out.println("d:\aaa 目录?:"+f2.isDirectory());

d:aaabb.java 是否存在:false
d:aaa 是否存在:true
d:aaa 文件?:false
d:aaa 目录?:true
2.3创建删除功能的方法
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

实例demo

// 文件的创建
File f = new File("aaa.txt");
System.out.println("是否存在:"+f.exists()); // false
System.out.println("是否创建:"+f.createNewFile()); // true
System.out.println("是否存在:"+f.exists()); // true
// 目录的创建
File f2= new File("newDir");
System.out.println("是否存在:"+f2.exists());// false
System.out.println("是否创建:"+f2.mkdir()); // true
System.out.println("是否存在:"+f2.exists());// true
// 创建多级目录
File f3= new File("newDira\newDirb");
System.out.println(f3.mkdir());// false
File f4= new File("newDira\newDirb");
System.out.println(f4.mkdirs());// true
// 文件的删除
System.out.println(f.delete());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
目录的遍历
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

IO流

根据数据的流向分为:输入流和输出流。(以内存为基准)
输入流 :把数据从其他设备上读取到内存中的流。
输出流 :把数据从内存 中写出到其他设备上的流。
根据数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。

输入流 输出流
字节流 字节输入流 InputStream 字节输出流 OutputStream
字符流 字符输入流 Reader 字符输出流 Writer

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无 法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

1.字节流

1.1 字节输出流(OutputStream)

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :off开始位置,len写入字节长度
public abstract void write(int b) :将指定的字节(ASCII码)输出流。
1.2 FileOutputStream类

OutputStream 有很多子类,我们从最简单的一个子类开始。
java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

构造方法

public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。
public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的File对象表示的文件。
public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。

实例demo

// 使用File对象创建流对象
File file = new File("a.txt");
FileOutputStream fos = new FileOutputStream(file);
// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("b.txt");

前两个构造方法,创建文件输出流时如果没有该文件会创建文件,有文件会清空该文件,后两个构造方法添加了判断“true” 表示追加数据, “false” 表示清空原有数据。

常用方法

写出字节: write(int b) 方法,每次可以写出一个字节数据,代码使用演示:

写出字节数组: write(byte[] b) ,每次可以写出数组中的数据,
写出指定长度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节
写出换行:Windows系统里,换行符号是
。

实例demo

// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 写出数据
fos.write(97); // 写出第1个字节
fos.write(98); // 写出第2个字节
fos.write(99); // 写出第3个字节
// 关闭资源
fos.close();

输出结果:
abc

// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 字符串转换为字节数组
byte[] b = "莫逸风".getBytes();
// 写出字节数组数据
fos.write(b);
// 关闭资源
fos.close();

输出结果:
莫逸风

// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 字符串转换为字节数组
byte[] b = "abcde".getBytes();
// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。
fos.write(b,2,2);
// 关闭资源
fos.close();

输出结果:
cd

// 写出一个换行, 换行符号转成数组写出
fos.write("
".getBytes());

回车符 和换行符 :
回车符:回到一行的开头(return)。
换行符:下一行(newline)。
系统中的换行:
Windows系统里,每行结尾是 回车+换行 ,即 ;
Unix系统里,每行结尾只有 换行 ,即 ;
Mac系统里,每行结尾是 回车 ,即 。从 Mac OS X开始与Linux统一。

1.3 字节输入流(InputStream)

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
1.4 FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

构造方法

FileInputStream(File file) : 由指定的 File对象来创建一个 FileInputStream。
FileInputStream(String name) : 以指定的名称来创建一个 FileInputStream。

创建一个流对象时该文件必须存在,如果没有该文件,会抛出FileNotFoundException 。

实例demo

// 使用File对象创建流对象
File file = new File("a.txt");
FileInputStream fos = new FileInputStream(file);
// 使用文件名称创建流对象
FileInputStream fos = new FileInputStream("b.txt");

常用方法

读取字节:int read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1 。
使用字节数组读取:int read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1 ,

实例demo

// 使用文件名称创建流对象
FileInputStream fis = new FileInputStream("read.txt");
// 定义变量,保存数据
int b ;
// 循环读取
while ((b = fis.read())!=‐1) {
System.out.print((char)b);
}
// 关闭资源
fis.close();

输出结果:
abcde

// 使用文件名称创建流对象.
FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde
// 定义变量,作为有效个数
int len ;
// 定义字节数组,作为装字节数据的容器
byte[] b = new byte[2];
// 循环读取
while (( len= fis.read(b))!=‐1) {
    // 每次读取后,把数组变成字符串打印
    System.out.println(new String(b));
}
// 关闭资源
fis.close();

输出结果:
ab
cd
ed(长度不够,最后一次字符数组只将第一个字符替换掉了,所以d还存在)

输出可改为
System.out.println(new String(b,0,len));// len 每次读取的有效字节个数

输出结果:
ab
cd
e

使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。

2.字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

2.1 字符输入流(Reader)

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len
写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个
数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。
2.2 FileReader类

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法

FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

实例demo

// 使用File对象创建流对象
File file = new File("a.txt");
FileReader fr = new FileReader(file);
// 使用文件名称创建流对象
FileReader fr = new FileReader("b.txt");

主要方法

读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1。
使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,
读取到末尾时,返回-1 ,

实例demo

// 使用文件名称创建流对象
FileReader fr = new FileReader("read.txt");
// 定义变量,保存数据
int b ;
// 循环读取
while ((b = fr.read())!=‐1) {
System.out.println((char)b);
}
// 关闭资源
fr.close();

输出结果:
莫
逸
风

// 使用文件名称创建流对象
FileReader fr = new FileReader("read.txt");
// 定义变量,保存有效字符个数
int len ;
// 定义字符数组,作为装字符数据的容器
char[] cbuf = new char[2];
// 循环读取
while ((len = fr.read(cbuf))!=‐1) {
System.out.println(new String(cbuf,0,len));
}
// 关闭资源
fr.close();

输出结果:
莫逸
风
2.3 字符输出流(Writer)

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len
写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个
数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。
2.4 FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法

FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。

实例demo

// 使用File对象创建流对象
File file = new File("a.txt");
FileWriter fw = new FileWriter(file);
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("b.txt");

主要方法

写出字符: write(int b) 方法,每次可以写出一个字符数据
写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream

实例demo

// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 写出数据
fw.write(97); // 写出第1个字符
fw.write('b'); // 写出第2个字符
fw.write('C'); // 写出第3个字符
fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。
fw.close;

输出结果:
abC田

// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 字符串
String msg = "莫逸风";
// 写出字符数组
fw.write(msg); //莫逸风
// 写出从索引1开始,2个字节。索引1是'逸',两个字节,也就是'逸风'。
fw.write(msg, 1, 2); // 逸风
// 关闭资源
fw.close();

输出结果:
莫逸风逸风

原文地址:https://www.cnblogs.com/zhangguangxiang/p/12065757.html