1. IO流概述
1.1 IO流的作用
IO流的作用:就是可以对文件或者网络中的数据进行读、写的操作。
-
把数据从磁盘、网络中读取到程序中来,用到的是输入流。
-
把程序中的数据写入磁盘、网络中,用到的是输出流。
1.2 IO流的体系:
IO流分为两大派系:
- 字节流:字节流又分为字节输入流、字节输出流
- 字符流:字符流由分为字符输入流、字符输出流
2.字节流简单入门
2.1 FileInputStream 字节输入流
import java.io.*;
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
//1.创建文件字节输入流管道,与源文件接通
InputStream is = new FileInputStream("文件路径");
//2.开始读取文件的字节数据
//public int read():每次读取一个字节返回,如果没有数据,则返回-1
int b;
while ((b = is.read()) != -1) {
System.out.print((char) b);
}
//3.流使用完毕以后,必须关闭!释放系统资源!
is.close();
}
}
读取多个字节
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
//1.创建一个字节输入流对象代表字节输入流管道,与源文件接通
InputStream is = new FileInputStream("文件路径");
//2.开始读取文件中的字节数据,每次读取多个字节
// public int read(byte b[]) throws IOException
// 每次读取多个字节到字节数组中,返回读取的字节数量,读取完毕返回-1
int len;
byte[] buffer = new byte[5];
while ((len = is.read(buffer)) != -1){
System.out.println(new String(buffer,0,len));
}
//关闭连接
is.close();
}
}
2.2 FileOutputStream 字节输出流
import java.io.*;
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建一个字节输出流管道与目标文件接通
//注意:默认是覆盖
//FileOutputStream fos = new FileOutputStream("文件路径");
// public FileOutputStream(String name,boolean append):append = true :代表追加
FileOutputStream fos = new FileOutputStream("文件路径",true);
//write 方法
fos.write('W');
fos.write('E');
fos.write('R');
//写多个字节
String s = "写入多个字节~";
fos.write(s.getBytes());
//限制写十个字节
fos.write(s.getBytes(),0,10);
//写特殊符号
fos.write("\n\r".getBytes());
//关闭连接
fos.close();
}
}
2.3 字节流拷贝文件
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class CopyDemo {
public static void main(String[] args) throws IOException {
//一:创建字节输入流,读取数据
FileInputStream fis = new FileInputStream("原图路径");
//二:创建字节输出流,写入数据
FileOutputStream fos = new FileOutputStream("拷贝图像路径",true);
//三:指定一个字节缓冲数组,一次读取1024个字节
byte[] buffer = new byte[1024];
//四:一次读取了多少个字节
int len;
while ((len = fis.read(buffer)) != -1){
fos.write(buffer,0,len);
}
fos.close();
fis.close();
}
}
2.5 资源释放问题
IO流的使用是一定要指定释放资源代码的,有两种解决方案:
- try{
//有可能产生异常的代码
}catch(异常类 e){
//处理异常的代码
}finally{
//释放资源的代码
//finally里面的代码有一个特点,不管异常是否发生,finally里面的代码都会执行。
} - try(资源对象1; 资源对象2;){
使用资源的代码
}catch(异常类 e){
处理异常的代码
} 此方案会自动释放()中的资源
我们会在字符流的代码中演示两种方法
3.字符流简单入门
3.1 FileReader 字符输入流
import java.io.FileReader;
public class FileReaderDemo {
public static void main(String[] args) {
try (
//创建FileReader对象
FileReader fr = new FileReader("文件路径");
) {
char[] buffer = new char[1024];
int len;
while ((len = fr.read(buffer)) != -1) {
String s = new String(buffer, 0, len);
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 FileWriter 字符输出流
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) {
FileWriter fw = null;
try {
//FileWriter也有续写开关
fw = new FileWriter("文件路径");
fw.write('一');
fw.write('二');
fw.write('三');
fw.write("字符输出流");
String s = "字符输出流开始写入";
fw.write(s, 0, 5);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.3 字符流拷贝文件
import java.io.FileReader;
import java.io.FileWriter;
public class CopyFile {
public static void main(String[] args) {
//通过字符流实现文件的拷贝
try (
FileReader fr = new FileReader("原文件路径");
FileWriter fw = new FileWriter("拷贝文件路径");
) {
char[] buffer = new char[1024];
int len;
while ((len = fr.read(buffer)) != -1) {
fw.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}