ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

一文读懂Java之标准I/O流与文件

2021-11-06 13:01:05  阅读:178  来源: 互联网

标签:文件 Java 一文 int 读懂 FileOutputStream File new 字节


目录

一、对文件的操作 

二、 处理跨平台性

三、 对象的序列化接口

四、  I/O流基础

五、流的分类

六、 I/O输入输出


 

一、对文件的操作 

1.File类(java.io.File)可表示文件或者目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。

File下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。

注意:创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。

例如:File f=new File(“11.txt”);//创建一个名为11.txt的文件对象

f.CreateNewFile();     //真正地创建文件

2.File的方法

Boolean createNewFile() //创建文件

Boolean mkdir() //创建目录

Boolean mkdirs() //创建多个目录

Boolean delete() //删除文件

Boolean deleteOnExit(); //在进程退出的时候删除文件,这样的操作通常用在临时文件的删除。

String[] List():返回当前File对象下所以显文件和目录名(相对路径)

File[] ListFiles():返回当前File对象所有Files对象,可以用getName()来访问到文件名。

isDirectory()和isFile()来判断究竟是目录还是文件。

String getParent()    得到父类文件名

File getParentFile()  。。。

String getPath()                 。。。路径

exists() 判断文件是否存在

二、 处理跨平台性

对于命令:File f2=new file(“d:\\abc\\789\\1.txt”)

这个命令不具备跨平台性,因为不同的OS的文件系统的分隔符是不相同。

使用file类的separtor属性,返回当前平台文件分隔符。

File newD = new File("aa"+File.separator+"bb"+File.separator+"cc");

       File newF = new File(newD,"mudi.txt");

       try{

       newD.mkdirs();

       newF.createNewFile();

       }catch(Exception e){}

三、 对象的序列化接口

Serializable接口没有方法,是标识接口。

序列化的步骤:

1)  实现Serializable 接口

2)  实例化对象文件输出对象

3)  将对象输出到文件里

4)  有些临时变量生命周期不需要超过虚拟机的生命周期,需要加上:transient 关键字,这个属性不被序列化。

一个序列化对象内部属性的对象也需要序列化接口。

四、  I/O流基础

Input/Output:指跨越出了JVM的边界,与外界进行数据交换。

注意:输入/输出是针对JVM而言。

五、流的分类

         1) 从数据类型分:字节流和字符流

字节流类:

抽象父类: InputStream,OutputStream

实现类:

                            BufferedInputStream 缓冲流-过虑流

                            BufferedOutputStream

                            ByteArrayInputStream 字节数组流-节点流

                            ByteArrayOutputStream

                            DataInputStream    处理JAVA标准数据流-过虑流

                            DataOutputStream

                            FileInputStream 处理文件IO流-节点流

                            FileOutputStream

                            FilterInputStream 实现过虑流-字节过虑流父类

                            FilterOutputStream

                            PipedInputStream 管道流

                            PipedOutputStream

                            PrintStream  包含print() 和 println()

                            RandomAccessFile 支持随机文件

抽象父类:Reader, Writer

实现类:

                            BufferedReader

                            BufferedWriter

                            PrintWriter

                            CharArrayReader

                            CharArrayWriter

                            FileReader

                            FileWriter

                            FilterReader

                            FilterWriter

                            InputStreamReader

                            OutputStreamWriter

                            PipedReader

                            PipedWriter

                            StringReader

                            StringWriter

2) 从数据方向分:输入流和输出流

                            InputXXXXX  ,  OutputXXXXX

3) 从流的功能分:节点流和过滤流(使用到油漆工模式)

                            节点流用来传输数据。

                            过滤流用来封装节点流或者其他过滤流,从而给节点流或其他的过滤流增加一个功能。

六、 I/O输入输出

流的标准写法:

OutputStream os=null;

                   OutputStream os=null;

                   try{

                            String a="hello";

                            byte[] b=a.getBytes();

                            os=new FileOutputStream("D:\\aa.txt");

                            os.write(b);

                   }catch(IOException ioe){

                            ioe.printStackTrace();

                   }finally{

                            if(os!=null){

                                     try {

                                               os.close();

                                     } catch (IOException e) {

                                               // TODO Auto-generated catch block

                                               e.printStackTrace();

                                     }

                            }

                   }

1. InputStream类

所有字节输入流的父类,如:FileInputStream,ObjectInputStream,PipedInputStrean

1) 三个基本的read()方法

      a. int read(): 从流里读出的一个字节或者-1; (实际读了多长)

      b. int read(byte[]):将数据读入到字节数组中,并返回所读的字节数; (期望读了多长)

      c. int read(byte[], int , int):两个int参数指定了所要填入的数组的子范围。

2) 其它方法

      a. void close(): 关闭流,如使用过滤器流,关闭栈顶部的流,会关闭其余的流。

      b. int available(): 返回可从流中读取的字节数。

      c. skip(long): 丢弃了流中指定数目的字符。

      d. boolean markSupported()

      e. void mark(int)

      f. void rese()

2. OutputStream方法

答:1) 三个基本的read()方法

      a. void write():

      b. void write(byte[]):

      c. void write(byte[], int , int):

      写输出流。

   2) 其它方法

      a. void close(): 关闭流,如使用过滤器流,关闭栈顶部的流,会关闭其余的流。

      b. void flush(): 允许你强制执行写操作。

