编码为utf-8是乱码 ANSI是正常
byte类 s.getBytes() 可以转换成字节
integer.toHexString(b) 可以转换成Int类型 b & 0xff可以省略掉32位前面的24个0,保留后面八个零
gbk编码中文占两个字节 英文占一个字节
UTF-8中文占三个字节 英文占一个字节
UTF-16中文占两个字节 英文占两个字节
字节序列是什么编码方式就要用什么编码方式打印出来 String str1=new String(byte4,"utf-16");否则会出现乱码
在中文机器上打开文件默认为ansi编码方式
FILE类常用API介绍
java.io.file类表示文件和目录(信息和大小,不能用于文件内容的访问)
file.exists可以表示文件存在(true) false(不存在)
file.mkdir可以创建文件 mkdirs可以创建多级目录
file.isDirectory()判断是否为一个目录
file.isFile()判断是否为一个文件
createNewFile()可以创建一个文件
file或者file.getAbsolutePath()可以直接打印文件路径
file.getParent()可以直接打印没有文件名的路径
IllegalArgumentException("目录:"+dir+"不存在:");可以用在文件不存在上
String[] filenames=dir.list()可以返回dir目录的所有文件 但是不包括子目录
File[] files=dir.listFiles()返回的是dir文件的所有目录 也就是递归
RandomAccessFile类的使用
randomAccessFile可以访问和写文件,重要是可以随机访问文件的任意位置
(1)java文件模型
在硬盘上的文件是byte byte byte存储的,是数据的集合
(2)打开文件
打开文件有两种操作"rw"(读写) “r"(只读)
randomaccessfile raf=new randomaccessfile(file,"rw")//在创建randomaccessfile对象的时候需要指明读写类型
文件指针,打开文件时指针在开头 pointer=0;随机指针的好处是可以让文件多线程下载,比如迅雷的下载速度指,针会指向最后一次输入的字节位置数
(3)写方法
raf.write(int)-只占用一个字节(后八位)//write每次只能写一个字节 也就是八位(如果一个字节是32位 那么默认写最后八位 可以通过raf.write(i>>>24)来写前面八位字节 这也是Writeint的底层方法
(4)读方法
//读文件时候必须把指针移到文件头部 raf,seek(0) 如果不打 指针会指向写方法的最后一个的字节。
//可以通过 byte[] buf=new byte[(int)raf.length()]把文件中的内容都读到字节数组中
int b=raf.read();读一个字节
(5)读写完成后关闭文件读写状态
java最大的整数 int i=0*7fffffff;
b &0*ff表示以十六进制进行文件输出
IO流(输入输出流)//java读写文件的基础
字节流
有两个抽象父类inputstream(抽象应用程序读文件) outputstream(抽象应用程序写文件)
Eof=end 读到-1也是结束
输入流基本方法(读取键盘上的写入)
int b=in,read();读取一个字节也就是整数第八位.-1是EOF
in.read(byte[] buf)读取数据到数组buf中//更完善的读取数据的方法in.read(byte[] buf,int start,int size)
输出流基本方法
out.write(int b)写出一个字节到流,b的第八位
out.write(byte[] buf)将buf字节数组写入到流//更完善的方法与读取数据相同
fileinputstream in=new fileinputstream(filename)将文件作为字节流进行读操作
if(b<=0*f)表示一个字节
fileinputstream in=new fileinputstream(filename)将filename的字节存入对象in中
byte[] buf=new byte[20*1024]
int bytes=in.read(buf,0,buf.length);//将bytes存入buf对象中
system.out.print(integer.toHexString(buf[i] &0xff+"")//由于int类型的字节是32位,byte类型是8位,为了避免类型转换错误,通过&0xff将高24位清零
datainputstream/dataoutputstream方便进行普通流的读取(int,long)等字符类型数据
dataoutputstream out=new dataoutoutstream(file);//通过out对象对用方法(out.writeint(10)将10传入文件FILE中
fileinputstream一次写一个字节write()
dataoutputstream一次写几个字节writeint()
bufferedoutputstream一次写好多字节writeint()
flush()刷新缓冲区,否则写入不到缓冲区
c=in.read()//将内容传到等号左边对象
out.write(c)//将内容传到右边括号内
字符流
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)
文件时byte byte byte是数据序列
文本文件是文本(char)序列按照某种编码方案(utf-8 utf-16 gbk)序列化为byte的存储方式
字符的处理,一次处理一个字符
字符的底层任然是基本的字节序列
字符流的基本实现
Inputstreamreader 将byte流转化为char流,按照编码解析
outputstreamreader 将char流转换为byte流,按照编码处理
将文件读写入In时解析,再将文件进行isr字符转换,
fileinputstream in=new fileinputstreamr(file);
inputstreamreader isr=new inputstreamreader(in,gbk)
filereader and filewriter 默认创建gbk的文件
bufferedreader and bufferedwriter 可以嵌套在outputstreamwriter and inputstreamreader外,使读写变成一次读写一行
也可以使用printline代替bufferedreader bufferedwriter
对象的序列化和反序列化
序列化就是将object转换成byte流,反之就是反序列化
序列化流(objectoutputstream),是过滤流---writeobject
反序列化流(objectinputstream),readerobject
序列化需要借口(serializable)
student stu=(student)ois.readobject()//强制类型转换
string[] filenames=dir.list();//list可以将dir的内容储存在filenames对象中,返回的字符串数组(当前目录下的子目录和文件)
private transient int stuage//该元素不会进行jvm默认序列化,但是可以自己完成jvm的序列化
writeobject(s)
s.defaultwriteobject();//把jvm能默认序列化的元素进行序列化操作
s.writeint(stuage);//自己完成stuage序列化操作
反序列化
readobject(s)
s.defaultreadobject();//把jvm能默认序列化的元素进行反序列化操作
s.readint(stuage);//自己完成stuage反序列化操作
transirent可以分析ArrayList源码中序列化和反序列化的问题
序列化可以递归调用父类的构造函数
对子类进行反序列化操作时,如果父类没有序列化操作,那么父类构造函数将会被调用