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

简介: 一文读懂Java之标准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

  1. 从数据方向分:输入流和输出流

                           InputXXXXX  ,  OutputXXXXX

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

                           节点流用来传输数据。

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

六、 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参数指定了所要填入的数组的子范围。

  1. 其它方法

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

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

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

     d. boolean markSupported()

     e. void mark(int)

     f. void rese()

  1. 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的边界,所以有时可能无法回收资源。

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

  1. 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();
复制代码

  1.   BufferInputStream和BufferOutputStream

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

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

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

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

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

  1. 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()

  1. 随机存取文件

        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

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


作者:zhulin1028

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
3月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
514 2
|
5天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
52 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
26天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
2月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
45 3
|
2月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
129 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
71 4