黑马程序猿-lesson7IO

File类:是IO包中唯一代表磁盘文件本身信息的类,而不是文件中内容。定义了一些与平台无关的方法来操纵文件。
java中目录被当作一种特殊文件使用,list方法返回目录中所有子目录和文件名。
Unix下路径分隔符【/】,DOS下用【\】,java可以混淆使用。


System.out.println(f.exists()?"exist":"not");//三元做参


RandomAccessFile类:
提供了众多文件访问方法,支持随机访问,读写等长记录格式文件时有很大优势。但此类仅限与操作文件,不能访问其他IO设备。
构造方法:
new RandomAccessFile(f,"rw");//读写方式
new RandomAccessFile(f,"r");//只读方式
read()方法不带参则尽可能的读取。


java中的空字符\u0000


trim()是去掉首尾空格;
str.replace(" ", "")去掉所有空格,包括首尾、中间;
replaceAll(" +","") 去掉所有空格;
str = .replaceAll("\\s*", "")可以替换大部分空白字符,不限于空格,\s可以匹配空格、制表符、换页符等空白字符的其中任意一个




××××getBytes的转换。java中中文占2字节英文2字节,本地系统中中文占2字节英文占1字节。××××


流类分为两大类:节点流
节点流:






















java流类分为两个大类:节点流和过滤流类(也叫处理流类)。


InputStream类来描述所有输入流的抽象概念。程序中使用的都是其子类。
read的阻塞
int read();//从输入流最低部分中读出内容,用整数返回,ASCLL码,读取到的字节个数要以返回值为准。
int read(byte[] b)
int read(byte[] b,int off,int len)
long skip(long n)//底层流只能顺序的读不能跳转,而上层包装类(包装输入流)可以。
int available()
void mark(int readlimit)
void reset()
voolean markSuported()
void close()

OutputStream类用来描述所有输出流的抽象概念。
void write(int b)//将其整数低一字节部分写入字节流
void write(byte[] b)
void write(byte[] b,int off,int len)
void flush()//清空内存缓存区,将缓冲区的内容强制写入外部设备
void close()//关闭流,关闭时缓冲区的内容也会被写入外部设备


