IO流
IO流可以看成是不同存储设备(例如磁盘文件,内存等)之间的数据(输入输出操作)流。
IO流分类
IO流的常见分类标准是按照流动方向和操作数据单位来 分类
按照数据流动方向分类
输入流(InputStream,Reader)和输出流(OutputStream,Writer)
按照操作数据的单位分类
字节流(InputStream,OutputStream)和字符流(Reader,Writer)
字节流
文件输入流(FileInputStream)
构造方法
FileInputStream(File file) 表示从file指向的文件中读取
FileInputStream(String name) name表示文件的路径名(路径+文件名)
读取的方法
int read()
调用一次读到一个数据字节,返回的int值就是读到的数据
如果已到达文件末尾,则返回 -1
int read(byte[] b)
调用一次本方法表示可以读取多个数据
读到的内容保存传入的byte数组b中
返回的是本次调用方法读到的数据字节个数
int read(byte[] b, int off, int len)
和上面的第二个类似,可以指定从b数组什么位置开始装
读取单个数据字节
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
System.out.println(fileInputStream.read());
System.out.println((char)fileInputStream.read());
}
用循环读取整个文件内容
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
int i;
while((i = fileInputStream.read()) != -1){
System.out.println((char)i);
}
一次读取一个数组
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
byte[] b = new byte[5];
int len;
while((len = fileInputStream.read(b))!=-1){
for (byte c : b) {
System.out.println((char)c);
}
}
}
直接以byte数组为参数来new一个字符串
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("E:/java/java.txt");
byte[] b = new byte[5];
int len;
while((len = fileInputStream.read(b))!=-1){
System.out.println(new String(b,0,len));
}
文件输出流(FileOutputStream)
构造方法
FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
方法
void write(int b) 调用一次写入一个数据字节
void write(byte[] b) 调用一次,可以把一个byte数组中的数据写入
void write(byte[] b, int off, int len) 调用一次,把b数组中的一部分数据写入
写入单个数据
OutputStream os = new FileOutputStream("E:/java/java.txt");
os.write(65);
os.close();
写入字符串
OutStream os = new FileOutputStream("E:/java/java.txt");
os.write(“66666”.getByte());
注意事项
-
确定输出目录
-
创建输出流的对象(调用输入write方法)
-
调用write方法写数据
-
关闭流资源(不关闭也能成功写入)
字符流
文件输入流(FileReader)
构造方法和方法和字节流输入流FileInputStream非常类似 ,差别就是单位是char
Reader r = new FileReader("D:/123.txt");
char[] cbuf = new char[3];
int len;
while((len = r.read(cbuf))!=-1){
System.out.println(new String(cbuf,0,len));
}
r.close();
文件输出流(FileWriter)
void write(String str) // 写入字符串。
void write(String str, int off, int len) //写入字符串的一部分
字符流与字节流的区别
- 操作的单位不一样,一个是字节,一个是字符
- 操作中文的时候使用字符流更方便, 字节流更广泛:文本,视频,音频,图片…
- 字符流中有可以直接写字符串的方法
- 字节输出流 : 程序 —> 磁盘文件 如果不关闭流也会写入
- 字符输出流 :程序 —> 缓冲 —> 磁盘文件 如果不关闭流或者刷新缓冲区,不会写入文件
- 字符输出流,关闭的时候会先刷新,关闭之后不能够在操作,刷新之后可以继续操作
- 什么时候会用到刷新 : 写入的数据,比较多,可以在中途手动调用刷新的方法提交数据