IO的分类
根据数据的流向可分为:输入流和输出流
输入流: 把数据从其他设备读取到内存中的流
输出流: 把数据从内存写出到其他设备上的流
根据数据的类型分为:字节流和字符流
字节流: 以字节为单位,进行输入和输出的流
字符流: 以字符为单位,进行输入和输出的流
顶级父类
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流(InputStream) | 字节输出流(OutputStream) |
字符流 | 字符输入流(Reader) | 字符输出流(Writer) |
字节流
字节输出流(OutputStream)
字节输出流的基本共性功能方法
- public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
- public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
- public void write(byte[] b) :将数组写入到输出流中
- public void write(byte[] b, int off, int len) :将指定长度的数组写入到输出流中
- public abstract void write(int b) :将b写入到输出流。
close方法,当完成流的操作时,必须调用此方法,释放系统资源。
FileOutputStream
构造方法
- public FileOutputStream(File file) :根据File对象创建FileOutputStream对象
- public FileOutputStream(String name) : 根据文件名创建FileOutputStream对象
例子
public class Main {
public static void main(String[] args) throws IOException {
//根据文件名创建文件输出流对象
FileOutputStream fos = new FileOutputStream("a.txt");
//根据File对象创建文件输出流对象(若文件不存在会自动创建文件)
File file = new File("b.txt");
FileOutputStream fos1 = new FileOutputStream(file);
//关闭输出流
fos.close();
fos1.close();
}
}
写出字节数据
- public void write(int b):将b写出到指定位置
- public void write(byte b[]):将字节数组写出到指定位置
- public void write(byte b[], int off, int len):将指定长度的字节数组写出到指定位置
例子
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
//在文件中存储--->a
fos.write(97);
//在文件中存储--->Hello
fos.write("Hello".getBytes());
//在文件中存储--->文
fos.write("文件".getBytes(),0,3);
//关闭文件输出流
fos.close();
}
}
追加续写
- public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。
- public FileOutputStream(String name, boolean append) :创建文件输出流以指定的名称写入文件。
true 表示追加数据, false 表示清空原有数据。
例子:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write("Hello".getBytes());
FileOutputStream fos1=new FileOutputStream("b.txt",true);
fos1.write("文件".getBytes());
//关闭输出流
fos.close();
fos1.close();
}
}
运行两次后的结果
a.txt---->Hello
b.txt---->文件文件
写出换行
- Windows系统里,每行结尾是 回车+换行 ,即 \r\n
- Unix系统里,每行结尾只有换行 ,即 \n
- Mac系统里,每行结尾是 回车,即 \r 。从 Mac OS X开始与Linux统一
例子
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write("文件".getBytes());
fos.write("\r\n".getBytes());
fos.write("输出".getBytes());
fos.close();
}
}
字节输入流
字节输入流的基本共性功能方法
- public void close() :关闭此输入流并释放与此流相关联的任何系统资源
- public abstract int read() : 从输入流读取数据的下一个字节
- public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组b中
FileInputStream
构造方法
- FileInputStream(File file) : 根据File对象创建FileInputStream对象
- FileInputStream(String name) : 根据文件名创建FileInputStream对象
例子
public class Main throws IOException{
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
// 使用文件名称创建流对象
FileInputStream fis1 = new FileInputStream("b.txt");
//关闭输入流
fis.close();
fis1.close();
}
}
读取字节数据
- public int read():每次可以读取一个字节的数据,转化为int类型,读取到文件末尾,返回 -1
- public int read(byte b[]):每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1
例子
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.txt");
int len=0;
//从文件中一个字节一个字节的读取数据
while ((len=fis.read())!=-1){
System.out.print((char) len);
}
//释放资源
fis.close();
System.out.println();
FileInputStream fis1=new FileInputStream("b.txt");
byte[] bytes=new byte[2];
//一次性读取bytes数组长度的数据
while ((fis1.read(bytes)!=-1)){
System.out.print(new String(bytes));
}
//释放资源
fis1.close();
}
}
注意: 若文件中输入中文则可能会乱码,因为一个中文字符在UTF-8下占3个字节,而一个字节一个字节的读取解析不了,就会造成乱码现象
字符流
字符输入流(Reader)
字符输入流的基本共性功能方法
- public void close() :关闭此流并释放与此流相关联的任何系统资源。
- public int read() : 从输入流读取一个字符。
- public int read(char[] chars) : 从输入流中读取一些字符,并将它们存储到字符数组 chars中 。
FileReader
构造方法
-
public FileReader(File file) : 根据File对象创建FileReader对象
-
public FileReader(String fileName) : 根据文件名称创建FileReader对象
例子
public class Main {
public static void main(String[] args) throws IOException {
//根据文件名创建对象(文件需存在)
FileReader fr = new FileReader("a.txt");
//根据File对象创建FileReader对象
File file=new File("c.txt");
file.createNewFile();
FileReader fr1=new FileReader(file);
//关闭输入流
fr.close();
fr1.close();
}
}
读取字符数据
- public int read():每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1
- public int read(char cbuf[]):每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1
例子:
public class Main {
public static void main(String[] args) throws IOException {
//文件需存在
FileReader fr = new FileReader("a.txt");
int len=0;
while ((len=fr.read())!=-1){
System.out.print((char)len);
}
fr.close();
System.out.println();
FileReader fr1 = new FileReader("b.txt");
char[] chars=new char[2];
while (fr1.read(chars)!=-1){
System.out.print(new String(chars));
}
fr1.close();
}
}
字符输出流(Writer)
字符输出流的基本共性功能方法
- void write(int c) 写入单个字符。
- void write(char[] cbuf) 写入字符数组。
- abstract void write(char[] cbuf, int off, int len) 写入字符数组的指定位置
- void write(String str) 写入字符串
- void write(String str, int off, int len) 写入字符串的指定位置
- void flush() 刷新该流的缓冲
- void close() 关闭此流,但要先刷新它
FileWriter
构造方法
-
public FileWriter(File file) : 根据File对象创建FileWriter对象
-
public FileWriter(String fileName) :根据文件名创建FileWriter对象
例子
public class Main {
public static void main(String[] args) throws IOException {
//根据文件名创建对象
FileWriter fw=new FileWriter("a.txt");
//根据File对象创建对象(若文件不存在会自动创建文件)
File file=new File("b.txt");
FileWriter fw1=new FileWriter(file);
//关闭输出流
fw.close();
fw1.close();
}
}
基本写出数据
- public void write(int c):每次可以写出一个字符数据
- public void write(char cbuf[]):写入字符数组
- public void write(char cbuf[], int off, int len):写入指定字符数组
- public void write(String str):写入字符串
- public void write(String str, int off, int len):写入指定长度的字符串
例子:
public class Main {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("a.txt");
//将a写入到a.txt文件中
fw.write(97);
//将"Hello"写入到a.txt文件中
fw.write("Hello".toCharArray());
//将"Ja"写入到a.txt中
fw.write("Java".toCharArray(),0,2);
//将"文件"写入到a.txt中
fw.write("文件");
//将"进"写入到a.txt中
fw.write("进程",0,1);
fw.close();
}
}