要在java程序中操作硬盘上的文件,首先要在程序中表示一个对应的文件。那如何在程序中表示文件?——File类
一个File类的对象表示硬盘上的一个文件或目录(文件夹)
操作方法:
File类只能表示文件,不能对文件进行 读写,那如何读写文件——File类中的 I(input ) / 0(output)
需求:要把 D:/demo.txt ----> E:/demo.txt
//需求:要把 D:/demo.txt ----> E:/demo.txt
//创建一个输入流管道,为其指定输入的文件
FileInputStram in = new FileInputStream(new File(pathname:"D:/demo.txt"));
//创建一个输出流管道,为其指定输出的文件,输入文件可以不存在,会自动创建
FileInputStram in = new FileInputStream(new File(pathname:"E:/demo.txt"));
//int b = in.read;//从文件中读数据,一次读一个字节,文件读完后返回-1 通过循环读
int b = 0;
while(b = in.read()!= -1){
//System.out.println(b);
out.write(b);
}
in.close();//关闭流通道,释放文件
out.close();
加入异常处理:
package com.ffyc.javaio.Stream;
import java.io.*;
public class StreamDemo3 {
public static void main(String[] args) throws IOException {
/*
需求:把 D:/demo1.txt -读到-> C:/demo1.txt
read() ——> write(b)
read(byte[] b) ——> write(b,off,len)
*/
FileInputStream in = new FileInputStream(new File("D:/demo1.txt"));
FileOutputStream out = new FileOutputStream(new File("C:/demo1.txt"));
//read() 一次只读取一个字节,并返回结果 a-97,读完返回-1 效率低
//read(byte[] b) 一次读取一个byte数组个字节内容,返回数组中实际装入内容的长度,读完返回-1
//44个字节 数组长度是10 读5次
byte[] b = new byte[10]; //50 44
int size = 0; //实际向数组中读到的内容长度,主要是最后一次的实际数量
while((size = in.read(b))!= -1){
// out.write(b);//这样写出来长度是50,写入后文件长度变大了,不行,人家实际是44
out.write(b, 0, size);//这样写出来就是44
// write(装内容的数组,数组的第0个位置开始,size实际写出的长度) 最后一次只有4个字节,向外只写4个即可
}
in.close();
out.close();
}
}
按照读写单位分为:字节流和字符流
1)字节流:一次读写一个字节
使用的多
主要用在: 图片,视频,音频,等文件…
字节输入流:从硬盘向程序中读数据 InputStream
字节输出流:从程序中向硬盘上写数据 OutputStream
根据封装类型不同分为:节点流和处理流
节点流:
流对象中封装的是数据源,直接用来读文件
FileInputStream、FileOutputStream
处理流:
流对象中包含的是 流对象,可以提供一些操作功能
提供缓冲功能:BufferInputStream、BuffergOutputStream
ObjectInputStream、ObjectOutputStream
2)**字符流:一次读写一个字符 **
主要用在:只能读纯文本文件 :txt 、java 、c
字符输入流 :
Reader
InputStreamReader :转换流 ,把原始的字节转为字符 将一个中文的三个字节转换为一个字符编码
FileReader
字符输出流:
Writer
OutputStreamWirter :转换流
FileWirter
**字符处理流:**提供对数据的缓存功能 BufferedReader\ BufferedWirter
没有输入,只是从程序中向外输出
PrintStream 打印字节流
PrintWriter 打印字符流 单向从服务器向客户端浏览器响应数据,javaEE中用
package com.ffyc.javaio;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class PrintDemo {
public static void main(String[] args) throws FileNotFoundException {
/*
打印字符流, 单向从服务器端向客户端浏览器响应数据. javaEE时需要使用
*/
PrintWriter p = new PrintWriter("E:/demo.html");
p.println("你好世界
");
p.println("你好世界
");
p.close();
}
}
即对象序列化和对象反序列化
对象序列化:把对象信息读写到一个文件中
对象反序列化:对象输入流 读取文件中的对象信息
就是把程序运行时所产生的的对象信息(内存中存储) 输入到一个文件中(实现对象信息的持久化保存),称为对象序列化
例如:系统需要升级,就要停止服务器,可以将一些对象保存到硬盘中,升级完后,服务器启动,从文件中读取信息。
从文件中,将对象信息读取到内存中,称为反序列化。(也是java中创建对象的一种方式)
一旦一个类的对象,需要序列化,那么此类必须实现序列化接口
为该类默认生成一个版本号
面试中问:要新建一个对象的方式?
答:new 对象反序列化…