1 RandomAccessFile raf =newRandomAccessFile(file,"rw");//rw,读写,r只读
2 //打开文件时,文件指针在开头,pointer = 0;
3 raf.write(byte);//write方法只会写一个字节,同时直接指针指向下一个位置
4 int b = raf.read();//每次读一个字节,java中每一个字符占用两个字节,使用右移8位的方式分次写入
5 raf.seek(指针位置);//移动指针
6 raf.close();//文件读写完必定要关闭,不然可能会有意想不到的后果
在文件下载文件的时候,这种方式有很大的好处,每一个线程下载文件的一部分,
而后再拼接在一块儿,迅雷就是使用的这种方式,会记录指针的位置
4、字节流(InputStream、OutputStream,两个都是抽象类)
一、I/O流用来处理设备之间的数据传输
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
二、EOF = End 读到 -1 就读到结尾
三、输入流的基本方式主要是读
int b = in.read();//读取一个字节无符号填充到int第八位,-1是EOF
in.read(byte[] buf);//读入多个字节填充的字节数组
四、输出流的基本方式主要是写
out.write(int b);
out.write(byte[] buf);
五、FileInputStream具体实现了文件的读取操做
while((b=in.read())!=-1){读一个文件}
in.close();//必定要记得关闭流释放系统资源
批量读取(速度很是快,效率高) vs. 单字节读取(不适合读大文件,效率很低)
六、FileOutputStream具体实现了向文件中写数据的操做
是删除文件从新建立,仍是在原文件上追加内容,看构造方法
本身实现文件的copy操做
out.flush();
out.close();
七、数据输入输出流DataOutputStream/DataInputStream
对流功能的扩展,是一个包装类,能够更加方便的读取int,long,字符等类型数据,本质是使用的一种装饰模式实现的
八、字节缓冲流BufferedInputStream/BufferedOutputStream
为I/O提供了带缓冲区的操做,这种流模式提升了I/O的性能
.write();
.flush();//刷新缓冲区,不然写入不到文件中
.close();
5、字符流(参考API)
一、Java为何引入字符流?
操做文本时,尤为是包含中文字符等非ASCII码的字符会很不方便
字符流 = 字节流+编码
因此,要对编码问题很是清楚
二、java的文本(char)是16位无符号整数,是字符的Unicode编码(双字节)
文件是byte byte byte……的数据序列
文本文件是文本序列按照某种编码方式序列化为byte的存储
三、字符流(Reader Writer)操做的是文本文件
一次处理一个字符,字符的底层仍然是基本的字节序列
InputStreamReader 完成byte流按照编码解析为char流
OutputStreamWriter 提供char流按照编码解析成byte流
四、文件读写流 FileReader、FileWriter
无法设置编码,必须回到字符流设置编码
五、字符流的过滤器BufferedReader、BufferedWriter、PrintWriter
readLine 能够一次读一行,一次写一行
能够设置编码,不识别换行,单独写出换行操做
6、对象的序列化和反序列化
一、将Object对象转换成byte序列,反之叫对象的反序列化
二、序列化流(ObjectOutputStream),是过滤流---writeObject()
反序列化流(ObjectInputStream), ----readObject
三、序列化接口(Serializable)
对象必须实现序列化接口,才能进行序列化,不然将出现异常
这个接口没有任何方法,只是一个标准,是标记接口
对象序列化后,若是对再次对类文件修改,那么反序列化的时候就会出问题,那么怎么解决呢?
须要在类中设置序列版本id,惟一标记,这样不管怎么修改读取的时候都不会再有问题 serialVersionUID
四、transient关键字
声明的元素不会进行JVM默认的序列化,也能够本身完成这个元素的序列化
网络中传输时,并非全部的元素都是有必要传输的,尤为是要考虑节约网络流量的时候
在有些状况下,能够帮助咱们提升性能(ArrayList在数组没有放满的时候,只把有效元素序列化)
五、序列化中 子类和父类构造函数的调用问题
父类实现了序列化接口,子类不须要再次实现,就能进行序列化
对子类对象进行反序列化操做时,若是其父类没有显示的实现序列化接口,那么其父类的构造函数会被调用
7、输入输出流的一些包装类
一、打印流
PrintStream :字节打印流
PrintWriter :字符打印流
集成了Print()格式化输出方法,能够操做任意类型的数据
二、标准输入输出流
System类的in、out字段
默认输入设备是键盘,输出设备是显示器
标准IO重定向
System.setIn(InputStream);
//重定向输出能够将打印到控制台的日志写到文件
System.setOut(PrintStream);
System.err(PrintStream);
三、进程控制
在Java内部执行其余操做系统的程序,并要求控制这些程序的输入输出时
向OSExecute.command()传递一个command字符串
Process process = new ProcessBuilder(command.split(" ")).start();
OSExecute.command("javap test");
//javap是java的一个反编译程序
8、IO操做过程当中异常处理编程
本身编程要用try-catch-finally包围起来,若是有异常尽可能处理,千万不要仅仅是用printStackTrace()打印栈信息,在finally中进行流的关闭(判断引用不为空的话关闭),以确保必定能获得执行