#1# IO流 ~ 1

2019-12-18  本文已影响0人  SnailWalker

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

*感谢*

五月仓颉 : https://www.cnblogs.com/xrq730/p/4886636.html

上一篇 下一篇

猜你喜欢

热点阅读