Java IO流
一、基础知识
IO流即存储和读取数据的解决方案。
(一)File
表示系统中的文件或者文件夹的路径
获取文件信息(大小,文件名,修改时间)
创建文件/文件夹
删除文件/文件夹
判断文件的类型
注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。
(二)IO流
用于读写文件中的数据(可以读写文件,或网络中的数据…)
1.IO流的分类
(1)按流的方向分
可以分为输入流与输出流。(IO流的方向是以程序自身作为参照的,也可以说是以内存为参照)
(2)按操作文件的类型分
可以分为字节流与字符流。字节流可以操作所有类型的文件,如视频、音频文件等等;而字符流只能操作纯文本文件。
什么是纯文本文件呢?Windows自带的记事本打开能读懂的文件即为纯文本文件,如txt、md文件。
(三)小结
1.什么是IO流?
存储和读取数据的解决方案
l:input
O:output
流:像水流一样传输数据
2.IO流的作用?
用于读写数据(本地文件,网络)
3.IO流按照流向可以分类哪两种流?
输出流:程序-> 文件
输入流:文件-> 程序
4.IO流按照操作文件的类型可以分类哪两种流?
l字节流:可以操作所有类型的文件
l字符流:只能操作纯文本文件
5.什么是纯文本文件?
用windows系统自带的记事本打开并且能读懂的文件txt文件,md文件,xml文件,lrc文件等。
二、IO流体系
InputStream、OutputStream及Reader、Writer都是抽象类。
(一)字节流
1.FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
(1)FileOutputStream字节输出流的细节
① 创建字节输出流对象
细节1:参数是字符串表示的路径或者是File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
细节3:如果文件已经存在,则会清空文件
② 写数据
细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符,如:
‘9’
‘7’
续写:
如果想要续写,打开续写开关即可开关位置:创建对象的第二个参数,默认false:表示关闭续写,此时创建对象会清空文件。手动传递true:表示打开续写,此时创建对象不会清空文件,如下:
// 1.创建对象并设置为续写模式
FileOutputStream fos = new FileOutputStream("text/b.txt",true);
③ 释放资源
每次使用完流之后都要释放资源
(3)IO Stream使用步骤:
①创建字节输出流对象
②写数据
③释放资源
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class IODemo1 {
public static void main(String[] args) throws IOException {
/*
使用步骤:
①创建字节输出流对象
②写数据
③释放资源
需求:字节输出流FileOutputStream
写一段文字到本地文件中。(暂时不写中文)
*/
// 1.创建对象
File file = new File("texta.txt");
// 如果文件不存在,则先新建
if (!file.exists()){
file.createNewFile();
}
// 2.创建输出流
FileOutputStream fos = new FileOutputStream(file);
// 3.写出数据
fos.write(97);
// 4.释放资源
fos.close();
}
}
(4)FileOutputStream基础知识小结
①创建字节输出流对象
细节1:参数是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
细节3:如果文件已经存在,则会清空文件
②写数据
细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
③释放资源
细节:每次使用完流之后都要释放资源
(5)FileOutputStream写数据的3种方式
方法名称 |
说明 |
void write(int b) |
一次写一个字节数据 |
void write(byte[]b) |
一次写一个字节数组数据 |
void write(byte[]b,int off,int len) |
一次写一个字节数组的部分数据 |
关于write(byte[]b,int off,int len)函数:
l参数一:数组
l参数二:起始索引0
l参数三:个数
(6)FileOutputStream小结
a.FileOutputStream的作用
可以把程序中的数据写到本地文件上,是字节流的基本流。
b.书写步骤
创建对象,写出数据,释放资源
c.三步操作的细节
创建对象:文件存在、文件不存在、追加写入
写出数据:写出整数、写出字节数组、换行写
释放资源:关闭通道
1.FilelnputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
(1)使用步骤
①创建字节输入流对象
②读数据
③释放资源
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 1.创建输入流
FileInputStream fis = new FileInputStream("text/c.txt");
// 2.读取并回显数据
// 当到达文件终点时read方法返回-1
for(int c = fis.read(); c != -1; c = fis.read()){
System.out.println((char) c);
}
}
}
(1)FilelnputStream使用详解
①创建字节输入流对象
细节1:如果文件不存在,就直接报错。
②读取数据
细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1。
③释放资源
细节1:每次使用完流必须要释放资源。
(2)FilelnputStream一次读多个字节
方法名称 |
说明 |
public int read() |
一次读一个字节数据 |
public int read(byte[] buffer) |
一次读一个字节数组数据 |
read(byte[] buffer)方法可以一次读一个字节数组的数据,每次读取会尽可能把数组装满。
2.练习:文件拷贝
一个字节一个字节的读取,效率低,代码如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws IOException {
// 源文件路径
String sourcePath = "D:npp.8.5.8.Installer.x64.exe";
服务器托管网 // 目标文件地址
String destPath = "destnotepad++858.exe";
// 创建输入流
FileInputStream fis = new FileInputStream(sourcePath);
// 创建输出流
FileOutputStream fos = new FileOutputStream(destPath);
// 记录当前系统时间
long beginMill = System.currentTimeMillis();
// 循环读取并写出
for (int b = fis.read(); b != -1; b = fis.read()){
fos.write(b);
}
System.out.println("拷贝共花费" + (System.currentTimeMillis() - beginMill) + "毫秒");
// 关闭资源
fis.close();
fos.close();
}
}
改进使用1M大小的buffer数组作为缓冲区,读写效率将大大提高:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyPlus {
public static void main(String[] args) throws IOException {
// 源文件路径
String sourcePath = "D:npp.8.5.8.Installer.x64.exe";
// 目标文件地址
String destPath = "destnotepad++858.exe";
服务器托管网 // 创建输入流
FileInputStream fis = new FileInputStream(sourcePath);
// 创建输出流
FileOutputStream fos = new FileOutputStream(destPath);
// 记录当前系统时间
long beginMill = System.currentTimeMillis();
// 创建缓冲数组1M
byte[] buffer = new byte[1024 * 1024];
// 循环读取并写出
for (int len = fis.read(buffer); len != -1; len = fis.read(buffer)){
fos.write(buffer,0, len); // 写出buffer中的数据,从0索引开始,写len个数据
}
// 统计消耗时间
System.out.println("拷贝共花费" + (System.currentTimeMillis() - beginMill) + "毫秒");
// 关闭资源
fis.close();
fos.close();
}
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
下文对 Bytebase 和 Yearning 两个数据库管理工具进行了多维度比较🔍。 产品功能定位 Yearning:功能较为单一的独立数据库审核工具,适合小团队进行简单的 SQL 审核,若要应对复杂需求必须进行大量二次开发,用户群更偏向 DBA。 Byte…