IO流是存储到盘符和从盘符读取数据的解决方案。File类只能对文件本身进行操作,不能读写文件里面存储的数据。IO流用于读写文件中的数据。
IO流操作文件类型包括字节流和字符流。字节流可以操作所有类型的文件,字符流只能操作纯文本文件。
纯文本文件是能用windows记事本打开且能读懂的文件(例如.txt文件,.md文件)。
抽象类InputStream、OutputStream、Reader和Writer有不同的实现类。
InputStream的实现类:
FileInputStream:操作本地文件的字节输入流。
BufferedInputStream:带有缓冲区的字节输入流。
OutputStream的实现类:
FileOutputStream:操作本地文件的字节输入流。
BufferedOutputStream:带有缓冲区的字节输入流。
一、FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
(一)书写步骤
书写步骤如下
(1)创建字节输出流对象;
(2)写数据;
(3)释放资源。
例如:
public class MyApp {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("javase-learning\\src\\example\\org\\domain\\a.txt");
fos.write(97);
fos.close();
}
}
运行结果是往a.txt文件中写入了字符"a":
FileOutputStream字符输出流的细节:
1.创建字节输出流对象
(1)构造方法是字符串表示的路径或者是File对象都是可以的;
(2)如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
(3)如果文件已经存在,则会清空文件。
2.写出数据
(1)write()方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符。
例如:写一个数字97,分两次写,‘9’和’7’
3.释放资源
释放资源的意思是解除了对文件资源的占用。
(二)FileOutputStream写数据的3种方式
例如,一次写入多个数据:
public class MyApp {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("javase-learning\\src\\example\\org\\domain\\a.txt");
byte[] bytes = {97,98,99,100,101};
fos.write(bytes);
fos.close();
}
}
技巧:
也可以定义一个字符串对象,再用getBytes()方法获取字节数组。
(三)FileOutputSream的换行写和续写
1.换行写
windows的换行为\r\n(先回车再换行)。linux的换行为\n。mac的换行为\r。
java在windows中写\r,\n或\r\n都行,最后都会自动补全即为\r\n。
public class MyApp {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("javase-learning\\src\\example\\org\\domain\\a.txt");
String a= "apple\r\nbanana";
byte[] bytes = a.getBytes();
fos.write(bytes);
fos.close();
}
}
2.续写
在new FileOutputStream对象时设置第二个参数为true。
二、FileInputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
(一)基本操作步骤
操作步骤:
(1)创建字节输入流对象;
(2)读入数据;
(3)释放资源。
例如,读取a.txt文件的一个数据:
public class MyApp {
public static void main(String[] args) throws IOException {
FileInputStream fos = new FileInputStream("javase-learning\\src\\example\\org\\domain\\a.txt");
int b = fos.read();
System.out.println(b);
fos.close();
}
}
也可以通过强转打印字符:
FileInputStream的实现细节:
1.创建字节输入流对象
(1)如果文件不存在,就直接报错;
2.读取数据
(1)一次读一个字节,读出来的是数据在ASCII上对应的数字;
(2)读到文件末尾了,read()方法返回-1;
(3)释放资源。
(二)FileInputStream的循环读取
public class MyApp {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("javase-learning\\src\\example\\org\\domain\\a.txt");
int b ;int count=0;
while((b =fis.read() )!= -1)
{
count++;
System.out.println(count+"====="+b+"====="+(char)b);
}
fis.close();
}
}
(三)文件拷贝(使用一次读取多个字节的方式)
一次读取一个字节的方式进行文件拷贝:
public class MyApp {
public static void main(String[] args) throws IOException {
//1.创建对象
FileInputStream fis = new FileInputStream("javase-learning\\src\\example\\org\\domain\\a.txt");
FileOutputStream fos = new FileOutputStream("javase-learning\\src\\example\\org\\domain\\b.txt");
//2.拷贝
int b;
while((b=fis.read()) != -1)
{
fos.write(b);
}
//释放资源,规则,先开的流后释放
fos.close();
fis.close();
}
}
FileInputStream一次读取多个字节:
例如: