这两个晚上看了IO输入与输出的视频,感觉讲得慢了点,注意力不是很好,不过总算是看完了。下边是边看视频边做的笔记,总体感觉知识点还是能把握住。
io输入与输出主要包括以下内容:
File类
RandomAccessFile类
各种节点流类
字符编码
各种过滤流与包装类
IO类的相关应用
1.File类
File类 io包中唯一代表磁盘文件本身信息的类,而不是文件中的内容。如文件的创建时间等
File类定义了一些与平台无关的方法来操纵文件,如创建、删除、重命名文件,判断文件访问权限、文件是否存在,设置查询最近修改时间
在java中,目录被当作一种特殊的文件使用,list方法可以返回目录中的所有子目录和文件名
在Unix下的路径分隔符为/,Dos下的为/。
举例判断某文件是否存在,在则删除,不存在则创建
File f=new File("1.txt");
if(f.exists()){f.delete}else{f.createNewFile();}
System.out.print("File name"+f.getName());
2.RandomAccessFile类
是java类中最丰富的访问文件的类,提供很多文件访问方法 支持随机访问的方式,可以跳到任何地方读写操作
其在随机读写等长记录格式的文件时有很大的优势。
其仅限于操作文件,不能访问其他IO设备,如网络,内存映像等。
两个构造方法:
new RandomAccessFile(f,"rw");//读写方式
new RandomAccessFile(f,"r");//只读方式
举例:
public class employmee{
public String name=null;
public int age=0;
public static final int LEN=8;
public Employee(String name,int age){
if(name.length()>8){this.name=name.substring(0,8);}
else{while(name.length()<LEN){name+="/u0000"/*填充空字符*/}}
this.name=name;
this.age=age;
}
}
public class RandomFileTest{
public static void main(String[] args){
Employee e1=new Employee("zhangsan",23);
Employee e2=new Employee("lisi",24);
Employee e3=new Employee("wangwu",25);
RandomAccessFile ra=new RandomAccessFile("employee.txt","rw");
ra.write(e1.name.getBytes());
ra.write(e1.age);
ra.write(e2.name.getBytes());
ra.write(e2.age);
ra.write(e3.name.getBytes());
ra.write(e3age);
ra.close();
int len=0;
byte[] buf=new byte[8];
String strName=null;
RandomAccessFile raf=new RandomAccessFile("employee.txt","r");
raf.skipBytes(12);
len=raf.read(buf);
strName=new String(buf,0,len);
System.out.println(strName+":"+raf.read());
}
}
3.节点流
流的概念
inputStream和OutputStream类
FileInputStream和FileOutputStream类
Reader与Writer类
PipedInputStream与PipedOutputStream类
ByteArrayInputStream与ByteArrayOutputStream类
流的概念
什么叫流,是字节序列的抽象概念。数据传输时的形态
流类分为两大类:节点流类和过滤流类
inputStream:
程序可以从中连续读取字节的对象叫输入流,对于那些如文件输入流网络输入流等都是他的子类。
int read()
int read(byte[] b,int off,int len)
long skip(long n)
int available()
void mark(int teadlimit)
void reset()
boolean markSupported()
void close()
4.OutputStream
void write(int b)
void write(byte[]b,int off,int len)
void flush()清空内存缓冲区并输出到外部设备
void close()关闭流并把内存缓冲区输出到外部设备
5.FileInputStream和FileOutputStream类
用来创建磁盘文件的输入和输出流对象,通过它们的构造函数来指定文件路径和文件名
Reader与Write类
用于简化字符串中输入输出的编程,是所有字符类的抽象基类,用于读写文本数据
二进制文件和文本文件的区别:文本文件是二进制文件的特例,文本文件之外的文件为二进制文件
FileWriter out=new FileWriter("x.txt");
out.write("aa");//不调用刷新,但InputStream.write调用了刷新
out.close();//刷新到设备上
char [] buf=new char[1024];
FileReader in=new FileReader("x.txt");
int len=in.read(buf);
System.out.println(new String(buf,0,len));
PipedInputStream与PipedOutputStream类
用于应用程序中的创建管道、线程通信
两线程间通信
PipedWriter和PipedReader类是用于管道字符传输
ByteArrayInputStream与ByteArrayOutputStream类
用于以IO流的方式来完成对字节数组内容的读写
7.字符编码
计算机里只有数字,字符也不例外
ASCII美国标准信息交换码 一个字节
中国大陆 两个字节 称为GB2312 在此基础上还有GBK编码 台湾的是BIG5
本地化系统上的字符
unicode编码
ISO符号统一编码,称为unicode编码
占用两个字节,还保留两千多个数值没有用于字符编码
本地化字符编码和unicode编码共存
java中的字符都是用unicode同时支持本地平台的字符集
UTF-8编码 通用编码转换
ascii保持原样,对于其他国家的字符用两或三个字节表示。
使用utf-8编码的文件,通常用EF BB BF作为文件开头的三个字节数据
一字节表示:0xxxxxxx
二字节表示:110xxxxx 10xxxxxx
三字节表示:1110xxxx 10xxxxxx 10xxxxxx
这样就可以通过第一字节的内容就可以判断这个字符占用多少个字节
优点:
1不出现ox00字节
2便于应用程序检测数据在传输过程中是否发生错误
3直接处理使用ascii码的英文文档
缺点:
某些字符用了三字符
UTF-16编码
在unicode基础上进行一些细节上的扩充,增加对unicode编码没有包括的那些字节的表示方式
一个使用unicode编码的字符就是utf-16格式的
utf-16扩充的字符 占用四字节
11.过滤流与包装类
包装类的概念和作用
bufferedInputStream
datainputstream
printstream
objectinputstream
字节流与字符流的转换
包装类的概念和作用:
OutputStream操作字节,给你个浮点少数就很难操作
包装类如DateOutputStream提供往各种输出流对象中写入各种类型数据的方法。你现在要做的就是:传递一个FileOutputStream输出流对象给DateOutputStream实例对象和调用DateOutputStream实例对象的方法
DateOutputStream并没有对应任何具体的流设备,一定要传递一个对应具体的流设备的输出流对象,完成类似DateOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类
DateOutputStream构造方法:
public DateOutputStream(OutputStream out)
bufferedInputStream和bufferedOutputStream
从底层缓冲区读取然后缓存到bufferedOutputStream,实现读取一行
BufferedReader和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符
12DateIutputStream与DateOutputStream类
关闭流栈中的最上层的流对象(DateIutputStream),将会自动关闭流栈中的所有底层流对象(IutputStream)
printSteam类
提供一系列println和print方法,可以把基本类型数据格式化成字符串输出。
格式化是什么意思:97格式化输出的实际字节数据为0x39和0x37
13.objectinputstream与objectoutputstream类
用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。其读写的对象必须实现了Serializable接口(序列化)。对象中的transient和static类型的成员变量不会被读取和写入。
字节流与字符流的转换
找一种简单的方式读取键盘上输入的一行字符:
inputstreamreader和outputStreamWriter,是用于将字节流转换成字符流来读写的两个类,inputstreamreader可以将一个字节流中的字节解码成字符后读取,outputStreamWriter是将字符编码成字节后写入到一个字节流中。
避免频繁的在字节间进行转换,最好不要直接使用inputstreamreader和outputStreamWriter读写数据,应尽量使用BufferedReader类包装inputstreamreader,用BufferedWriter类包装outputStreamWriter
14.java程序与其他进程的数据通信
在java程序中可以用process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
遇到的问题:类很多,还没真正想明白他们之间的关系,字节流与字符流的相对的类容易混淆,看完后对这些类印象不深,真正用到他们,没办法找到最合适的,只能找到自己想到的几个比较简单的类应用。