流
- 流具有方向,且只能但方向,只能从头到尾的顺序读写一次
- 根据程序的思路来考虑问题:
数据读取到程序中in(输入流)
数据写入到文件中out(输出流) - 流操作的前提是必须建立”管道”——-获取流对象
- 流的分类:字节输入流、字节输出流、字符输入流、字符输出流
IO流的继承结构
在java中,根据处理的数据单位不同,可以把流分为字节流和字符流
字节流 : 针对二进制文件
字符流 : 针对文本文件,读写容易出现乱码的现象,在读写时,最好指定编码集为UTF-8
字节流:针对二进制文件
以File为前缀的,是可以插在文件上,直接对文件进行操作的流
以Buffered为前缀的,是插在其他流上,对其他流做加强操作的缓冲或高效流。
InputStream抽象父类,字节输入流
FileInputStream
操作文件的字节输入流,可以传文件或路径,普通子类
BufferedInputStream
—缓冲或高效字节输入流,需要传InputStream
,普通子类
ObjectInputStream
OutputStream抽象父类,字节输出流
FileOutputStream
,普通子类,可直接操作文件BufferedOutputStream
,普通子类,插在其他流上,给其他流做加强的缓冲或高效流ObjectOutputStream
字符流:针对文本文件
Reader抽象父类,字符输入流
FileReader
,普通子类BufferedReader
,普通子类InputStreamReader
Writer抽象父类,字符输出流FileWriter
,普通子类BufferedWriter
,普通子类OutputStreamWriter
PrintWriter
file文件类
概述
封装一个磁盘路径字符串,对这个路径可以执行一次操作
使用面向对象的方法可以将文件路径、文件夹路径、不存在的路径封装为file对象,file对象可以参与相关的流操作。
创建对象的方式
File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例new File(“d:/abc/a.txt”);
new File(“d:/abc”,”a.txt”);
常用方法
示例代码
package cn.tedu.file;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
/**
* 用于测试文件类常用方法
*/
public class TestFile {
public static void main(String[] args) {
File file = new File("F:\\ready\\1.txt");
//测试常用方法
System.out.println(file.length());//查看指定文件字节大小
System.out.println(file.exists());//查看指定文件是否存在
System.out.println(file.isFile());//判断指定File是否为文件
System.out.println(file.isDirectory());//判断指定File是否为文件夹
System.out.println(file.getName());//获取指定File文件名
System.out.println(file.getParentFile());//获取指定File的父级路径
System.out.println(file.getAbsoluteFile());//获取指定File的绝对路径
//创建
file = new File("F:\\ready\\2.txt");
try {
System.out.println(file.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
file = new File("F:\\ready\\a");
System.out.println(file.mkdir());//创建单层文件夹
file = new File("F:\\ready\\a\\b\\c");
System.out.println(file.mkdirs());
//删除
System.out.println(file.delete());//只有c被删除,只可以删除空文件夹或文件
file = new File("F:\\ready\\2.txt");
System.out.println(file.delete());
//文件列表
file = new File("F:\\ready");
String[] listName = file.list();
System.out.println(Arrays.toString(listName));
File[] fs = file.listFiles();
System.out.println(Arrays.toString(fs));
System.out.println(fs[0].length());
}
}
字节流
字节输入流
InputStream
抽象父类,不可实例化
常用方法:
abstract int read()
使用方法:对象名.read()
从输入流中读取数据的下一个字节int read(byte[] b)
使用方法:对象名.read()
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中int read(byte[] b, int off, int len)
使用方法:对象名.read()
将输入流中最多 len 个数据字节读入 byte 数组,off表示存时的偏移量void close()
使用方法:对象名.close()
关闭此输入流并释放与该流关联的所有系统资源
FileInputStream
文件的字节输入流,参数可以使用文件或路径
创建对象方式:
InputStream in = new FileInputStream("G:\\ready\\1.txt");
可以直接传文件到对象,通过打开一个到实际文件的连接来创建一个 FileInputStream
,该文件通过文件系统中的 File 对象 file 指定FileInputStream(String pathname)
—传路径
通过打开一个到实际文件的连接来创建一个 FileInputStream
,该文件通过文件系统中的路径名 name 指定
BufferedInputStream
BufferedInputStream
为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream
时,会创建一个内部缓冲区数组(默认8k大小)。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
创建对象方式
BufferedInputStream in = new BufferedInputStream(new FileInputStream("G:\\ready\\1.txt"));
需要使用InputStream
作为参数
示例代码
package cn.tedu.file;
import java.io.*;
/**
* 测试字节流读取
*/
public class TestIn {
public static void main(String[] args) {
method();//普通字节流读取
method1();//高校字节流读取
}
private static void method() {
//创建字节输入流对象用于读取
/*
InputStream in = new InputStream();
抽象类,不能创建对象需要创建FIS对象
IO操作可能会出现异常,需要try-catch
*/
InputStream in = null;
try {
//InputStream in = new FileInputStream(new File("F:\\ready\\1.txt"));
in = new FileInputStream("F:\\ready\\1.txt");
/*
read()一次读取一个字符,若果没有数据,返回-1
*/
// System.out.println(in.read());//97----a
// System.out.println(in.read());//98----b
// System.out.println(in.read());//99----c
// System.out.println(in.read());//-1
//循环读取文件中所有内容
int b;
while ((b = in.read()) != -1){
System.out.println(b);
}
//会跳着读取数据,漏掉数据
// while (in.read() != -1){
// System.out.println(in.read());
// }
/*
关闭流资源
in.close();
*/
} catch (Exception e) {
e.printStackTrace();//打印错误信息
}finally {
/*
finally代码块是try-catch结构中一定会被执行到的部分
常用于关流操作,防止因发生异常没有争取关流,不能写在try{}中
*/
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
BufferedInputStream in1 = null;
try {
in1 = new BufferedInputStream(new FileInputStream("F:\\ready\\1.txt"));
int b;
while ((b = in1.read()) !=-1){
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
in1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节输出流
OutputStream
抽象类,表示输出字节流的所有类的超类.输出流接受输出字节并将这些字节发送到某个接收器.
常用方法
Void close()
, 使用方法:对象名.close()
关闭此输出流并释放与此流相关的所有系统资源Void flush()
,使用方法:对象名.flush()
刷新此输出流并强制写出所有缓冲的输出字节,防止数据遗漏Void write(byte[ ] b)
,使用方法:对象名.write()
将b.length个字节从指定的byte数组写入此输出流Void write(byte[ ] b,int off ,int len)
,使用方法:对象名.write()
将指定byte数组中从偏移量off开始的len个字节写入输出流Abstract void write(int b)
,使用方法:对象名.write()
将指定的字节写入此输出流
FileOutputStream
直接在文件中插入数据
创建对象方式
OutputStream out = null;
out = new FileOutputStream("F:\\ready\\1.txt",true);
构造方法(创建对象):FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的文件输出流FileOutStream(File file)
创建一个向指定File对象表示的文件中写入数据的文件输出流FileOutStream(File file,boolean append)
—如果第二个参数为true,表示追加,不覆盖
创建一个向指定File对象表示的文件中写入数据的文件输出流,后面的参数是指是否覆盖原文件内容
BufferedOutputstream
实现缓冲的输出流,通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必每次针对字节写出调用底层系统
创建对象方式
OutputStream out = null;
out = new BufferedOutputStream(new FileOutputStream("F:\\ready\\1.txt",true));
构造方法(创建对象):BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,用以将数据写入指定的底层输出流
示例代码
package cn.tedu.file;
import java.io.*;
/**
* 字节输出流
*/
public class TestOut {
public static void main(String[] args) {
//method();//普通字节输出流
method1();//高效字节输出流
}
private static void method() {
OutputStream out = null;
try {
/*
out = new FileOutputStream(new File("F:\\ready\\1.txt"));
可以使用两个参数的构造方法,来控制输出的数据是覆盖还是追加
默认方式为覆盖
追加需要设置第二个参数为true
*/
out = new FileOutputStream("F:\\ready\\1.txt",true);
out.write(97);//对应ASCII码表中的a
out.write(97);//对应ASCII码表中的a
out.write(97);//对应ASCII码表中的a
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
OutputStream out = null;
try {
/*
out = new FileOutputStream(new File("F:\\ready\\1.txt"));
可以使用两个参数的构造方法,来控制输出的数据是覆盖还是追加
默认方式为覆盖
追加需要设置第二个参数为true
*/
//out = new FileOutputStream("F:\\ready\\1.txt",true);
out = new BufferedOutputStream(new FileOutputStream("F:\\ready\\1.txt",true));
out.write(11111);//对应ASCII码表中的a
out.write(11110);//对应ASCII码表中的a
out.write(11112);//对应ASCII码表中的a
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流
字符输入流
Reader抽象类,用于读取字符流的抽象类。
常用方法
int read()
使用方式:对象名.read()
读取单个字符int read(char[] cbuf)
使用方式:对象名.read()
将字符读入数组abstract int read(char[] cbuf, int off, int len)
使用方式:对象名.read()
将字符读入数组的某一部分int read(CharBuffer target)
使用方式:对象名.read()
试图将字符读入指定的字符缓冲区abstract void close()
使用方式:对象名.close()
关闭该流并释放与之关联的所有资源
FileReader子类
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream
上构造一个 InputStreamReader
。
创建对象方式
Reader in = null;
in = new FileReader("F:\\ready\\1.txt");
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReaderFileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
创建对象方式
Reader in = null;
in = new BufferedReader(new FileReader("F:\\ready\\1.txt"));
in = new BufferedReader(new FileReader(new File("F:\\ready\\1.txt")));
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流
字符输出流
Writer 抽象类
常用方法
Abstract void close()
,使用方式:对象名.close()
关闭此流,但要先刷新它Void write(char[ ] cbuf)
, 使用方式:对象名.write()
写入字符数组Void write(int c)
, 使用方式:对象名.write()
写入单个字符Void write(String str)
, 使用方式:对象名.write()
写入字符串Void write(String str,int off,int len)
, 使用方式:对象名.write()
写入字符串的某一部分Abstract void write(char[] cbuf,int off,int len)
, 使用方式:对象名.write()
写入字符数组的某一部分
FileWriter 子类
用来写入字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的.如果需要自己自定义这些值,可以先在FileOutputStream
上构造一个OutputStreamWriter.
创建对象方式
Writer out = null;
out = new FileWriter("F:\\ready\\1.txt",true);
构造方法(创建对象):FileWriter(String filename)
根据给定的文件名构造一个FileWriter
对象FileWriter(String filename,boolean append)
根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter
BufferedWriter子类
将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入.可以指定缓冲区的大小,或者接受默认的大小,在大多数情况下,默认值就足够大了
创建对象方式
Writer out = null;
out = new BufferedWriter(new FileWriter("F:\\ready\\1.txt",true));
构造方法(创建对象):BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流
示例代码
package cn.tedu.file;
import java.io.*;
public class TestIn2 {
public static void main(String[] args) {
//method();
method1();
}
private static void method() {
/*
Reader in = new Reader();
Reader为字符输入流的抽象父类,不可实例化
*/
Reader in = null;
try {
in = new FileReader("F:\\ready\\1.txt");
int b;
while ((b = in.read()) != -1){
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
Reader in = null;
try {
in = new BufferedReader(new FileReader("F:\\ready\\1.txt"));
in = new BufferedReader(new FileReader(new File("F:\\ready\\1.txt")));
int b;
while ((b = in.read()) != -1){
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符输出流
示例代码
package cn.tedu.file;
import java.io.*;
/**
* 字符输出流
*/
public class TestOut2 {
public static void main(String[] args) {
//method();//用于测试普通字符输出流
method1();//用于测试高效字符输出流
}
private static void method() {
Writer out = null;
try {
//out = new FileWriter(new File("F:\\ready\\1.txt"));
out = new FileWriter("F:\\ready\\1.txt",true);
out.write(222);
out.write(298);
out.write(256);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
Writer out = null;
try {
//out = new BufferedWriter(new FileWriter(new File("F:\\ready\\1.txt")));
out = new BufferedWriter(new FileWriter("F:\\ready\\1.txt",true));
out.write(222);
out.write(298);
out.write(256);
out.flush();//防止数据遗漏
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}