java之IO处理
File文件基础
文件与文件夹抽象路径名称的表示。其构造方法有四个
File(File parent,String child):从抽象父文件夹下创建一个File实例。
File(String parent,String child):从父文件夹下创建一个File实例。
File(String pathname):从指定路径下创建一个File实例。
File(URI path):从URI转换成抽象路径下创建一个File实例。
listFiles()方法:返回一个抽象路径名数组,这些抽象路径名表示文件夹中的子项(文件或文件夹)
File file = new File("/home/colin");
File[] childs = file.listFiles();
listFiles(FileFilter filter):FileFilter是抽象路径名的过滤器。能够用于返回过滤器要求的子文件夹
File file = new File("/home/colin");
//有没有考虑过,java中不同意实现接口实例,可是在匿名内部类中却实现了接口。比方这个FileFilter接口
//实际上假设查看编译后的代码(会发现编译后的代码中有一个class文件。这个class实现了这个接口。并重写了这个接口的方法)
//所以这是一种虚拟实例化接口。或者理解为间接实例化接口。
File[] childs = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().startsWith(".");
}
});
另一个listFiles(FilenameFileter filter):FilenameFile用于检測指定文件是否包括在特定文件夹下
其它API相对简单了,获取文件状态、创建删除文件
RandomAccessFile随机读写文件
File 实例仅仅涉及到对文件的操作,java提供了能够对文件随机訪问的操作,訪问包含读和写操作。这样的实现是基于指针的操作。
两个构造方法:
RandomAccessFile(File name,String model)
RandomAccessFile(String name,String model)
model指定的是对文件随机訪问操作模式。有两种模式各自是仅仅读模式和读写模式。"r"表示文件的訪问是仅仅读的,"rw"表示读和写模式。
RandomAccessFile file = new RandomAccessFile("/home/colin","rw");
写数据:
write(byte[] b):将指定自己数组b写到随机读写文件里,写到指针的位置
write(byte[] b,int off,int len):指定了起始位置和长度
write(int n):将n的低八位写到文件里去
他还有写入特定特性的方法:writeBoolean(boolean b)、writeInt(int n)、writeDouble(double v)、writeChart(chart c)、writeCharts(String s)、writeByte(int n)、writeBytes(String s)、writeFloat(Float t)等
读数据:
int read():读取1byte(8位)放到int的低八位中,高24为为0。假设读到-1,说明读到了文件的末尾
int read(byte[] b):最多读取b.length个字节到数组中。返回值为实际读取到的字节量
int read(byte[] b,int off, int length):指定读取数组的起始位置和读取长度
对应的还有读取特定类型数据的read
readBoolean()、readFloat()等等。特别另一个readLine()读取当前位置的一行
这些都是从当前指针位置開始读取的
释放关联的资源:void close()
获取当前RandomAccessFile的指针:long getFilePoint(),以字节为单位。比方假设一个Int是4位
移动当前指针位置:void seek(long pos)
跳过n个字节:int sikpBytes(int n):返回跳过的实际字节数,n为负数不跳过不论什么字节
RandomAccessFile file = null;
try {
file = new RandomAccessFile("/home/colin/test.txt","rw");
//byte[] b = "this is sample RandomAccessFile".getBytes();
//file.read(b);
byte[] b = new byte[10];
while(file.read(b) >0){
System.out.println(new String(b));
System.out.println(file.getFilePointer()); //获取文件指针
file.skipBytes(1); //每次读取跳过一个字节
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if(file != null)
file.close();
}
基本IO
输入是指从外界进入程序方向,即当我们须要读取数据的时候,使用输入。
输出是指从程序发送到外界方向,通常我们须要写出数据到外界,所以输出是用来写数据的。
流的分类
依据单位:字节流(8bit,图片视频等)和字符流(16bit,文本)
依据角色:节点流(直接作用在文本上的流。直接与特定的地方(磁盘、内存)相连)和处理流(在节点流外层的流。是对一个已经存在流的连接和封装,在所封装的流的功能上实现数据的读写)
java中40多种流都是从4个基类派生出来的
字节流 字符流
输入:InputStream Reader
输出:OutputStream Writer
InputStream和OutputStream
二者都是字节流的抽象基类。定义了主要的read和write方法,read()、read(byte[] a,int off,int length)、read(byte[] b)、write(int b)、write(byte[] b)、write(byte[] b,int off ,int len)
Reader和Writer
reader和writer都是字符流的抽象基类,定义了读取字符的read和write。read()、read(char[] cbuf)、read(char[] cbuf,int off, int len)、write(char c)、write(char[] cbuf)、cbuf(cbuf,int off ,int len)
文件流
文件字节流:
FileOutputStream能够使用下面几种方法构造:
FileOUtputStream(File file)
FileOutputStream(String name)
指定写入的文件,假设该文件存在的化会清除该文件上面的内容
FileOutputStream(File file,boolean append)
FileOutputStream(String name,boolean append)
假设指定append參数为true。则假设写入的文件存在。是以追加的方式进行写入的
FileInputStream能够使用下面方法构造:
FileInputStream(File file)
FileOutputStream(String name)
文件字节流实现了inputStream和outputStream的基本read和write
注意假设读取的时候返回-1,则说明读取到了EOF
利用文件流实现文件的复制:
File file1 = new File("/home/colin/hello.py");
File file2 = new File("/home/colin/hello2.py"); FileInputStream input = null;
FileOutputStream output = null;
try {
input = new FileInputStream(file1);
output = new FileOutputStream(file2);
byte[] b = new byte[10];
int len = -1;
while((len=input.read(b))!=-1){
output.write(b, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//先关输入流。再关输出流
if(inputput != null)
inputput.close();
if(output != null)
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
FileReader和FileWriter与FileInputStream和FileOutputStream使用情况一样。
缓冲流
BufferedInputStream原理:缓冲字节输入流,内部维护一个缓冲区。该流会尽可能一次性读取若干字节到缓冲区。然后逐一返回知道缓冲区中的数据被所有读取完成,从而降低读取次数,提高读取效率,BIS就是一个处理流,该流提供了缓冲功能。他还提供了mark、reset和skip方法
提供的构造方法:
BufferedInputStream(InputStream input)
BufferedInputStream(InputStream input,int size):size指定缓冲区大小
BufferedOutputStream原理:缓冲输出流。内部维护一个缓冲区,每当向该流写入数据的时候,都会现将数据存储缓冲区中,当缓冲区已满的时候,缓冲流会将数据一次性所有写出。
提供的构造方法:
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out,int size):指定缓冲区大小
BufferedOutputStream仅仅提供了write和flush()方法。flush()清空缓冲区,将缓冲区中的数据强制写入。
利用缓冲流实现文件复制:
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(new File("/home/colin/hello.py")));
bos = new BufferedOutputStream(new FileOutputStream(new File("/home/colin/hello3.py")));
int len = -1;
byte[] b = new byte[10];
while((len=bis.read(b)) !=-1){
bos.write(b, 0, len);
}
bos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//先关输入流,再关输出流
if(bis != null)
bis.close();
if(bos != null)
bos.close();
} catch (IOException e) {
e.printStackTrace();
} }
BufferedReader和BufferedWriter与BufferedInputStream和BufferedOutputStream实现原理是一样的,可是BufferedWriter提供了newLine(),写入换行符的方法
对象流
对象序列化:对象存在内存中,有时候须要将对象保存到磁盘上。或者将对象进行传输等这种操作。
这时候须要将对象转化为一个字节序列,这个过程称为对象序列化。
对象反序列化:有时候须要将字节序列转化成为相应的对象。这个过程成为对象的反序列化。
ObjectOutputStream:用来将对象进行序列化的输出流
提供的构造方法:
ObjectOutputStream()
ObjectOutputStream(OutputStream out)
使用其write方法,将对象转化成为一个字节序列后写出,write方法提供了诸如writeInt()等此类方法。
ObjectInputStream:用来将对象反序列化
提供的构造方法:
ObjectInputstream()
ObjectInputStream(InputStream input)
使用其提供的readObject()方法,读取字节并转化为相应的对象
这个总体思路是要对对象进行传递。须要将对象转换成为字节流以便传输,所以首先通过ObjectOutputStream进行写入。将对象写成字节进行传输。传递到目标位置后须要读取,这时候将传输的字节转换成为对象。
假设使用ObjectOutputStream进行序列化写入,须要序列化对象实现Serializable接口,该接口并没有不论什么方法仅仅是序列化标志。通常实现该接口须要给出一个serialVersionUID,表明该类版本号,若不显示声明编译器也会经过计算给出一个serialVersionUID。可是不同编译器实现有所不同。所以假设想要跨平台,都应该显示声明版本号号。当类的对象序列化到磁盘上面,之后随之需求改变。改变了类的属性,那么反序列化就会出现InvalidClassException,这样就会造成不兼容问题。
但当serialVersionUID同样时。会将不一样的Field以type的预设值反序列化,能够避开不兼容问题
transient关键词:当我们对对对象进行序列化后,得带的字节序列往往比較大。有时我们在对一个对象进行序列化时能够忽略某些不必要的属性,从而对序列化后得到的字节序列瘦身,能够将其声明为transient,这样这些属性在序列化时会被忽略。
实例:
/*
*构造Emp类,对其对象进行序列化与反序列化
*/
public class Emp implements Serializable { private static final long serialVersionUID = 1L;
private String name;
private int age;
private double salary;
private transient String description; //使用transient修饰。在反序列化时输出null public Emp(String name,int age,double salary,String description){
this.name = name;
this.age = age;
this.salary = salary;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
} @Override
public String toString() {
return "Emp [name="+name+",age="+age+",salary="+salary+",description="+description+"]";
}
} /*
* 将Emp对象序列化。而且存储
*/
public static void testOos(){
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream(new File("/home/colin/oos.obj"));
oos = new ObjectOutputStream(fos);
Emp emp = new Emp("colin", 23, 13000, "I want you!!!");
oos.writeObject(emp);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(oos != null)
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /*
* 将存储的Emp对象反序列输出
*/
public static void testOis(){
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream(new File("/home/colin/oos.obj"));
ois = new ObjectInputStream(fis);
Emp emp = (Emp)ois.readObject();
System.out.println(emp.getName()+","+emp.getAge()+","+emp.getSalary()+","+emp.getDescription());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
java之IO处理的更多相关文章
- java的IO流
java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...
- java之io之File类的list()方法过滤目录的使用
java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...
- Java 新IO
NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...
- JAVA中IO总结
JAVA中IO流主要分为两大类: 字节流:InputStream+OutputStream 字符流:Reader+Writer 字节流: InputStream是所有字节输入流的父类 OutputSt ...
- Java基础——IO流
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
- 【Java】IO流简单分辨
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...
- JAVA中IO技术:BIO、NIO、AIO
1.同步异步.阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...
- Java - 文件(IO流)
Java - 文件 (IO) 流的分类: > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter ...
- JAVA的IO运用
IO OF JAVA想写好一篇关于JAVA的IO的文章不容易,因为它涉及的东西很多难以写得有深度和有思路.我虽不才但也写.这篇文章有我个人不少的见解,虽然涉足计算机不深但我不想用一大堆这个可能那个可能 ...
- JAVA的IO学习
IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...
随机推荐
- 使用Dropzone上传图片及回显演示样例
一.图片上传所涉及到的问题 1.HTML页面中引入这么一段代码 <div class="row"> <div class="col-md-12" ...
- js面向对象编程: js类定义函数时prototype和this差别?
在面向对象编写js脚本时,定义实例方法主要有两种 例如以下: function ListCommon2(afirst) { var first=afirst; this.do1=function () ...
- 在C 函数中保存状态:registry、reference和upvalues
在C函数中保存状态:registry.reference和upvalues C函数能够通过堆栈来和Lua交换数据,但有时候C函数须要在函数体的作用域之外保存某些Lua数据.那么我们想到全局变 ...
- 用jquery ajax做的select菜单,选中的效果
//用server端语言赋值给js变量 var departmentId = '<%=提交的值 %>', deviceId='<%=提交的值 %>' $(fun ...
- VS2013找不到SDKDDKVer.h
今天在升级vs2010 的project的时候遇到了一个这种问题.提示:找不到SDKDKVer.h 通过查找资料发现,原来是vs版本号之间Windows SDK的路径宏定义不同,有些坑. 网上有人说能 ...
- java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件
转账注明出处:http://renjie120.iteye.com/blog/1727933 在工作中要用到android,然后进行网络请求的时候,打算使用httpClient. 总结一下httpCl ...
- jQuery插件开发的两种方法
1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $. ...
- 最简单的启动并连接一个redis的docker容器
启动一个容器: $ sudo docker run --name <name> -d redis 连接一个容器: sudo docker run -it --link <name&g ...
- windows下安装reidis
下载windows下redis安装包 https://github.com/MSOpenTech/redis/releases 这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了. 切换 ...
- React router内是如何做到监听history改变的
问题背景 今天面试的时候,被问到这么个问题.在html5的history情况下,pushstate和replacestate是无法触发pushstate的事件的,那么他是怎么做到正确的监听呢?我当时给 ...