a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 228|回复: 1

[基础知识] JAVA面向对象编程课堂笔记28

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
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:输入数据的类型。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA面向对象编程课堂笔记28

因为每中数据类型的不同,所以可能会输出错误。 4 {* g& p6 Q: N: M" q& p6 W
所有对于:DataOutputStream / r! s: p  k9 d) n$ x' K
          DataInputStream & a+ [7 E5 k3 v6 w+ m7 F
          两者的输入顺序必须一致。 " F; t9 F) @1 y" f. d4 v
过滤流:
3 N  o5 ?3 J. l bufferedOutputStream 8 g7 s  j& `. Q5 S) ]* c3 P
bufferedInputStream
0 w1 O1 t, M3 f% e+ u用于给节点流增加一个缓冲的功能。 : S; ~: \/ b7 ]4 i: q( ~9 k
在VM的内部建立一个缓冲区,数据先写入缓冲区,等到缓冲区的数据满了之后再一次性写出,效率很高。 ! {1 O: S$ }, Q# k* U9 m
使用带缓冲区的输入输出流的速度会大幅提高,缓冲区越大,效率越高。(这是典型的牺牲空间换时间)
( Z! o7 s, N+ a' s& Y7 ?切记:使用带缓冲区的流,如果数据数据输入完毕,使用flush方法将缓冲区中的内容一次性写入到外部数据源。用close()也可以达到相同的效果,因为每次close都会使用flush。一定要注意关闭外部的过滤流。
4 t, u1 u" M$ y5 |; U9 t9 r9 o  4 |! s% n$ o8 ?# A
(非重点)管道流:也是一种节点流,用于给两个线程交换数据。
0 r# F: M$ R# c2 O' YPipedOutputStream
+ f4 @0 d8 K1 V. `0 P% U$ |PipedInputStream * C! b: B5 {% d. w
输出流:connect(输入流)
$ q& b+ X% q+ G# L4 f1 `: N  
/ w: ]4 e, L9 xRondomAccessFile类允许随机访问文件 ( |& U9 m) @0 ~, f$ g! g6 c+ Z
GetFilepoint()可以知道文件中的指针位置,使用seek()定位。
+ o+ H$ c6 q- z3 z) AMode(“r”:随机读;”w”:随机写;”rw”:随机读写)
5 n( d, Z/ o# L) s练习:写一个类A,JAVA A file1 file2
- g7 j! O8 U0 m) S2 b6 P  |file1要求是系统中已经存在的文件。File2是还没有存在的文件。
' u8 K7 A; C# j0 {# x; M9 U执行完这个命令,那么file2就是file1中的内容。
8 p8 P1 q" R2 G( k5 x  
$ P' V- n. n# n  T: O字符流:reader\write只能输纯文本文件。
- s* P- P1 a, Z( z! |FileReader类:字符文件的输出
4 Q  N* o4 {' P/ t( P( y" V* b  ; q5 a9 F! @; J
字节流与字符流的区别:
  z  e$ N4 O4 i; \$ }% B! i字节流的字符编码: : M4 j+ n4 a/ f" v
字符编码把字符转换成数字存储到计算机中,按ASCii将字母映射为整数。 0 b$ d0 n& r* t1 l
把数字从计算机转换成相应的字符的过程称为解码。
  [! o1 v* Y9 P, F$ k  g) Q0 I4 N编码方式的分类:
2 P8 w) e! G( C6 v) T2 mASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII) 9 ?4 }. M. h/ F
ISO8859-1(欧洲):1个字符占一个字节 6 T9 {* Z$ P6 V" X* G: t8 X& d& S# n
GB-2312/GBK:1个字符占两个字节
7 X4 }+ k, Q% vUnicode: 1个字符占两个字节(网络传输速度慢) , A5 \+ q/ K" y+ d
UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。
% D1 a9 U: D! S# q# @  
& H. x8 o; r! `  ~0 Y( n原则:保证编解码方式的统一,才能不至于出现错误。 3 G4 T# L3 E  Z' E, I% M/ H
Io包的InputStreamread称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式。 / h8 g% u$ j- L/ l# m
OutputStreamred:字符到字节 * D0 u) {$ r6 ~
Bufferread有readline()使得字符输入更加方便。
! \& X& E- f1 u" m/ `) _9 d在I/O流中,所有输入方法都是阻塞方法。 * p2 _+ O7 f- z$ U& q  G
Bufferwrite给输出字符加缓冲,因为它的方法很少,所以使用父类printwrite,它可以使用字节流对象,而且方法很多。 % f4 ^! O3 [. P# T- L
  $ @& P! A" t- r9 W
练习:做一个记事本 1 q$ W* H' Q# m) \: d2 z9 N
swing/JfileChoose: getSelect file()
! v) |1 M5 S# ~- L! ZInputStreeamReader:把字节变为字符 9 @4 C$ z2 k! N' a0 p0 X
JAVA中对字符串长无限制  bufferedReader(ir)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 19:57 , Processed in 0.282676 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表