IO(Input Output)用于实现对数据的输入与输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream),简单来说就是对于数据的输入/输出操作以流的方式进行。流是从起源到接收的有序数据,有了它程序就可以采用同一方式访问不同的输入/输出源。
1、按照数据流向,可以将流分为输入流和输出流,其中输入流只能读取数据、不能写入数据,而输出流只能写入数据、不能读取数据。
输入流(input):读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。 输出流(output):将程序(内存)数据输出到硬盘、光盘等存储设备中。
2、按照数据类型,可以将流分为字节流和字符流,其中字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
3、按照处理功能,可以将流分为节点流(低级流)和处理流(高级流),其中节点流可以直接从/向一个特定的IO设备(磁盘、网络等)读/写数据,也称为低级流,而处理流是对节点流的连接或封装,用于简化数据读/写功能或提高效率,也称为高级流。
节点流:可以从或向一个特定的地方(节点)读写数据。如FileInputStream,FileReader。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader、BufferedWriter。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
节点流是直接作用在文件上的流,可以理解为一个管道,文件在管道中传输。
处理流是作用在已有的节点流基础上,是包在节点流的外面的管道(可多层),其目的是让管道内的流可以更快的传输。
FileInputStream文件输入流。它通常用于对文件进行读取操作。
注意:这里读取中文会发生乱码,所以有用到读取中文(字符),可以使用字符流来操作。
//1、读取文件的路径
String filePath = "D:\\hwx.txt";
FileInputStream fileInputStream = null;
byte[] bytes = new byte[8];
int read = 0;
try {
//2、创建对象FileInputStream用来读取文件内容
fileInputStream = new FileInputStream(filePath);
//3、如果返回-1,表示文件读取完毕
while ((read = fileInputStream.read(bytes))!=-1){
System.out.print(new String(bytes,0,read));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//4、关闭流
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//1、读取文件的路径
String filePath = "D:\\hwxs.txt";
FileReader fileReader = null;
int read = 0;
char[] bytes =new char[1024];
try {
//2、创建对象FileReader用来读取文件内容
fileReader = new FileReader(filePath);
//3、如果返回-1,表示文件读取完毕
while ((read = fileReader.read(bytes))!=-1){
System.out.print(new String(bytes,0,read));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//4、关闭流 这样用if判断,是因为如果没有创建FileReader成功,去关闭会报错
if(fileReader!=null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//1、读取文件的路径
String filePath = "D:\\hwxs.txt";
BufferedInputStream bufferedInputStream = null;
byte[] bytes = new byte[8];
int read = 0;
try {
//2、创建对象BufferedInputStream用来读取文件
bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
//3、如果返回-1,表示文件读取完毕
while ((read = bufferedInputStream.read(bytes)) != -1) {
System.out.print(new String(bytes, 0, read));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4、关闭流,注意只需要关闭bufferedInputStream处理流,底层会自动关闭节点流。
if(bufferedInputStream!=null){
bufferedInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//1、读取文件的路径
String filePath = "D:\\hwxs.txt";
BufferedReader bufferedReader = null;
char[] bytes = new char[8];
int read = 0;
String line = null;//按行读取
try {
//2、创建对象FileInputStream用来读取文件内容
bufferedReader = new BufferedReader(new FileReader(filePath));
//3、如果返回-1,表示文件读取完毕
while ((read = bufferedReader.read(bytes)) != -1) {
System.out.print(new String(bytes, 0, read));
}
//3、如果返回null,表示文件读取完毕,按行读取(效率高)
while ((line = bufferedReader.readLine())!=null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4、关闭流,注意只需要关闭bufferedReader处理流,底层会自动关闭节点流。
if(bufferedReader!=null){
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//1、写入文件的路径
String filePath = "D:\\hwxs.txt";
FileOutputStream fileOutputStream = null;
try {
//根据项目需求,二选一
//2、创建对象FileOutputStream用来写入文件内容
fileOutputStream = new FileOutputStream(filePath);//会覆盖原来内容
fileOutputStream = new FileOutputStream(filePath,true);//在原来的内容后面进行追加
//3
//3.1、写入一个字节
fileOutputStream.write('A');
//3.2、写入字符串
fileOutputStream.write("JavaIo".getBytes());
//3.3、将len字节从位于偏移量off的指定字节数组写入此文件输出流
//write(byte b[], int off, int len)
fileOutputStream.write("JavaIo".getBytes(),0,"JavaIo".length());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//4、关闭流
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//1、写入文件的路径
String filePath = "D:\\hwxs.txt";
FileWriter fileWriter = null;
try {
//2、创建对象FileOutputStream用来写入文件内容(根据需求2选其一)
fileWriter = new FileWriter(filePath);//会覆盖原来内容
fileWriter = new FileWriter(filePath,true);//在原来的内容后面进行追加
//3
//3.1、写入一个字节
fileWriter.write('A');
//3.2、写入字符串
fileWriter.write("JavaIo流我最爱");
//3.3、将len字节从位于偏移量off的指定字节数组写入此文件输出流
//write(byte b[], int off, int len) 写入字符串指定部位
fileWriter.write("JavaIo流我最爱".toCharArray(),0,"JavaIo流我最爱".length());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4、关闭流
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//1、写入文件的路径
String filePath = "D:\\hwxs.txt";
//2、创建对象BufferedOutputStream用来写入文件
BufferedOutputStream bufferedOutputStream = null;
try {
//根据项目需求,二选一
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filePath));//会覆盖原来内容
// bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filePath,true));//在原来的内容后面进行追加
//3.1、写入一个字节
bufferedOutputStream.write('A');
//3.2、写入字符串
bufferedOutputStream.write("JavaIo".getBytes());
//3.3、将len字节从位于偏移量off的指定字节数组写入此文件输出流
//write(byte b[], int off, int len) 写入字符串指定部位
bufferedOutputStream.write("JavaIo".getBytes(),0,"JavaIo".length());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(bufferedOutputStream!=null){
bufferedOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//1、写入文件的路径
String filePath = "D:\\hwxs.txt";
//2、创建对象BufferedWriter用来写入文件内容
BufferedWriter bufferedWriter = null;
try {
//根据项目需求,二选一
//会覆盖原来内容
bufferedWriter = new BufferedWriter(new FileWriter(filePath));
//在原来的内容后面进行追加
bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
bufferedWriter.write("我是第一行");
//插入一个换行符
bufferedWriter.newLine();
bufferedWriter.write("我是第二行");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(bufferedWriter!=null){
bufferedWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}