输入输出流

1 流

1.1 流的概念:

Java io包通过数据流、序列化和文件系统为用户提供了一种完成I/O操作的输入/输出流;

流就是对输入输出的一个封装,用于屏蔽具体物理目标的差异性;

数据流是指所有的数据通信通道;

Java程序不能直接操纵输入输出设备,而是在程序和设备之间加入了一个中间介质,叫做流;

1.2 流的分类

BIO同步阻塞:数据的读取必须阻塞在一个线程里等待其完成;

NIO同步非阻塞:一个线程不断的轮询每个输入输出的状态改变,如果有状态发生了改变,则进行下一步的操作;

AIO同步阻塞:无需一个线程去轮询IO操作的状态改变,在发生改变后,系统会通知对应的线程来处理。

按照流向分为输入(读数据)和输出流(写数据);

按照传输单位分为字节流和字符流(字节为8位,字符为16位,进行二进制操作)使用桥节流可以实现两个流的转换;

按功能分为节点流和过滤流:

节点流:负责数据源和程序之间建立连接,节点流对特定的地方读写,

过滤流:用于给节点增加功能,过滤流使用节点流进行输入/输出并增添附加功能;

               1.针对对象进行功能扩展的最直接的方式是继承,最大的缺陷是耦合

               2.具体采用的是装饰模式,装饰与被装饰类可以独立发展,不会相互耦合,缺点是多层装饰比较复杂。

I/O流是一种很宝贵的资源,使用完后必须调用close()方法关闭并释放资源,注意只关闭最外层的流。

2 File类

首先,java.io.File用于封装和平台无关的文件夹和文件夹对象。

2.1 常见的构造方法

File(String pathName)以path为路径创建File对象

File(String parent,String child)这里文件对象的路径为相对于parent路径的child路径;

2.2 需要记忆的方法

File ff = new File("路径");

System.out.println(ff.getAbsolutePath());//用于获取文件对象的绝对路径

//首先要判断该文件是否存在
System.out.println(ff.exists());

System.out.println(ff.isDirectory());   //用于判断当前文件对象是否为文件夹

System.out.println(ff.ifFile());   //判断当前文件是否为文件

System.out.println(ff..length());   //获取指定文件对象的字节数,单位为字节

ff.delete();   //删除文件或者文件夹,注意Java并不能保证删除一定成功

ff.mkdirs();   //创建多级文件夹,而使用mkdir只能创建一层文件夹

//实际编程中很少使用的方法
listFiles():File[]    //获取当前文件夹里的所有子文件信息,子文件为File对象;

2.3 访问文件名的方法

  - getName():   String获取文件名称;

  - getPath():    String获取路径,如果构建File时使用的是相对路径,返回的即相对路径,绝对路径同理;

  - getAbsolutePath:  String获取绝对路径

  - getParent():  String获取当前文件对象的上级File对象,如果构建文件对象是相对路径,返回为null;

2.4 文件检测相关方法

常用的:

 - isFile():  boolean是否是文件;

 - isDirectory(): boolean是否为文件夹

不常用:

 - canWrite():boolean 是否可写

 - canRead():boolean是否可读

 - isAbsolute():boolean是否为绝对路径

 - lastModied():long文件的后修改时间

3 字节流

在顶层有两个抽象类InputStream和OutputStream。

InputStream和OutputStream中定义了read()和write()方法,它们被派生流类重载;

3.1 基本输入输出

System类是一个非常强大的类,提供了标准的输入,输出及运行时的系统信息;

 - System类不能创建对象,也就是说,System类的所有属性和方法都是静态的,引用时要以System作为前缀

 - System.out:把输出送到缺省的显示(通常是显示器),是PrintStream的对象

 - System.in:从标准输入获取输入(通常是键盘),是InputStream的对象

 - System.err:把错误信息送到缺省的显示,是PrintStream的对象 

 - System.in与System.out是System类的两个静态属性

- 从键盘上读取一个字节的数据并返回读取的int类型内容0-255,如果输入中文则会出现乱码,因为一个中文由2个字节构成

4 字符流(用于操作文本文件)

Reader字符输入流

  • read():int 0-65535  -1
  • read(char[]):int  -1
  • close():void
  • FileReader :用于操作文件,属于节点流,读取指定文件并在控制台上进行显示

Writer字符输出流

  • write(int):void
  • write(char[],int,int):void
  • close()

FileWriter用于操作文件

  •   new FileWriter(String fileName)
  •   new FileWriter(String fileName,boolean append)   默认覆盖,boolean表示是否追加

5 节点流

具体类

  1. 针对文件操作:FileReader、FileWriter和FileInputStream、FileOutputStream
  2. 针对内存数组操作:CharArrayReader、 CharArrayWriter和ByteArrayInputStream、 ByteArrayOutputStream
  3. 针对内存字串操作:StringReader、 StringWriter,没有对应的字节流
  4. 管道流用于线程通信操作:PipedReader、 PipedWriter和PipedInputStream、 PipedOutputStream

文件节点流

  • FileInputStream和FileOutputStream是文件字节流,是一种节点流 
  • FileOutputStream(“文件名称”)  如果文件不存在则新建文件,如果文件存在则覆盖文件内容

内存数组节点

如果是文本则使用char[],如果是二进制则使用byte[]

构造器方法

  • CharArrayReader(char[] buf)其中char[]就是数据的来源,也就是说Reader就是从char[]中读取数据
  • CharArrayRead(char[] buf,int offset,int length)

内存字串流

StringReader用于从一个字串String中读取数据,StringWriter用于给一个StringBuer中写入数据,实现一个可边 长的字串。

先到这吧!下一篇总结过滤流、桥节流、缓冲流、数据流、打印流和对象流噢!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值