Module 10:I/O流(java如何实现与外界数据的交流)
$ P$ K6 q0 W Z U1 G" @3 h$ ^Input/Output:指跨越出了JVM的边界,与外界数据的源头或者目标数据源进行数据交换。 % v _+ D0 ^8 f8 ^
$ O! y* n6 T! }! M9 s, y4 X 注意:输入/输出是针对JVM而言。
0 Z4 i+ i3 Y- ^% ?7 ~5 _File类(java.io.*)可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。 0 K+ M, E, Z8 m' e5 [' z
Java.io下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。 * z0 S- p7 W% ~6 H `2 {
注意:创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。
; Z$ M' y: \4 ~& o! F o例如:File f=new File(“11.txt”);//创建一个名为11.txt的文件对象
& k& J6 Y8 W0 x! v; bf.CreateNewFile(); //真正地创建文件
. o% s, i3 q+ n3 j* F
3 H$ P, S' m* x& l7 I* G. ~( mf.CreateMkdir():创建目录
1 Q \$ O. r1 p) vf.delete();删除文件
; v+ w6 a' h# W0 L9 m; o7 l% rf.deleteOnExit();在进程退出的时候删除文件,这样的操作通常用在临时文件的删除。
0 K( l7 \8 J8 w; f! Y6 q* w0 ~, j: W6 E 1 W( n9 n& \) {% `4 S' v$ \
对于命令:File f2=new file(“d:\\abc\\789\\1.txt”) 8 w& \( I B+ J) e& t
这个命令不具备跨平台性,因为不同的OS的文件系统很不相同。 1 G8 A( k9 _! ^! r1 p$ o+ u
如果想要跨平台,在file类下有separtor(),返回锁出平台的文件分隔符。 5 H$ \ j: b0 U4 |
File.fdir=new File(File.separator); " V0 |. q% O& y+ u- X
String str=”abc”+File.separator+”789”;
5 N8 D( q, n/ S# k+ k1 \5 V" O使用文件下的方法的时候一定注意是否具备跨平台性。
& L% O6 B6 X7 o4 L
; }! y! O# D, c, |& Z7 bList():显示文件的名(相对路径) , } Y0 r; p! Y/ }- D R# O/ g
ListFiles():返回Files类型数组,可以用getName()来访问到文件名。 ! h8 C5 T& z, V( T
使用isDirectory()和isFile()来判断究竟是文件还是目录。
7 w* ?, J. P' n' P4 H# v K1 h( M, T 1 ?; m1 B) j! H
练习: 6 a# X( o6 ^" ?
写一个javaTest程序,列出所有目录下的*.java文件,把子目录下的JAVA文件也打印出来。
, E/ u4 d# ~8 r8 W* [
. u& u9 w U3 N使用I/O流访问file中的内容。
! }& k$ X0 o' J* MJVM与外界通过数据通道进行数据交换。
1 E! Y' O7 T# e( T分类:
* h8 c1 g9 s. Y2 `* P按流分为输入流和输出流;
; r* |& z) m+ L* Y% m按传输单位分为字节流和字符流; # c& D1 T. g5 s/ f" y
还可以分为节点流和过滤流。
3 a: ]: M9 {' X1 ]/ i0 ?节点流:负责数据源和程序之间建立连接; - K* O9 R4 q/ p }1 v6 I8 u
过滤流:用于给节点增加功能。 - \. }! ?4 [+ n" C2 s7 l: \; I
过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。
& l1 W, f0 E/ m, a; a4 \ ( J- a1 x, a/ z' z
字节输入流:io包中的InputStream为所有字节输入流的父类。 1 W3 u( a1 ]: M, w& w
Int read();读入一个字节(每次一个); ; y% s$ Y4 d3 v: m& z) h$ Z
可先使用new byte[]=数组,调用read(byte[] b)
) u! f8 J" e' ]1 R$ d5 |2 kread (byte[])返回值可以表示有效数;read (byte[])返回值为-1表示结束。
% p2 Z; V/ o. i: G # l. H$ O9 s4 L8 } J+ |; g
字节输出流:io包中的OutputStream位所有字节输入流的父类。
" F- A* F) K6 ^0 b2 z# gWrite和输入流中的read相对应。 ; Y% s, l) R* [5 h5 D
D" B* e% l: t5 W在流中close()方法由程序员控制。因为输入输出流已经超越了VM的边界,所以有时可能无法回收资源。
! S" O8 k9 X) n! z$ l: q: S% e原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。 / K0 f; H1 M. x4 W7 r3 U7 I% R
以Stream结尾的类都是字节流。
3 {, `8 s0 G& k如果构造FileOutputStream的同时磁盘会建立一个文件。如果创建的文件与磁盘上已有的文件名重名,就会发生覆盖。 & }9 x( [# b" g3 P$ Y
用FileOutputStream中的boolean,则视,添加情况,将数据覆盖重名文件还是将输入内容放在文件的后面。(编写程序验证)
2 n3 w7 ~- J, @# [+ [2 [; H 7 z2 j$ {0 S& E
DataOutputStream:输入数据的类型。 |