文件与流简介(1)
来源:互联网 发布:sql基础教程 编辑:程序博客网 时间:2024/06/05 07:43
文件的介绍
1)在Java中使用java.io.File类表示一个文件(目录) 路径(注:该类并不代表文件内容)。
2)File类关心的是磁盘上存储的文件位置和名称等,而流是指程序运行中的数据通信信道,当然流类所关心的是文件的内容。
3)如果要考虑跨平台,则可以这样书写写:”...”+File.separator+”temp”+ File.separator+”文件名”。
File类的构造函数:
File(String pathname):建立一个以pathname为路径的File对象,pathname可以是相对路径,也可以是绝对路径。
File(Stringparent,String child):建立一个以parent加上child为路径的File对象。
File(Fileparent,String child):建立一个以parent加上child为路径的File对象。
类File的对象的常用方法:
1)exists() //文件或者目录是否存在
2)isFile() //是否是文件
3)isDirectory() //是否是目录
4)getName() //取文件或者目录的名字
5)getPath() //取文件或者目录的路径
6)getAbsolutePath() //取文件绝对路径
7)lastModified() //最后修改日期
8)length() //文件或者目录的字节大小
9)createNewFile() //创建新文件
10)list()//获得当前File对象所表示目录下的文件和目录名称,返回String[]类型的数据。
11)listFiles()//获得当前File对象所表示目录下的文件和目录,返回File[]类型的数据。
例子(获取当前目录下所有文件和文件的大小):
import java.io.*;public classFileSize{ public static void main(String[] args) { File files=new File("."); String[] list=files.list(); for(int i=0;i<list.length;i++){ File file=new File(list[i]); System.out.println(list[i]+file.length()); } }}
开发一个方法删除指定的文件或目录(包括子目录、子文件)
public classFileDeleter { public void delete(File file){ if(!file.exists())return; //如果file不存在 if(file.isFile()){//若file表示文件,则删除。 file.delete(); return; } if(file.isDirectory()){//若file表示目录 //获得直接在该目录下所有文件或目录对应的File对象 File[] subFiles=file.listFiles(); //如果该目录下确实有文件或者目录 if(subFiles!=null&&subFiles.length>0){ //依次删除该目录下的文件或目录 for(int i=0;i<subFiles.length;i++){ delete(subFiles[i]);//递归调用 } } file.delete(); //删除该目录 } }}
流的概念
File类关心的是磁盘上存储的文件位置和名称等,而流是指程序运行中的数据通信信道,当然流类所关心的是文件的内容。
流的分类
输入流和输出流:
1)输入流是从外设传输数据进入内存的流。
2)输出流是从内存传输数据至外设的流。
字节流和字符流:
1)字节流是指以字节为数据最小传输单位的流。
2)字符流是指以字符(双字节)为数据最小传输单位的流。
流的四个根类
1)InputStream-字节输入流
2)OutputStream-字节输出流
3)Reader-字符输入流
4)Writer-字符输出流
字节流
1>InputStream类是所有字节输入流类的基类,是个抽象类。
2>常用的方法:
int read():如果下一个字节可读,以整数的形式返回读取的字节值,如果到了流末尾,则返回-1。
int read(byte[] b):从流中最多读取b.length个数据字节放入数组b中,以整数形式返回实际读取的字节数,如果到了流末尾,则返回-1。
int read(byte[] b,int off,int len):从流中最多读取len个数据字节放入数组b中,并从b[off]开始放入数组,以整数形式返回实际读取的字节数,如果到了流末尾,则返回-1。
void close():关闭输入源。
int available():返回当前可读的字节数。
例子(读取文件信息):
public staticvoid main(String[] args) {File file=newFile("test.txt");byte[] bt=newbyte[(byte)file.length()];try {FileInputStreamfis=new FileInputStream(file);fis.read(bt);for (int i = 0; i< bt.length; i++) {System.out.print((char)bt[i]+"\t");}} catch(FileNotFoundException e) {e.printStackTrace();} catch(IOException e) {e.printStackTrace();}}
1>OutputStream类是所有字节输出流类的基类,也是个抽象类。
2>在Java中大多数流类都是成对出现的,了解这一规律有利于大家对流类的掌握。
3>OutputStream类的常用方法:
void write(int b):写入单个字节到输出流。
void write(byte[] b):将字节数组b中的数据写入此输出流。
void write(byte[] b,int off,int len):将数组b内从b[off]开始的len个字节写入此输出流。
void flush():清空输出流缓冲区。
void close():关闭输出流。
例子(向文件输出内容):
public staticvoid main(String[] args) {try {FileOutputStreamfos=new FileOutputStream(new File("test.txt"));for (int i = 97;i < 123; i++) {fos.write((char)i);}fos.flush();System.out.println("写入成功!");} catch(FileNotFoundException e) {e.printStackTrace();} catch(IOException e) {e.printStackTrace();}}
数据流
1>数据流以与机器无关方式从底层读取或者写入基本Java数据类型的流。
2>数据流是处理流,需要连接嵌套其它流。
3>数据流属于字节流
DataInputStream-数据输入流,是InputStream的子类。
DataOutputStream-数据输出流,是OutputStream的子类。
示例一(将十个浮点数写入文件)
public staticvoid main(String[] args){DataOutputStreamdos=null;try {File file=newFile( "f:"+File.separator+"ja_2"+File.separator+"nums");dos=newDataOutputStream(new FileOutputStream(file));for(inti=0;i<10;i++){ dos.writeDouble(Math.random()*10);}dos.flush();System.out.println("写入成功!");} catch(Exception e) { e.printStackTrace();} finally{ try {dos.close();} catch (Exception e) {}}}
示例二:从文件中读出浮点数
public staticvoid main(String[] args){DataInputStreamdis=null;try {File file=newFile("f:"+File.separator+"ja_2"+File.separator+"nums");dis=newDataInputStream(new FileInputStream(file));while(true){ System.out.println(dis.readDouble());}} catch(EOFException e) { //readDouble()当达到流结尾抛出此异常 System.out.println("文件读取完毕!");} catch(Exception e) { e.printStackTrace();} finally{ try {dis.close();} catch (Exception e1) {}}}
节点流和处理流
1>按照流是否直接与特定的节点(如磁盘、内存、设备等数据源)相连,可将流分为节点流和处理流。
2>节点流与具体节点相连接,直接读写节点数据,如:
FileInputStream
FileOutputStream
FileReader
FileWriter等等。
3>处理流与已存在的流相连接,通过调用所连接流的功能实现数据读写,其构造方法总要带一个其他流对象做参数。如下列出了部分处理流:
InputStreamReader
InputStreamWriter
BufferedReader
PrintWriter
DataInputStream 数据输入流
DataOutputStream 数据输出流
ObjectInputStream 对象输入流
ObjectOutputStream 对象输出流
4>流对象被其他处理流的多次连接,称为流的嵌套。
直接与数据源相连接的流是节点流
处理流连接节点流,提供附加性能
处理流可以被其它处理流继续连接,以获取需要的其它性能。
处理流不可以与节点(数据源)直接连接
字符流
Reader
1)Reader类是所有字符输入流类的基类,是个抽象类。
2)Reader的常用方法:
void close() :关闭输入源。
int read() :从输入流读取单个字符的整数表示,如果不存在则返回-1。
int read(char[] cbuf) :从输入流中将字符读入数组,返回实际读取的字符数,如果遇到文件结尾返回-1。
int read(char[] cbuf,int off,int len):将字符读入数组的某一部分。
boolean ready() :判断此流是否已准备好被读取。
long skip(long n) :跳过n个字符,返回跳过的字符数。
Writer
1)Writer类是所有字符输出流类的基类,也是个抽象类。
2)Writer的常用方法:
void write(int ch) :写入单个字符到调用的输出流。
void write(String str): 写入str到输出流。
void write(String str, int off,int len)写入字符串的某一部分。
void write(char[] cbuf):写入字符数组。
void write(char[] cbuf,int off,int len):写入字符数组的某一部分。
Writer append(char c) :将指定字符追加到此 writer。
void flush() :清空输出缓冲区。
void close() :关闭输出流。
FileReader
1)此类是Reader子类,是读取字符文件的便捷类,可以使用它直接读取文件的内容。
2)FileReader类常用构造方法
FileReader(Filefile)
FileReader(Stringfilename)
FileWriter
1)此类是Writer的子类,是向文件写入字符的便捷类,使用它可以方便地创建一个写文件的对象。
2)FileWriter类常用构造方法
FileWriter(Filefile)
FileWriter(Stringfilename)
FileWriter(Filefile,boolean append)
FileWriter(Stringfilename,boolean append)
BufferedReader
1)BufferedReader由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine()方法。
2)BufferedReader有两个构造函数:
BufferedReader(Reader in):创建使用缺省尺寸输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in,int bufsize):创建一个使用指定大小输入缓冲区的缓冲字符输入流。
3)BufferedReader的常用方法
String readLine() :读取一个文本行。
PrintWriter
1)PrintWriter继承了Writer类,但除此之外此类还实现了PrintStream中的所有print()方法, PrintWriter可以直接输出字符串。
2)PrintWriter常用的构造方法:
PrintWriter(Writer out)
PrintWriter(OutputStream out)
void print(Object obj) :打印对象。
void println(Object obj) :打印对象后换行。
InputStreamReader
1)InputStreamReader继承了Reader,它实现了Reader的抽象方法。
2)InputStreamReader是字节流通向字符流的桥梁,它使用指定的字符集(charset)读取字节并将其解码为unicode字符。
3) 注:FileReader即为InputStreamReader直接子类,使用默认字符集。
4) InputStreamReader的常用构造方法:
InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in,String charsetName) :创建使用指定字符集的InputStreamReader。
5)InputStreamReader的常用方法:
String getEncoding():返回此流使用的字符编码的名称
6)一个有关InputStreamReader类的例子:
public staticvoid main(String[] args) {
File file=newFile("test.txt");
InputStreamis=null;
try {
is = newFileInputStream(file);
} catch(FileNotFoundException e) {
e.printStackTrace();
}
InputStreamReaderreader=new InputStreamReader(is);
try {
int i=0;
while((i=reader.read())>0){
System.out.print((char)i+"\t");
}
} catch(IOException e) {
e.printStackTrace();
}
}
OutputStreamWriter
1)OutputStreamWriter继承了Writer,它实现了Writer的抽象方法。
2)OutputStreamWriter是字符流通向字节流的桥梁,这刚好与InputStreamReader相反。它使用指定的字符集(charset)将要写入流中的unicode字符编码成字节
3)注:FileWriter即为OutputStreamWriter直接子类,使用默认字符集。
4)OutputStreamWriter的常用构造方法:
public OutputStreamWriter(OutputStream out):创建使用默认字符编码的OutputStreamWriter。
public OutputStreamWriter(OutputStream out,String charsetName):创建使用指定字符集的 OutputStreamWriter。
String getEncoding() :返回此流使用的字符编码的名称。
5)一个有关OutputStreamWriter类的例子:
publicstatic void main(String[] args) {
Stringstr=“行知汇元。";
try {
OutputStreamWriterosw =new OutputStreamWriter(new FileOutputStream(newFile("test.txt")));
osw.write(str,0, str.length());
osw.flush();
osw.close();
System.out.println("文件写入成功。");
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
对象流
1)对象流:
就是将对象的内容进行流化,也即是将对象的内容转化成二进制流,对象流是处理流。
2)特点:
1、流化后的对象可以进行读写操作。
2、流化后的对象可以进行网络之间的传输。
3)对象流的构造:
对象输入流(ObjectInputStream):ObjectInputStream in=new ObjectInputStream(输入流对象);
相应的方法:in.readObject();
对象输出流(ObjectOutputStream):ObjectOutputStream out=new ObjectOutputStream(输出流对象);
相应的方法:out.writeObject(Object obj);
序列化
1)序列化:
所谓序列化就是将对象输出到流中,或者从流中读取对象。
2) 序列化的作用:
1、利用对象的序列化,可以实现轻量级持久性,这意味着一个对象的生存周期并不取决于程序是否正在执行,它可以生存于程序的调用之间。
2、通过将一个序列化的对象写入磁盘,然后在重新调用时恢复该对象,以实现持久性的效果。
3)序列化分为:序列化和反序列化。
序列化:就是将对象的内容分解成字节流,以便存储在文件中或在网络上传输。
反序列化:就是打开并读取字节流,且从该流中恢复该对象。
4)注意:
只有序列化的对象才可以存储在存储设备上。
序列化的实现
将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream等)来构造一个对象输出流ObjectOutputStream对象,使用该对象的writeObject(Object obj)方法,就可以将指定的对象obj写入到文件或传输于网络。
序列化对象的代码:
反序列化的实现
将需要被序列化的类实现Serializable接口,然后使用一个输入流(如:FileInputStream等)来构造一个对象输入流ObjectIntputStream对象,使用该对象的readObject()方法,获得对象输入流中的对象。
反序列化对象的代码:
注意:
1、只有实现java.io.Serializable接口的类才可以启用序列化功能。未实现此接口的类将无法启用任何状态的序列化和反序列化。
2、 如果某个类能够被序列化,其子类也可以被序列化。
3、对象的(反)序列化仅针对非瞬时状态实例成员变量:使用static或者transient修饰的成员数据不能被(反)序列化。
注:static代表类的状态,而非实例状体;transient代表对象的临时数据,即处于瞬时状态。
完整例子:
1、 自定义一个类SerializableObject实现接口 Serializable:
2、序列化类SerializableObject的对象:
3、反序列化类SerializableObject的对象:
4、测试类Test:
- 文件与流简介(1)
- HEX文件与BIN文件简介
- Android中的Xml文件与解析简介
- 自动诊断信息库ADR简介:涉及如何快速查看alert告警日志与trace文件(1)
- TCP详解(1):简介与数据包
- Keras(1):Keras安装与简介
- (1)Redis简介与简单安装
- TensorFlow入门(1)-简介与安装
- DUMP文件分析1:DUMP文件简介
- Oracle概要文件(资源配置文件)简介
- 1_简介与学习方法
- JDBC与JDBC-1、简介
- 1、Redis简介与安装
- Git-1、简介与安装
- Docker1(简介与Dockerfile)
- 威博文件管理系统应用场景与简介
- Linux创建文件命令的方法与特殊目录简介
- java代码代替布局文件与aapt工具简介
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 网络流(最大流,最小割)基础入门详解
- Leetcode:Palindrome Partitioning & Palindrome Partitioning II
- BZOJ3223: Tyvj 1729 文艺平衡树(洛谷P3391)
- 让你的.vue文件在sublime text 3 中变成彩色?Vue Syntax Highlight
- 文件与流简介(1)
- floor
- 文章标题
- 加密与解密
- 60. Permutation Sequence
- POJ
- HDOJ1170 Balloon Comes!
- Java CAS 和ABA问题
- 变分贝叶斯推断(Variational Bayes Inference)简介