FileInputStream、FileOutputStream粉笔用来创建磁盘文件的输入输出流对象。
创建FileInputStream实例对象时如果指定文件存在,则被覆盖清除。可以指定还不存在的文件名,不能指定已经被其他程序打开了的文件。
例:
FileInputStream in1 = new FileInputStream("hello.text");
File f = new File("hello);
FileInputStream in2 = new FileInputStream(f);

Reader和Writer是所有字符流类的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据。
wirter时候注意使用fluse();或者close()。
文本文件是二进制文件的特例。

///06
PipedInputStream、PipedOutputStream类用于在应用程序中创建管道通信。主要用于线程之间的通信。
同样提供了PipedWriter和PipedReader类。
使用管道流类,可以实现各个程序模块之间的松耦合通信。
ByteArrayInputStream、ByteArrayOutputStream类。用于以IO流方式来完成对字节数组内容读写,来实现类似内存虚拟文件或内存映像文件功能。
ByteArrayOutputStream()//创建32个字节的缓冲区
ByteArrayOutputStream(int)//创建指定字节的缓冲区,两种方法都会自增长。
StringReader和StringWriter类。

重视IO代码的复用。
System.in连接到键盘是InputStream的实例对象。System.out连接到显示器,是PrintStream类的实例对象。
不管底层物理设备的终止点标识,InputStream的read方法总是返回-1来表示输入流结束。
windows下ctrl+z,linux下ctrl+d产生键盘输入流的结束标记。
从键盘连续读取大段数据时,应尽量将读取数据的过程放在函数中完成,用-1作为键盘输入结束点。在该函数中编写的程序代码不应该直接使用System.in,而是用一个inputStream类型的形式参数对象来读取数据,然后将System.in作为实际参数传递给InputStream类型的形式参数来调用该函数。
07

ASCII最高bit位都为0,则其数字在0~127间。
中国大陆每一个中文字符都用两个字节的数字来表示,中文字符每个字节最高bit都为1,成为国标GB2312.
在GB2312上对更多字符(包括繁体)进行编码,称为GBK。
台湾地区为BIG5编码。
Unicode编码:ISO将全世界所有符号进行的统一编码。2的16次方,65536,保留2000多个。
Unicode字符都站两个字节,对于ASCII码原来占用的一个字节前增加一个所有bits为0的字节。
JAVA中字符使用的都是Unicode,再同时支持本地字符集。
UTF-8编码,对不同范围的字符集采用不同长度的编码,ASCII保持原样为1个字节。其他国家2~3个字节。通常要用EF BB BF作为文件开头的三个字节数据。
UTF-8与Unicode转换。
UTF-8有点:不出现内容为0x00的字节;便于应用程序检测数据在传输过程中是否发生错误;直接处理使用ASCII码的英文文档。
UTF-16在Unicode基础上进行了细节上的扩充,增加了对Unicode编码没有的那些字符的表示方式。一个使用Unicode编码的字符就是UTF-16格式的。
UTF-16扩充的字符,占四个字节,前面两个字节数值为0xD800-0XD8FF之间,后两个字节为0xDC00-0XDFFF。Unicode将0xD800-0xDFFF区间保留出来。
在不同体系结构的计算机系统中,UTF-16编码的Unicode字符在内存中的字节存储顺序是不同的。
如果文件以0xFE 0xFF开头表明是Big-ENdian的UTF-16编码;如果0xFF 0xFE开头,则是Litte-Endian的UTF-16编码。
//080910字符集编码中的细节。
写字节不会刷新缓冲区,而写字节数组的时候会自动调用flush()。
JAVA字符编码值是作为环境属性设置的,file.encoding=   。System.getProperties().list(System.out);
字符编码。System.getProperties().put("file.encoding", "iso8859-1");
String strInfo= new String(buf,0,pos,"GBK");
/
过滤流与包装类。
DataOutputStream类并没有对应到任何具体的流设备,一定要给他传递一个对应具体流设备的输出流对象,完成类似DataOutputStream个功能的类就是一个包装类,也叫过滤流类或处理流类。
public DataOutputStream(OutputStream out)

BufferedInputStream与BufferedOutputStream两包装类:
这两类不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
BufferedInputStream(InputStream in)//默认32字节输入缓冲流
BufferedInputStream(InputStream in,int size)//最好设置为机器最大操作数的整数倍
BufferedOutputStream(OutputStream out)//创建512字节的输出缓冲区
BufferedOutputStream(OutputStream out,int size)

BufferedReader和BufferedWriter类:
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符。

包装类!
DataInputStream与DataOutputStream类:
DataOutputStream类的三个写入字符串的方法:
public final void writeBytes(String s)
public final void writeChars(String s)
public final void writeUTF(String str)

DataInputStream中有一个readUTF但是没有readBytes和readChars。
流栈————流栈
程序——>DataOutputStream——>BufferedOutputStream——>FileOutputStream——>文件
程序<——DataInputStream<——BufferedInputStream<——FileInputStream<——文件

上层流对象close,底层流对象也close。

PrintStream类提供了一系列print和println方法,可将基本数据类型的数据格式化成字符串输出。
PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(\n),PrintWriter类也不会自动清空缓冲区。

///
ObjectInputStream和ObjectOutputStream包装类:用于从底层输入流中读取对象类型的数据和将对象类型的数据写入底层输出流。
必须事先Serializable接口(可序列化),对象中的transient(临时的)和static类型的成员变量不会被读取和写入。


字节流与字符流的转换:
 BufferedReader in
   = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader和OutputStreamWriter用于将字节流转换成字符流来读写的两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写到一个字节流中。

InputStreamReader和OutputStreamWriter读写时,尽量使用BufferedWriter类和BufferedReader来包装提高效率。


JAVA中用Process类的实例对象表示子进程,子进程标准输入输出不再连接到键盘显示器而是以管道流的形式连接到父进程的一个输入输出流对象上。
Process的getOutputStreeam和getInputStream方法获得子进程的输出、输入流对象。
高级02-14代码。
父进程结束后子进程还在运行。
管道有一定容量,为PipedInputStream缓冲区的大小。当缓冲区满了后,PipedOutputStream的writer方法产生阻塞。
记住调用Process类的destroy方法结束子进程运行。!!
//
02-15,IO类总结构图。字节输入流类,FilterInputStream类为所有输入包装类基类。
字节输出流类OutputStream。字符输入流类Reader。字符输出流类Writer。

Decorator设计模式,包装模式。
如果涉及自己的IO包装类,需要继承以FilterXXXX命名的类。
可以把一个字符串当作输出流使用。
System.out.println(ex.getMessage());//打印的是非详细信息
思考实践。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值