File类
File对象既可以表示文件,也可以表示目录,在一个程序中一个File
对象可以代表一个文件或目录。
File类的构造方法如下:
方法 说明
File(String pathname) 用指定的文件路径构造文件
File(String dir,String subpath) 在指定的目录下创建指定文件名的文件
dir参数指定目录历经,subpath参数指定文件名
File(File parent,String subpath) 根据一个文件对象和一个字文件构造文件对象
parent参数指定目录文件,subpath参数指定文件名
File类的常用方法如下:
方法 说明
boolean exists() 测试文件是否存在
String getAbsolutePath() 返回此对象表示的文件的绝对路径名
String getName() 返回此对象表示的文件的名称
String getParent() 返回次File对象的路径名的上一级,如果路径 名没用上一级,则返回null
boolean delete() 删除此对象指定的文件
boolean createNewFile() 创建空文件,不创建文件夹
boolean isDirectory() 测试次File对象表示的是否是目录
boolean mkdir() 创建一个目录,他的路径时名由当前File对象 指定
boolean mkdirs() 创建包括父目录的目录
使用File类操作文件和目录属性的步骤一班如下:
- 、引入File类
import java.io.File;
- 、构造一个文件对象
File file=new File(“test.txt”);
- 、利用File类的方法访问文件或目录的属性,具体使用如下:
file.exists(); //判断文件或目录是否存在
file.isDirectory(); //判断是否时目录
file.isFile(); //判断是否时文件
file.getName(); //获取文件或目录的名称
file.getPath(); //获取文件或目录的路径
file.lastModified(); //获取文件或目录的最后修改日期
file.length(); //获取文件或目录的大小,单位为字节
关键代码:
public class FileMethods {
public static void main(String[] args) throws IOException {
//创建和删除文件
FileMethods fm=new FileMethods();
File f=new File("E:\\eclipse\\configuration\\.settings");
fm.create(f);
fm.delete(f);
}
public void create(File file)throws IOException{
if(!file.exists()){
file.createNewFile();
}
}
//删除文件的方法
public void delete(File file)throws IOException{
if(file.exists()){
file.delete();
}
}
}
流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。
流--按流向区分:
①如果数据流入到内存,则称为输入流;InputStream和Reader作为基类
②如果从内存中输出,则称为输出流;OututStream和Write作为基类
在java.io包中,封装了许多输入/输出流的API。在程序中,这些输入/输出流类的对象称为流对象。可以通过这些流对象将内存中的数据以流的方式写入文件,也可以通过流对象将文件中的数据以流的方式读取到内存。
源数据源----流----读----程序
程序----写----流----目标数据源
输入流和输出流又分为字节流和字符流两种形式,如下:
1.字节输入流InputStream作为基类
①字节流: 2.字节输出流OutputStream作为基类
按照处理数据单元划分:
1.字符输入流Reader基类
②字符流 2.字符输出流Writer作为基类
字节流:8位通用字节流,基本单位是字节。抽象类。
字符流:16位Unicode字符。基本单位是Unicode字符。抽象类,最适合用来除了字符串和 文本。
注意:
①在操作上,字节流和字符流有一个区别,字符流在操作是使用了缓冲区,而字节流 再操作时直接操作文件,不适用缓冲区。
②所有的这些方法再出现错误时都会抛出IOException异常。
一 字节流
字节输入流(读)
InputStream
read()--------------一次一个
read(byte[])
read(byte[],off,len)
close()
FileInputStream
new FileInputStream(File file)
new FileInputStream(String path)
字节输出流(写)
OutputStream
write(int ch)--------------一次一个
write(byte[])-----------writte(str.getBytes())----String转换成~
write(byte[],off,len)
close()
flush():强制将缓冲区清空
FileOutputStream
new FileOutputStream(File file)
new FileOutputStream(String path)
new FileOutputStream(String path,boolean append):可以指定覆盖或追加文件内容
二 字符流
字符输入流(读)
Reader
read()
read(char[])
read(char[],off,len)
close()
InputStreamReader:可以指定字符编码格式
new InputStreamReader(InputStream)
new InputStreamReader(InputStream,String charSetName)
FileReader
new FileReader(File file)
new FileReader(String path)
常见问题:中文乱码
原因:文件编码格式 和 程序环境的编码格式不一致
解决方案:
字符流去读的时候,指定字符流的编码格式
FileReader 无法指定编码格式,会按照文件系统默认编码格式读
System.out.println(System.getProperty("file.encoding"));
所以使用InputStreamReader
缓冲流BufferedReader
readLine()
字符输出流(写)
Writer
序列化和反序列化
序列化是将对象的状态写入到特定的流中 的过程
反序列化则是从特定的流中获取数据重新构建对象的过程
对象 -- 流
实现过程
实现serializable接口(可以拥有序列化的能力)
创建对象输出流
调用writeObject()方法将对象写入文件
关闭对象输出流
ObjectInputStream 反序列化 .readObject();
ObjectOutputStream 序列化 writeObject(Object)
常见异常
NotSerializableException 没有实现SerializableException接口,没有被序列化的能力
如果想要某一个对象状态不被序列化 则在相应属性前面加关键字 transient
(屏蔽敏感字段)
Arithmetic
读写文本文件:
- 使用字节流读写文本
- 使用字节流类FileInputStream读文本文件
FileInputStream称为文件输入流,是一个子类。作用是将文件中的数据输入到内部存储器(简称内存),可以利用它来读取文本文件中的数据。
①导入相关的类;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream
②构造一个文件输入流对象
InputStream fileObject=new FileInputStream(“text.txt”);
//此时的文件输入流对象fileObject就和源数据源(text.txt文件)关联起来。
③利用文件输入流类的方法读取文本文件的数据。
fileObject.available(); //可读取的字节数
fileObject.read(); //读取文件的数据
4). 关闭文件输入流对象。
fileObject.close();
实例:使用FileInputStream类读取文本文件的数据。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) {
//创建流对象
try {
FileInputStream fis=new FileInputStream("E:\\kb.txt");
boolean data;
System.out.println("可读取的字节数:"+fis.available());
System.out.println("文件内容为:");
while(data=fis.read()!=-1){
System.out.println(data+"");
}
//关闭流对象
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意:1.read()方法返回整数,如果读取的是字符串,需要进行强制类型转换。
2.流对象使用完毕后需要关闭。
- .使用字节流类FileOutputStream写文本文件
FileOutputStream称为文件输出类,钥匙子类,作用是把内存中的数据输出到文件中,可以利用他把内存中的数据写入到文本文件中。
步骤:
①引入相关的类
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
②构建一个文件输出流对象
OutputStream fos=new FileOutputStream(“text.txt”);
//此时的文件输出流对象fos就和目标源数据源(text.txt文件)关联起来了。
③利用文件输出流的方法把数据写入到文本文件中
String str=”好好学习Java”;
byte[] words=str.getBytes();
//利用write方法将数据写入到文件中去
fos.write(words,0,words.length);
4).关闭文件输出流。
fos.close();
注意:
- 如果再创建FileOutputStream实例时,如果相应的文件并不存在,就会自动创建一个空的文件。
- 如果参数file或name表示的文件路径存在,但是代表一个文件目录,则会抛出FileNotFoundException类型的异常。
- 默认情况下,向文件写数据时将覆盖文件中原有的内容。
- 使用字符流读写文本文件
- 使用字符流类BufferedReader和FileReader读文本文件
BufferedReader和FileReader两个类都是Reader的抽象类的子类,它们可以通过字符流的方式读取文件,并使用缓冲区,提高了读文本文件的效率。
步骤:
①引入相关的类
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
②构建一个文件输出流对象
FileReader fr=new FileReader(“mytext.txt”);
BufferedReader br=new BufferedReader(fr);
③利用BufferedReader类的方法把数据写入到文本文件的数据
br.readLine(); //读取一行数据,返回字符串
//利用write方法将数据写入到文件中去
4).关闭相应的流对象
br.close();
fr.close();
- 使用字符流类BufferedWriter和FileWriter写文本文件
BufferedWriter和FileWriter都是字符输出流Writer抽象类的子类,他们可以通过字符流的方式并通过缓冲区把数据写入文本文件,提高了写文本文件的效率。
步骤:
①引入相关的类
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
②构造一个BufferedWriter对象
FileWriter fw=new FileWriter(“mytext.txt”);
BufferedWriter bw=new BufferedWriter(fw);
③利用BufferedWriter类的方法把数据写文本文件.
bw.write(“hello”)
//利用write方法将数据写入到文件中去
4).相应的流对象的清空和关闭。
bw.flush();
bw.close();
fw.close();
读写二进制文件
- 使用字节流读二进制文件
利用DataInputStream类读二进制文件,其实与利用FileInputStream类读文本文件机器相似,也要用到FileInputStream类关联二进制文件。
步骤:
①引入相关的类
import java.io.FileInputStream;
import java.io.DataInputStream;
②构造一个数据输入流对象
FileInputStream fis=new FileInputStream(“HelloWorld.class”);
DataInputStream dis=new DataInputStream(fis);
③利用数据输入流类的方法读取二进制文件中的数据.
dis.readInt(); //读取出来的是整数
dis.readByte(); //读取出来的数据时Byte类型
4).关闭数据输入流。
dis.close(); //关闭数据输入流
- 使用字节流写二进制文件
利用DataOutputStream类读二进制文件,其实与利用FileOutputStream类读文本文件机器相似,也要用到FileOutputStream类关联二进制文件。
步骤:
①引入相关的类
import java.io.FileOutputStream;
import java.io.DataOutputStream;
②构造一个数据输出流对象
FileOutputStream fis=new FileOutputStream(“temp.class”);
DataOutputStream dis=new DataOutputStream(fis);
③利用数据输出流类的方法把数据写入二进制文件。
ou.write(1); //把数据写入二进制
4).关闭数据输入流。
dis.close(); //关闭数据输入流
重定向标准I/O
Java提供的有两个标准输入/输出流:System.in和System.out;
System.in常见方法如下:
int read(); 此方法从键盘接受一个字节的数据,返回值是该字符的ASCII码。
int read(byte []buf); 此方法从键盘接受多个字节的数据,保存到buf中,返回值是接 收字节数据的个数,非ASCII码。
System.out常见方法如下:
print(); 向屏幕输出数据,不换行,参数可以是Java的而任意数据类型。
printIn(); 想屏幕输出数据,换行,参数可以是Java的而任意数据类型。
3个重定向标准I/O的方法:
方法 说明
static void setErr(PrintStream err) 重定向标准错误输出流
Static void setIn(InputStream in) 重定向标准定向流
static void setOut(PrintStreeam out) 重定向标准输出流
序列化:
- 创建一个对象输出流(ObjectOutputStream),他可以包装一个其他类型的输出流,如文件输出流FileOutputStream.
例子:
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(“C:\\myDoc\\stu.txt”))
- 通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象。
反序列化:
- 创建一个对象输入流(ObjectInputStream),他可以包装一个其他类型的输出流,如文件输入流FileInputStream.
例子:
ObjectInputStream oos = new ObjectInputStream(new FileInputStream(“C:\\myDoc\\stu.txt”))
- 通过对象输入流的writeObject()方法写对象,该方法返回一个Object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型。
序列的算法规则:
- 所有保存到磁盘中的对象都有一个序列号;
- 当程序试图序列化一个对象时,将会检查是否已经被序列化,只有序列化后的对象才能被转换成字节序列输出;
- 如果对象已经被序列化,则程序直接输出一个序列化编号,而不再重新序列化。