文件
Java程序可访问的最主要的外部资源之一就是文件。
在Java中用File类来进行文件及目录的操作,常见操作:
查询文件信息、创建文件、文件内容读取、写文件……
- 文件操作
–boolean canWrite(); //是否可写
–boolean canRead(); //是否可读
–boolean isFile(); //是否是一个文件
–boolean isDirectory(); //是否是文件夹
–long lastModifield(); //最后一次修改文件的时间,返回时间整形
–long length(); //文件长度(不等于字符串长度),以字节存储
–boolean delete(); //删除 - 目录操作
–boolean mkdir (); //创建目录
–String list(); //列出指定目录下的当前的文件和文件夹的名称
定义对象
File file = new File(“路径”);
路径可以是“/”,“//”,“\” 不能写“\”
打印结果:
流
在Java中使用为什么输入输出要用“流”这种方式呢?
因为程序输入输出的基本单位是字节,输入就是获取一串字节,输出就是发送一串字节。但是很多情况下,程序不可能接收所有的字节之后再进行处理,而是接收一点处理一点。
流的分类
Java程序与外部交互的主要手段就是流
- 根据流的方向分类(相对于内存)
输入流:可以从流中读取信息
输出流:可以向流中写入信息 - 根据操纵对象的类型分类
字符流:读取单位为字符,因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。读取的字节数由字符编码确定。
字节流:读取单位为字节,一般用于文件传输
只要处理纯文本数据,优先考虑字符流,其他的形式采用字节流(图片)
Java中流的处理
– 字节输入流:InputStream类
– 字节输出流:OutputStream类
– 字符输入流:Reader类
– 字符输出流:Writer类
字节流
字节流的输入输出主要以 字节 为单位。主要用于外部设备中文件的读取和外部设备中文件的显示。
Java中对于不同的外部资源对应了不同的输入流类,他们都是继承自InputStream;对于不同的外部资源对应了不同的输出流类,他们都是继承自OutputStream。
InputStream和OutputStream是抽象类,不能实例化对象
FileInputStream 是InputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,用来读取数据;FileOutputStream同理。
ByteArrayInputStream是InputStream的子类,可以指定byte数组创建实例,一旦创建就可以将byte数组当做数据源进行存取;ByteArrayOutputStream同理。
BufferedInputStream和BufferedOutputStream提供缓冲区功能,减少读取写入次数
DataInputStream与DataOutputStream提供读取、写入java基本数据类型的方法。这些方法会自动在指定的类型与字节间转换。
- Java中InputStream的常用方法:(读)
– int read(); //从输入流中读取数据的下一个字节。
– int read(byte c[ ]); //从输入流中读取一定数量的字节,并将其存储在缓冲区数组 byte 中。
– int read(byte c[ ], int off, int len);将输入流中最多 len 个数据字节读入 byte 数组。
– void close(); 关闭流并释放资源 - Java中OutputStream的常用方法:(写)
– void write(int b);将指定的字节写入此输出流。
– void write(byte b[ ]);将 b.length 个字节从指定的 byte 数组写入此输出流。
– void write(byte b[ ], int off, int len);将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
– void flush();刷新此输出流并强制写出所有缓冲的输出字节。
– void close(); 关闭流并释放资源
本地文件要加file,FileOutputStream是OutputStream的子类,用于衔接文档以写出数据
流操作都是受检异常,所以要用try-catch结构
字符流
Reader :输入流
FileReader是一种Reader,用于读取文档并将读到的数据转换为字符
StringReader可以将字符串打包,当做读取来源
CharArrayReader 将char数组当做读取来源
BufferedReader带有缓冲区的字符流,一次读取一行
- Java中Reader的常用方法:
–int read();读取单个字符。
–int read(char c[ ]);将字符读取数组 。
–int read(char c[ ], int off, int len);将字符读入数组的某一部分。
–void mark(int readlimit);标记流中的当前位置。
–void reset();重置该流。
–void close();关闭此输入流并释放与该流关联的所有系统资源。
–long skip(long n);跳过字符
Writer :字符输出流
StringWriter 可以作为写入目的地,最后用toString()取得所有写入的字符组成的字符串
- Java中Writer的常用方法:
– Writer append(char c);将指定字符添加到此 writer。
– Writer append(CharSequence c);将指定字符序列添加到此 writer。
– Writer append (CharSequence csq, int start, int end) ;将指定字符序列的子序列添加到此 writer.Appendable。
– void flush();刷新该流的缓冲。
– void write(int c);写入单个字符。
– void write(String str);写入字符串。
– void close();关闭此流,但要先刷新它。
readLine()方法一次可以读取一行
字节流转字符流
保存原有文件拷贝
FileOutputStream(file类型文件,布尔值)// 布尔值表示是否拷贝
FileWriter也有追加的方法
追加是对写入数据操作的
序列化
Java对象序列化能够持久化保存对象状态。
在保存对象时把其转换成一组字节,等需要时再将自己组装回原来的对象。
- 类必须实现Serializable或Externalizable接口才能被序列化。
- 实现Serializable的类中若有不参与序列化的变量可用transient关键字修饰
- 用static修饰的静态成员变量,不参加序列化过程。
对象的序列化实现
ObjectInputStream
对象输入流,它的readObject( ) 方法从一个源输入流中读取字节序列,再反序列化为一个对象
ObjectOutputStream
对象输出流,它的writeObject( )方法可对参数指定的对象序列化并把得到的字节序列写到目标输出流中
先序列化后反序列化
- 对象序列化步骤
–创建一个ObjectOutputStream对象;
–通过ObjectOutputStream对象的writeObject(object)方法输出对象。 - 对象反序列化步骤
–创建一个ObjectInputStream;
–通过ObjectInputStream的readObject()方法读取对象。
BufferedReader和BufferedWriter
• BufferedReader和BufferedWriter:可以直接读一行字符或写一行字符。
• BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
• BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
DataOutputStream和DataInputStream
• DataInputStream和DataOutputStream:数据输入/输出流。
• 从输入流中读取基本 Java 数据类型,两个类中提供了读取和写入基本数据类型的特定方法。
• 比如:double readDouble()、void writeDouble()、int readInt()、void writeInt() 等等。
InputStreamReader和OutputStreamWriter
• 用来在字节流和字符流之间做中介,是字节流通向字符流的桥梁。