一、File类、
1、File类基本使用
java,io,File类是普通类,直接实例化对象即可使用。
构造方法:
- public File(String pathname)
- public File(String parent, String child)
判断文件是否存在:
- public boolean exists()
文件创建与删除:
- 创建:public boolean createNewFile() throws IOException
- 删除:public boolean delete()
2、常用目录操作
- 获取父路径:public String getParent()
- 获取父File对象:public File getParentFile()
- 创建多级目录:public boolean mkdirs()
下面通过例子来看上面这些方法的简单使用:
public static void main(String[] args) {
//为支持跨平台,路径分隔符使用File.separator
File file = new File("E:" + File.separator + "java" +
File.separator + "MyExercise" + File.separator + "javaIO" + File.separator + "IO.txt");
if (file.getParentFile().exists()) {
System.out.println("目录已存在,正在创建文件...");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件创建成功!");
} else {
System.out.println("目录不存在,先创建目录...");
file.getParentFile().mkdirs();
System.out.println("目录创建成功,正在创建文件...");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件创建成功!");
}
}
3、取得文件信息
- 判断路径是否是文件: public boolean isFile()
- 判断路径是否是目录: public boolean isDirectory()
- 取得文件大小(字节): public long length()
- 最后一次修改日期 : public long lastModified()
4、查看目录的组成
- public File[] listFiles()
思考:利用上面这些方法,如何打印出指定目录的全部组成?
public static void main(String[] args) {
File file = new File("E:" + File.separator + "java" + File.separator + "MyExercise");
listAllFiles(file);
}
private static void listAllFiles(File file){
if(file != null){
if(file.isDirectory()){
//当前文件对象为文件夹,递归
File[] files = file.listFiles();
for (File temp:files){
listAllFiles(temp);
}
}else{
//若为文件则直接打印
System.out.println(file);
}
}
}
二、字节流与字符流:
字符流用于文字处理,尤其是处理中文时支持较好,除此之外均使用字节流(文件存储、网络传输)。
1、IO流的使用
IO流的使用,基本流程都是一样的,一般操作分以下四步:
- 根据文件路径创建File对象
- 根据字节流或字符流的子类实例化父类对象
- 进行数据的读取或写入操作
- 关闭流
2、字节流:InputStream、OutputStream
(1)字节输出流:OutputStream
- public abstract class OutputStream implements Closeable, Flushable
OutputStream是一个抽象类,如果要进行文件操作,可使用子类FileOutputStream实例化
常用的方法:write() 参数可以是单个字节、也可以是字节数组
- write()操作默认为覆盖文件内容,若需要在文件中追加内容,创建输出流时加一个参数true 。
OutputStream out = new FileOutputStream(file,true);
OutputStream简单使用:
public static void main(String[] args) throws IOException {
//1、取得终端对象File
File file = new
File("E:"+File.separator+"java"+File.separator+"TestOutputStream.txt");
//2、取得相应终端的输出流
OutputStream out = new FileOutputStream(file,true);
//3、将数据通过流输出
out.write("hello world\n".getBytes());
//4、关闭流
out.close();
}
(2)字节输入流:InputStream
- public abstract class InputStream implements Closeable
InputStream也是抽象类,通过子类FileInputStream实例化。
常用方法:public int read() 有返回值,返回的是读取的字节数,返回-1说明读取完毕。
思考:如何利用字节输入流和字节输出流实现文件拷贝?
public class TestStream{
/*文件拷贝*/
public static void main(String[] args) throws IOException{
//源文件:
File sourceFile = new File("E:/java/MyExercise/desktop.jpg");
//目标文件
File destFile = new File("E:/java/MyExercise/new.jpg");
//输入输出流
InputStream in = new FileInputStream(sourceFile);
OutputStream out = new FileOutputStream(destFile);
//文件拷贝
copyFile(in,out);
}
private static void copyFile(InputStream in,OutputStream out) throws IOException {
System.out.println("开始文件拷贝。。。");
long start =System.currentTimeMillis();
int len = 0;
byte[] data = new byte[1024];
while((len=in.read(data)) != -1){
out.write(data,0,len);
}
long end = System.currentTimeMillis();
System.out.println("文件拷贝结束!");
System.out.println("共用时 "+(end-start)+" 毫秒");
}
}
3、字符流:Reader、Writer
(1)字符输出流:Writer
- public abstract class Writer implements Appendable, Closeable, Flushable
Writer的使用方法和OutputStream很相似,但对中文的支持更好。也提供了write()方法,可直接输出字符串: public void write(String str) throws IOException
字符有缓冲区,若未刷新或者关闭,则数据默认在缓冲区不会输出到终端。
强制刷新缓冲区:flush(); 关闭:close()
(2)字符输入流:Reader
用法和InputStream相似。Writer可以直接输出字符串,但Reader不支持直接读取字符串,只能通过字符数组读取。
三、打印流与输入流
1、认识打印流
java提供有专门的打印流:字节打印流PrintStream、字符打印流PrintWriter。(打印流是对OutputStream的封装)
构造方法: public PrintStream(OutputStream out) public PrintWriter(OutputStream out)
我们常用的System.out.println() 系统输出,其实就是IO流的范畴:
System类定义了三个操作的常量:
1. 标准输出(显示器) : public final static PrintStream out
2. 错误输出 : public final static PrintStream err
3. 标准输入(键盘):public final static InputStream in系统输入:
- System.in :从键盘输入,直接是InputStream的对象,没有任何包装
系统输出:
- System.out :实际上就是PrintStream对象
- System.err:标准错误输出,也是打印流对象
2、认识输入流:
目前常用的输入使用Scanner类,利用这个类可以方便处理各种数据类型,同时还可以结合正则表达式使用。
使用Scanner类专门处理输入流
java.util.Scanner类
构造方法public Scanner(InputStream source)
3、总结:
通常输出使用PrintStream,输入使用Scanner。
示例:输出内容到文件:
示例:从文件读取内容后打印:
四、序列化与反序列化
对象的序列化是指将内存中的对象转为二进制传输或保存。反之,将二进制数据转为对象即为反序列化。
1、前提:
序列化使用java.io.serializable接口,只要类实现了这个接口,就具备序列化的能力。Serializable接口称为标记接口(里面无任何方法)
2、对象序列化,用到以下两个类:
ObjectOutputStream :将对象序列化输出
- public class ObjectOutputStream extends OutputStream implements ObjectOutput
- public ObjectOutputStream(OutputStream out) :指出要输出的端
- public final void writeObject(Object obj):将指定对象变为二进制
ObjectInputStream :将对象反序列化输入
- public final Object readObject():反序列化为对象
3、transient关键字:
实现Serializable接口的类,在进行序列化时默认会将所有的属性进行序列化,如果某些属性不想被序列化,则可使用transient关键字修饰此属性。