io流知识

编码为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源码中序列化和反序列化的问题

序列化可以递归调用父类的构造函数

对子类进行反序列化操作时,如果父类没有序列化操作,那么父类构造函数将会被调用


版权声明:本文为jialeJSP原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。