注:在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。

原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。

3. FileInputStream和FileOutputStream

答:1) 节点流,使用磁盘文件。

   2) 要构造一个FileInputStream, 所关联的文件必须存在而且是可读的。

   3) 要构造一个FileOutputStream而输出文件已经存在,则它将被覆盖。     

FileInputStream infile = new FileInputStream("myfile.dat");

FIleOutputStream outfile = new FileOutputStream("results.dat");

FileOutputStream outfile = new FileOutputStream(“results.dat”,true);

                   参数为true时输出为添加,为false时为覆盖。 

         FileOutputStream类代码:(为什么能建文件)              

     Public FileOutputStream(String name){

         This(name!=null?new File(String):null,false);

                   }

键盘流

         PrintWriter : System.in

4.  DataInputStream和DataOutputStream

为过滤流。通过流来读写Java基本类,注意DataInputStream和DataOutputStream的方法                  是成对的。

         过滤流。输出输入各种数据类型。

         writeBoolean(boolean b) ------以1bit数据传送

         writeByte(int)  ------以1 byte数据传送

         writeBytes(String s) --------以byte序列数据传送

         writeChar(int v) ――――――以 2 byte

         writeChars(String s)-------------以 2 byte序列

         writeDouble(double d)  -------以 8 byte

         writeInt(int v)

         writeLong(long l)

         writeShort(short s)

         writeUTF(String)-----------能输出中文!

6.ObjectInputStream和ObjectOutputStream

         过滤流。处理对象的持久化        

Object o = new Object();

         FileOutputStream fos=new FileOutputStream("Object.txt");

         ObjectOutputStream oos=new ObjectOutputStream(fos);

         oos.writeObject(o);

         oos.close();

         FileInputStream fis =new FileInputStream(“Object.txt”);

         ObjectInputStream ois =new ObjectInputStream(fis);

         Object o = (Object)Ois.readObject();

         ois.close();

7.    BufferInputStream和BufferOutputStream

         过滤流,可以提高I/O操作的效率

         用于给节点流增加一个缓冲的功能。

在VM的内部建立一个缓冲区,数据先写入缓冲区,等到缓冲区的数据满了之后再一次性写出,效率很高。

使用带缓冲区的输入输出流的速度会大幅提高,缓冲区越大,效率越高。(这是典型的牺牲空间换时间)

切记:使用带缓冲区的流,如果数据数据输入完毕,使用flush方法将缓冲区中的内容一次性写入到外部数据源。用close()也可以达到相同的效果,因为每次close都会使用flush。一定要注意关闭外部的过滤流。

8. PipedInputStream和PipedOutputStream

         用来在线程间通信.         

PipedOutputStream pos=new PipedOutputStream();

                   PipedInputStream pis=new PipedInputStream();

                   try

                   {

                            pos.connect(pis);

                            new Producer(pos).start();

                            new Consumer(pis).start();

                   }

                   catch(Exception e)

                   {

                            e.printStackTrace();

                   }

9.RandomAccessFile  随机访问

         可以得到文件指针。

long getFilePointer()  得到从文件开始处到文件指针的位置。

seek(long point)  将文件指针移动到此处。

10 、Reader和Writer

         1) Java技术使用Unicode来表示字符串和字符,而且提供16位版本的流,以便用类似的方法处理字符。

   2) InputStreamReader和OutputStreamWriter作为字节流与字符流中的接口。

   3) 如果构造了一个连接到流的Reader和Writer,转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。

         4) 字节流与字符流的区别:

编码是把字符转换成数字存储到计算机中。把数字转换成相应的字符的过程称为解码。

编码方式的分类:

ASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII)

ISO8859-1(欧洲):1个字符占一个字节

GB-2312/GBK:1个字符占两个字节

Unicode: 1个字符占两个字节(网络传输速度慢)

UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。

         BufferedReader的方法:readLine():String

         PrintWriter的方法:println(….String,Object等等)和write()

11. 随机存取文件

         1) 实现了二个接口:DataInput和DataOutput;

   2) 只要文件能打开就能读写;

   3) 通过文件指针能读写文件指定位置;

   4) 可以访问在DataInputStream和DataOutputStream中所有的read()和write()操作;

   5) 在文件中移动方法:

      a. long getFilePointer(): 返回文件指针的当前位置。

      b. void seek(long pos): 设置文件指针到给定的绝对位置。

      c. long length(): 返回文件的长度。

12.编码问题:

         编码的方式:

                   每个字符对应一个整数。

                   不同的国家有不同的编码,当编码方式和解码方式不统一时,产生乱码。

                   因为美国最早发展软件,所以每种的编码都向上兼容ASCII 所以英文没有乱码。

ISO-8859-1    西方字符

                   GB2312     。。。。。。镕

                   GBK

                   Big5

                   Unicode

                   UTF-8

补充:

         字节流结束返回 -1

         字符流结束返回null

         对象流结束返回 EOFException

引申---------〉异常经常被用在流程控制, 异常也是方法的一种返回形式。

        

标签:文件,Java,一文,int,读懂,FileOutputStream,File,new,字节
来源: https://blog.csdn.net/xiejiachao/article/details/121150835

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有