IO流总结(一)
File中常用方法和常量
pathSeparator常量表示路径分隔符,window是';'
sparaotr常量表示路径分隔符,window是''
public File(String pathName)构造,创建file对象,传入完整路径。
boolean createNewFile()创建新文件。
boolean delete();删除文件
boolean exists();判断文件是否存在
boolean isDirectory();判断给定的文件是否是一个目录
long length();返回文件的大小
String[] list(); 列出了目录的全部文件名称
File[] listFiles();列出目录的全部文件名称带路径
boolean mkdir();创建一个目录
boolean renameTO(File dest);为已有的文件重新命名。
字节输出流OutputStream
OutputStream输出流,它是一个抽象类。用它的时候通过实例化子类FileOutPutStream来操作。
close(); 关闭输出流。
flush(); 刷新缓冲区。
write(byte[] b); 将byte数组写入数据流
write(byte[] b ,int off ,int len); 将指定范围的数据写入数据流。
write(int b); 将一个字节数据写入数据流。
OutputStream 定义如下:
public abstract class OutputStream extends Object implements Closeable,Flushable
它的构造方法:public OutPutStream(File file);将数据写入到文件,文件不存在会自动创建
它的构造方法:public OutPutStream(File file,boolean append);将数据写入文件,如果append=true,表示在文件末尾追加内容。
它实现的两个接口作用分别是:一个用于close()关闭,一个用于flush();用于刷新缓冲区
OutputStream out = new FileOutPutStream();
字节输入流InputStream
InputStream输入流,它是一个抽象类。用它的时候通过实例化子类FileInPutStream来操作。
int available(); 可以取得输入文件的大小(字节个数)
void close(); 关闭输入流
abstract int read(); 读取一个字节,并把读到的字节返回
int read(byte[] b);将内容读到byte数组,并且返回读入的字节的个数。
int read(byte[] b ,int off ,int len); 将内容读到byte数组,从off开始读,读len个结束。
InputStream 定义如下:
public abstract class InputStream extends Object implements Closeable。
它的构造方法:public FileInputStream(File file);
InputStream out = new FileInPutStream();
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream(new File(""));
byte[] bt = new byte[1024];
int len = 0;
/**
* in.read将内容读到bt字节数组中。
* 返回实际读到的个数,而非byte长度。
*/
while ((len = in.read(bt)) != -1) {
String str = new String(bt,0,len);
}
}
字符输出流+字符输入流
Writer extends Object implements Appendable,Closeable,Flushable
close(); 关闭输出流
write(String str);将字符串输出
write(char[] c);将字符数组输出
flush() ;强制清空缓存
Reader extends Object implements Readable,Closeable;
close();关闭输出流
read();读取单个字符
read(char[] c);将内容读到字符数组,返回读到的长度
public static void main(String[] args) throws Exception {
Reader reader = new FileReader(new File(""));
Writer writer = new FileWriter(new File(""));
char[] ch = new char[1024];
int len = 0;
while ((len = reader.read(ch)) != -1){
writer.write(ch);
}
writer.close();
reader.close();
}
在这里要强调一下,
- 字符流输出的时候必须关闭,或者flush清空缓存。因为字符流操作时使用了缓冲区,而在关闭字符流的时候,会强制清空缓冲区,如果没有关闭,缓存区的内容是无法输出的。
- 程序——>字符流——>缓存——>文件
- 因为读取内存速度比较快,可以提高程序性能,在字符流的操作中,所有的字符都是在内存中形成的。在输出前会将所有的内容暂时保存在内存中,所以使用了缓冲区的暂存数据。
转换流
上述概括了字节流和字符流,那么什么场景用哪种流呢?这个网上查了一下。
在读取文本时候用字符流,其余的像上传文件图片视频都用字节流。
其实归根结底,字符流的底层还是字节流只不过是对其做了一个转换。下面我们就看一下他们是怎么转换的。
OutputStreamWriter和inputStreamReader
- OutputStreamWriter是Writer的子类,FileWriter是OutputStreamWriter的子类
- inputStreamReader是Reader的子类,FileReader是inputStreamReader的子类
Reader reader = new InputStreamReader(new FileInputStream(new File("")));
Writer writer = new OutputStreamWriter(new FileOutputStream(new File("")));
结论:不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入/输出的。
内存操作流
写入内存,输入流
ByteArrayInputStream(byte[] b):将字节数组写入内存
ByteArrayInputStream(byte[] b,int off,int len)
从内存中取出,输出流
ByteArrayOutputSream():空构造
write(int b)将内容从内存中输出
public class SerializeUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(SerializeUtil.class);
public static byte[] serializeObject(Object obj) {
try (ByteArrayOutputStream btOut = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(btOut)) {
objOut.writeObject(obj);
return btOut.toByteArray();
} catch (Exception e) {
LOGGER.error("obj to byte fail , detail see ——>{0}", e);
}
return null;
}
@SuppressWarnings("unchecked")
public static <T> T unSerializeObject(byte[] bt) {
try (ByteArrayInputStream btIn = new ByteArrayInputStream(bt);
ObjectInputStream objIn = new ObjectInputStream(btIn)) {
return (T) objIn.readObject();
} catch (Exception e) {
LOGGER.error("bt to obj fail , detail see ——>{0}", e);
}
return null;
}
}