IO是指用应用程序对数据设备的输入与输出的操作
File类
File类是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容
File类定义了一些与平台无关的方法来操作文件,例如:删除文件重命名文件,判断文件的读写权限,以及文件是否存在和设置,查询文件的最近修改时间
File f=new File(“11.txt”);//创建一个名为11.txt 的文件对象
f.CreateNewFile(); //这才真正地创建文件
f.CreateMkdir();//创建目录
f.delete();//删除文件
getAbsolutePath();//打印文件绝对路径
getPath();//打印文件相对路径
f.exists();//判断文件是否存在
f.canRead();//判断是否可读
f.isDirectory()//判断是否是目录
f.deleteOnExit();//在进程退出的时候删除文件
RandomAccessFile类
RandomAccessFile类是java类中功能最多的文件访问类,提高了众多的访问方法。
RandomAccessFile类支持“随机访问”方法,就是可以跳转到文件的任意位置开始读写数据
RandomAccessFile实例中有个指示器,它可以跳转到文件任意位置
RandomAccessFile是靠指示器只是的当前位置开始读写
RandomAccessFile类仅限于操作文件,不能访问其他的IO设备,如网络,内存映像等。
两种构造方法:
new RandomAccessFile(f,"rw")//读写方式
new RandomAccessFile(f,"r")//只读
write();//写入字节
read();//读取字节
skiBytes();//跳转字节,相对跳转
seek();//绝对跳转,定位字节
流的概念
流是字节序列的抽象概念
文件是数据的静态储存形式,而流式指数据传输时的形态,文件只是流可操作的一种IO 设备之一
流分为两大类:
节点流类和过滤流类(也叫处理流类)
节点流:负责数据源和程序之间建立连接;(相当于电线中的铜线,过滤流相当于电线的塑料皮)
过滤流:用于给节点增加功能。(相当于功能零部件)
程序可以从中连续读取字节的对象叫输入流.
在Java中,用InputStream类来描述所有输入流的抽象概念
InputStream为所有字节输入流的父类。
InputStream类的方法:
int read(); 从输入流中读取一个字节的内容,并且把字节的内容用int形式返回,如过遇到流的结束处返回的值是-1
可先使用new byte[]=数组,调用read(byte[] b)
read (byte[])返回值可以表示有效数;read (byte[])返回值为-1 表示结束。
long skip();跳过输入流的N个字节,并且返回实际跳过的字节数,主要用在包装流中
int available();返回当前输入流中可读的字节数
void mark();在输入流当中建立一个标记,用于包装类
close()关闭输入流对象
程序可以向其中连续写入字节的对象叫输出流.
在Java中,用OutputStream类来描述所有输出流的抽象概念。
IOutputStream为所有字节输出流的父类。
OutputStream类的方法
void write();写入内容 ,和输入流中的read相对应。
void flush();将内存缓冲区中的内容彻底清空并且输出到IO设备当中
close()关闭输出流对象
FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过他们的构造函数来指定文件路径和文件名
创建FileInputStream实例对象时,指定文件应当是可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中的原来内容将被覆盖清除。
对同一个磁盘文件创建FileInputStream对象的两种方式:
(1)FileInputStream inOne = new FileInputStream("hello.test");
(2)File f = new File("hello.test");
FileInputStream inTwo = new FileInputStream(f);
创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已经被其他程序打开了的文件
reader/write 只能输纯文本文件。
FileReader 类:字符文件的输出
管道流:也是一种节点流,用于给两个线程交换数据。
PipedOutputStream
PipedInputStream
ByteArrayInputStream 和ByteArrayOutputStream,用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能。
ByteArrayInputStream的两个构造函数:
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offset,int length)
ByteArrayOutputStream的两个构造函数:
ByteArrayOutputStream(); 创建一个32个字节的缓冲区
ByteArrayOutputStream(int);根据指定的大小创建缓冲区
StringReader类和StringWriter类来以字符IO流的方式处理字符串;
重视IO程序代码的复用性
System.in连接到键盘,是InputStream类型的实例对象
Syetem.out连接到显示器,是InputStream类型的实例对象
不管各种底层物理设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束。
在windows下,按下Ctrl+Z组合键可以产生键盘输入流的结束标记,在linux下,则是按下Ctrl+D组合键来产生键盘输入流的结束标记。
字符编码把字符转换成数字存储到计算机中,按ASCii 将字母映射为整数。
把数字从计算机转换成相应的字符的过程称为解码。
乱码的根源是编码方式不统一。任何一种编码方式中都会向上兼容ASCII码。所以英文没有乱码。
编码方式的分类:
ASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII)
ISO8859-1(欧洲,拉丁语派):1个字符占一个字节
GB-2312/GBK:1 个字符占两个字节。GB代表国家标准。
GBK是在GB-2312上增加的一类新的编码方式,也是现在最常用的汉字编码方式。
Unicode: 1 个字符占两个字节(网络传输速度慢)
UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。
缓冲流为IO流增加了内存缓冲区,增加缓冲区有两个基本目的:
--允许java程序依次不止操作一个字节,这样提高了程序的性能。
--由于有了缓冲区,使得在流上执行skip,mark和reset方法都成为可能。
BufferdInputStream 和BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。想想这种缓冲区与底层系统提供的缓冲区的区别。
BufferedReader 和 BufferedWriter类
BufferedReader 的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符
DataOutputStream,DataInputStream:可以对八种基本类型加上String类型进行写入。
因为每种数据类型的不同,所以可能会输出错误。
所有对于:DataOutputStream DataInputStream两者的输入顺序必须一致。
PrintStream 类提供了一系列的print和prinln方法,可以将基本数据类型的数据格式转化成字符串输出。
与PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(/n),PrintWriter类也不会自动清空缓冲区。
PrintWriter的println方法能根据造作系统的不同而生成相应的文本换行标识符。在Windows下的文本换行标识符是“/r/n”,而Linux下的文本换行标识符是“/n”。
ObjectInputStream和ObjectOutputStream
这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。
ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入。
用transient修饰的属性为临时属性
InputStreamReader 和OutputStreamWriter,是用于将字节流转换成字符流来读写两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
避免频繁地在字符与字节间进行转换,最好不要直接使用
InputStreamReader 和OutputStreamWriter类来读写数据,尽量使用BufferedWriter类包装OutputStreanWriter类,用BufferedReader类包装InputStreamReader。
在java程序中可以使用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和现实器,而是以管道流的形式连接到父进程的一个输出流和输入流的对象上。
调用Process类的getOutStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。