#1# IO流 ~ 1
1.IO流的基础 File
implements Serializable,Comparable
1.基本定义 :
IO包中唯一代表磁盘文件本身的对象
2.基本操作 【这里用文件来做例子,而不是文件夹】
step 1 : 定义一个File : File file = new File("temp.txt");
注意这里只是定义了一个File的对象,文件还并没有创建
step 2 :创建File :
if(!file.exists()){ //判断文件是否存在
file.createNewFile() ; //这里会抛出一个异常,Try_Catch住
}
step 3 : 其它操作
#获取相对路劲:file.getPath() =>temp.txt
#获取绝对路径 : file.getAbsolutePath() => C:/demo/temp.txt
注意 :
如果File file = new File("C:/demo/temp.txt"),那么通过以上两个方法获取的路径就是一样的
#文件的大小 : file.length();
#文件是否存在 : file.exists();
#删除文件 : file.delete();
注意,如果file是一个文件夹,那么删除是返回false 失败的
#路径分割符 File.separator
根据不同的操作系统取不同操作系统下的分隔符 在window是 “\”
File.pathSeparator,在window下是“;”(分号),这个得注意
2.字节流 : InputStream / OutputStream
1.字节输入流 : InputStream implements Closeable
# 读取数据方法
read() : 如果下一个字节可读取,返回一个整形,遇到文件末尾,返回-1
read(byte[])
read(byte[] byte,int offset,int len)
这三个read方法,在输入数据可用,检测到流末尾或者异常前,此方法都将一直阻塞
# 获取可读取的文字数 : InputStream # int available()
2.字节输出流 : OutputStream implements Closeable, Flushable
#构造方法
FileoutputStream(String) ->FileOutputStream(String path,boolean append);
如果传入FileoutputStream中的File的文件不存在,那么会在new FileoutputStream(String path)的时候自动创建一个path对应的File
#.写入调用的API 流程 :
write(byte[]) ->write(byte[] byte,int offset,int byteLength)->write(int)
3.字符流 :Reader / Writer
#.tips : 获取JDK环境变量的方法 :
System.getProperties().list(System.out);
查看 file.encoding = Xxx 属性
#.字符编码
//使用GBK编码的字节数组 ,写入和读取的时候,尽量保持一致
byte[] demo = "Java基础".getBytes("GBK");
1.字符输入流 : Reader implements Readable, Closeable
2.字符输出流 : Writer implements Appendable, Closeable, Flushable
4.增加 Buff : BufferedXxx
为了达到最高的效率,避免频繁地进行字符与字节之间的相互转换,最好不要直接使用FileReader和FileWriter这两个类进行读写,而使用BufferedWriter包装OutputStreamWriter,使用BufferedReader包装InputStreamReader。
注意 :
1、利用BufferedWriter进行写操作,写入的内容会放在缓冲区内,直到遇到close()、flush()的时候才会将内容一次性写入文件。另外注意close()的顺序,一定要先关闭BufferedWriter,再关闭Writer,不可以倒过来,因为BufferedWriter的写操作是通过Writer的write方法写的,如果先关闭Writer的话,就无法将缓冲区内的数据写入文件了,会抛出异常
2、利用BufferedReader进行读操作,不可以用父类Reader指向它,因为readLine()这个方法是BufferedReader独有的,readLine()的作用是逐行读取文件中的内容
5.总结
1.字节流和字符流的区别:
API : 字节流中write ()是byte[] 或者int , 字符流中确实 char[]
本质: 字节流直接操作文件,针对的是单个字节的操作,而字符是通过StreamDecoder把InputStream读取数据到内存中字节进行解码成字符,然后再刷入到指定文件的,所以字符流针对的是字符(2* byte)
2.字符流和添加了BufferedXxx的对应字符流,都是用到内存缓存,这两者的区别?
首先,添加BufferedReader之类的作用为了避免FileReader频繁的字节转字符的操作
其次,同样具有内存缓存,区别就在于,FileWriter之类的是每次或取数据都是字节先转字符后到内存,而BufferedWriter确实直接先读到内存,满了之后或者调用Flush,再调用FileWriter把缓存中的数据写入
3.字节流转字符流
new BufferedReader(new InputSteamReader(new FileInputStream(new File("temp.txt")));
此外,outputStreamWriter 和 InputStreamReader 的都有主动设置Charset的构造方法
6.一些其它的流 : Other流
对象流 : ObjectOutputStream / ObjectInputStream
DataInputStream / DataOutputStream
RandomAccessFile