IO流主要是对磁盘或者服务器进行输入输出的操作Input、output。按照流向可以分为输入流和输出流,按照类型可以分为字节流和字符流
输入流 | 输出流 | ||
字节流 | 字节流抽象类 | InputStream | OutputStream |
文件流 | FileInputStream | FileOutputStream | |
缓冲流 | BuferedInputStream | BuferedOutputStream | |
对象流 | ObjectInputStream | ObjectOutputStream | |
内存流 | ByteArrayInputStream | ByteArrayOutputStream | |
字符流 | 字符流抽象类 | Reader | Writer |
文件流 | FileReader | FileWriter | |
缓冲流 | BuferedReader | BuferedWriter | |
转换流 | InputStreamReader | OutputStreamWriter |
字节流列子:
将文件读取到控制台
close()
:关闭此输入流并释放与此流相关联的任何系统资源。
read()
: 从输入流读取数据的下一个字节。
read(byte[] b)
: 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
public class Demo39 {
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\a.txt";
FileInputStream file = new FileInputStream(path);
int num;
//file.read()每次返回一个字节
while ((num=file.read())!= -1){
System.out.println((char) num);
}
file.close();
}
}
可通过byte[]设置一次性获取取数量
public class Demo39 {
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\a.txt";
FileInputStream file = new FileInputStream(path);
//设置存储数组
byte[] bytes=new byte[1024];
int num;
while ((num=file.read(bytes))!= -1){
System.out.println(new String(bytes,0,num));
}
file.close();
}
}
将数据读取到文件
close()
:关闭此输出流并释放与此流相关联的任何系统资源。
flush()
:刷新此输出流并强制任何缓冲的输出字节被写出。
write(byte[] b)
:将 b.length字节从指定的字节数组写入此输出流。
write(byte[] b, int off, int len)
:从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
write(int b)
:将指定的字节输出流
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileOutputStream file = new FileOutputStream(path);
//ASCLL码
file.write(97);
file.close();
}
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileOutputStream file = new FileOutputStream(path);
// 字符串转换为字节数组
byte[] bytes="神仙会飞吗".getBytes();
file.write(bytes);
file.close();
}
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileOutputStream file = new FileOutputStream(path);
// 字符串转换为字节数组
byte[] bytes="abcde".getBytes();
//从第2个下标开始,写入3个
file.write(bytes,2,3);
file.close();
}
但是我们发现每次程序运行写入都会将旧的数据覆盖掉,因此我们希望追加的方式写入
new FileOutputStream(File file, boolean append)如果append为true则会以追加的方式写入
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileOutputStream file = new FileOutputStream(path,true);
// 字符串转换为字节数组
byte[] bytes="神仙会飞吗".getBytes();
file.write(bytes);
file.close();
}
字符流例子 :
将文件读取到控制台
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\a.txt";
FileReader fileReader = new FileReader(path);
int str;
while ((str=fileReader.read())!=-1){
System.out.println((char) str);
}
fileReader.close();
}
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\a.txt";
FileReader fileReader = new FileReader(path);
char[] chars = new char[5];
while (fileReader.read(chars)!=-1){
System.out.println(new String (chars));
}
fileReader.close();
}
将数据读取到文件
* 这里要注意哦,写入时它会放入缓冲区并未正式写入文件,如果不关流是写不进去的
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileWriter fileWriter = new FileWriter(path);
fileWriter.write("我要进去咯");
fileWriter.close();
}
不关流写不进去但是关流了我还想继续写怎么办,通过 flush() 方法
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileWriter fileWriter = new FileWriter(path);
fileWriter.write("现在看看");
fileWriter.flush();
//fileWriter.close();
}
有时候我们根据业务情况创建了许多流,但是关闭流的时候一个一个关很麻烦,而且看起来也不够牛逼怎么办,建一个统一关流的方法吧
public static void main(String[] args) throws IOException {
String path="D:\\Files\\Test\\b.txt";
FileWriter fileWriter = new FileWriter(path);
FileReader fileReader = new FileReader(path);
closes(fileReader,fileWriter);
}
private static void closes(Closeable ...closeables){
for (Closeable closeable:closeables) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}