文章目录
概述
- IO流:存储和读取数据的解决方案
I
:inputO
:output- 作用:用于读写文件中的数据(本地文件,或网络中的数据)
分类
按流的方向
- 输入流(文件 -> 程序)
- 输出流(程序 -> 文件)
按操作文件类型
- 字节流 -> 所有类型文件
-
InputStream
字节输入流
-
-
FileInputStream
操作本地文件的字节输入流
-
-
OutputStream
字节输出流
-
-
FileOutputStream
操作本地文件的字节输出流
-
- 字符流 -> 纯本文文件
.txt
(用windows系统自带的记事本打开并且看得懂的文件,eg:txt文件,md文件,xml文件,lrc文件) -
Reader
字符输入流
-
Writer
字符输出流
FileOutputStream
- 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中,是字节流的基本流。
FileOutputStream书写步骤
- 创建对象(文件存在,文件不存在,追加写入)
-
- 细节1:参数是字符串表示的路径或者File对象都是可以的
-
- 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
-
- 细节3:如果文件已经存在,会清空文件
- 写出数据(写出整数,写出字节数组,换行写)
-
- 细节:write方法的参数是整数,但是实际上写到本地的是整数在ASCII上对应的字符
- 释放资源:关闭通道
-
- 细节:每次使用完流之后都要释放资源
public class ByteStreamDemo1 {
public static void main(String[] args) throws IOException {
//需求:写出一段文字到本地文件中(暂时不写中文)
//1。创建对象
FileOutputStream fos = new FileOutputStream("/Users/jessy/Desktop/offer50/aaa/ppp.txt");
//2。写出数据
//a
fos.write(97);
//3.释放资源
fos.close();
}
}
FileOutputStream写数据的3种方式
方法名称 | 说明 |
---|---|
void write(int b) | 一次写一个字节流数据 |
void write(byte[] b) | 一次写一个字节流数组 |
void write(byte[] b, int off,int len) | 一次写一个字节流数组的部分数据 |
public class ByteStreamDemo3 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("/Users/jessy/Desktop/offer50/aaa/ppp.txt");
/*
//a
fos.write(97);
//b
fos.write(98);*/
/*
byte[] bytes = {97, 98, 99, 100, 101};
//abcde
fos.write(bytes);*/
byte[] bytes = {97, 98, 99, 100, 101};
//bc
fos.write(bytes, 1, 2);
fos.close();
}
}
FileOutputStream写数据的两个小问题
- 换行写 --> 换行符
-
- windows:
\r\n
- windows:
-
- Linux:
\n
- Linux:
-
- Mac:
\r
- Mac:
- 续写–> 打开续写开关即可,开关在创建对象的第二个参数。
-
- 默认false:表示关闭续写,此时创建对象会清空文件
-
- 手动传递true:表示打开续写,此时创建对象不会情况文件
public class ByteStreamDemo4 {
public static void main(String[] args) throws IOException {
//续写
FileOutputStream fos = new FileOutputStream("/Users/jessy/Desktop/offer50/aaa/qqq.txt", true);
String str1 = "laoniangzuimei";
byte[] bytes1 = str1.getBytes();
fos.write(bytes1);
//换行符
String wrap = "\r";
byte[] bytes = wrap.getBytes();
fos.write(bytes);
String str2 = "520";
byte[] bytes2 = str2.getBytes();
fos.write(bytes2);
fos.close();
}
}
FileInputStream
- 操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
FileInputStream书写步骤
- 创建字节流输入对象
-
- 细节:如果文件不存在,就直接报错
- 读数据
-
- 细节1: :一次读一个字节,读出来的是数据在ASCII上对应的数组
-
- 细节2:读到文件末尾了,read方法返回-1
- 释放资源
-
- 细节:每次使用完流之后都要释放资源
public class ByteStreamDemo1 {
public static void main(String[] args) throws IOException {
//1。创建字节流对象
//ab
FileInputStream fis = new FileInputStream("/Users/jessy/Desktop/offer50/aaa/qqq.txt");
int b1 = fis.read();
//97
System.out.println(b1);
int b2 = fis.read();
//b
System.out.println((char) b2);
int b3 = fis.read();
//-1
System.out.println(b3);
fis.close();
}
}
思考: 为什么输出流中,文件不存在的时候会创建,而输入流中,文件不存在是报错?
因为输出流中创建新的文件,将数据写入到文件当中
而输入流创建出来的文件是没有数据的,没有任何意义。
所以Java就没有设计这种无意义的逻辑,文件不存在直接报错
程序中最重要的是:数据
FileInputStream循环读取
public class ByteStreamDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("/Users/jessy/Desktop/offer50/aaa/qqq.txt");
//循环读取
int b;
while ((b = fis.read()) != -1) {
System.out.print((char) b);
}
fis.close();
}
}