java I/O流
在java中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。
为什么要使用输入输出流
例如,我们平时用的 Office 软件,对于 Word、Excel 和 PPT 文件,我们需要打开文件并读取这些文本,和编辑输入一些文本,这都需要利用输入和输出的功能。在现实生活中,输入和输出的例子比比皆是。
什么是I/O流
I/O流概念:输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备。
数据流是java进行I/O操作的对象,
数据流按照不同标准的分类:
- 按照流的方向主要分为输入流和输出流两大类。
- 数据流按照数据单位的不同分为字节流和字符流。
- 按照功能可以划分为节点流和处理流。
数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才能处理后一个数据。数据流以输入流的形式被程序获取,再以输出流的形式将数据输出到其它设备
编码与解码
String str = "张三abc";
byte[] utf8s = str.getBytes("utf8");//采用utf-8字符集编码为字节数组
System.out.println(new String(utf8s,"utf8"));//采用utf-8字符集解码
System.out.println(Arrays.toString(utf8s));
InputStream输入流
- 一个字节一个字节读取文件
- 定义字节数组读取文件
- 一次性读取全部文件内容,防止乱码问题
//1.InputStream输入流读取文件
InputStream inputStream = new FileInputStream("src/file/test.txt");//获取字符输入流
int read;
while ((read=inputStream.read()) != -1){ //一个字节一个字节读数据
System.out.print((char)read);
}
//2.方法改进 以上一个字节一个字节读取效率太慢
InputStream inputStream2 = new FileInputStream("src/file/test2.txt");//获取字符输入流
byte[] bytes = new byte[1024];//定义一个长度为1024的数值,一次读取这些长度的数据
int len;//记录读取的字节数
while ((len = inputStream2.read(bytes))!=-1){
System.out.print(new String(bytes,0,len));//从0开始读到len
}
//3.解决乱码问题,一次性读完全部内容
File file = new File("src/file/test3.txt");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] by = fileInputStream.readAllBytes();//一次性读完全部内容,但是有最大限制
System.out.println(new String(by));
OutputStream输出流
OutputStream outputStream = new FileOutputStream("src/file/out.txt");//创建输出流对象,指定写入文件,创建完会清空此文件之前的数据
OutputStream outputStream2 = new FileOutputStream("src/file/out.txt",true);//创建输出流对象,指定写入文件,后面写入内容在原始内容上追加
outputStream2.write(97); //写入字母a
outputStream2.write("\r\n".getBytes("UTF8")); //换行
outputStream2.write("张山".getBytes("UTF8")); //写入文字张山,需要将中文字符转化为字节再写入
outputStream2.write("张山".getBytes("UTF8"),0,3); //指定范围写入字节
outputStream2.flush();//刷新数据
outputStream2.close();//刷新数据,关闭流
outputStream.close();
文件拷贝
//TODO 文件拷贝
InputStream is = null;
OutputStream os = null;
try{
//创建输入流对象
is = new FileInputStream("C:\\Users\\30101\\Videos\\Captures\\VehicleManagement_src_main_Demo.java - Eclipse IDE 2021-05-21 20-15-50.mp4");
//创建输出流对象
os = new FileOutputStream("C:\\Users\\30101\\Videos\\Captures\\copy.mp4");
//一次性读取1024个字节
byte[] bs = new byte[1024];
int l;
while ((l=is.read(bs))!=-1){
os.write(bs,0,l); //写入
}
}catch (Exception e){
e.printStackTrace();
}finally { //无论是否出现异常,此处代码一定会执行
//关闭资源
if (os != null)os.close();
if (is != null) is.close();
}
//TODO 文件拷贝-代码简化
try(
InputStream is2 = new FileInputStream("C:\\Users\\30101\\Videos\\Captures\\VehicleManagement_src_main_Demo.java - Eclipse IDE 2021-05-21 20-15-50.mp4");//被拷贝的文件
OutputStream os2 = new FileOutputStream("C:\\Users\\30101\\Videos\\Captures\\copy.mp4");//复制品
//无论下方代码是否出现异常,都会自动释放资源。里面只能放资源,需要实现Closeable接口
){
//一次性读取1024个字节
byte[] bs = new byte[1024];
int l;
while ((l=is2.read(bs)) != -1) os2.write(bs,0,l);
}catch (Exception e){
e.printStackTrace();
}
字符流
//输入流
Reader reader = new FileReader("D:\\Desktop\\letcode\\src\\file\\test3.txt");
int s;
while (( s =reader.read())!=-1){//一个一个字符读取
System.out.print((char) s);
}
Reader reader2 = new FileReader("D:\\Desktop\\letcode\\src\\file\\test3.txt");
char[] chars = new char[1024];
int lens;
while ((lens=reader2.read(chars))!=-1){ //每次读取1024个字符,效率更高
System.out.print(new String(chars,0,lens));
}
//输出流
Writer writer = new FileWriter("src/file/writer.txt");
writer.write('a');//写一个字符
writer.write('烟');
writer.write(97);
writer.write("张三".toCharArray());//写一个字符数组
writer.write("\r\n");//换行
writer.write("我的国家",0,2);//指定范围写入
writer.close();