文章目录
1 Java中IO流分类和原理
1.1 IO流的分类
通过程序下载一张图片的过程:
将该图片转化为2进制数据集,把该数据集一点一点的传到文件夹,这个传递的过程就类似于水的流动,所以可以将该2进制数据集当作一个数据流
Java的IO流都是由4个父类派生出来的:
字节流(8bit) InputStream OutputStream
字符流(16bit) Reader Writer
按照具体的使用形式,可以分为:
1,文件流
操作文件,数据流的读写都是基于文件的操作
FielInputStream,FileOutputStream,FileReader,FileWrite
2,缓冲流
操作内存,数据流的读写都是基于内存的操作
BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter
3,转换流
InputStreamReader,OutputStreamWriter
4,标准输入/输出流
InputStream,printStream
5,打印流
常用的System.out.println()就是打印流
printStream,printWriter
6,数据流
DataInputStream,DataOutputStream
7,对象流
把一个对象转化为一个数据流进行读写
ObjectInputStream,ObjectOutputStream
...
1.2 JavaIO流的原理
IO流用来处理设备之间的数据传输,Java程序对于数据的输入/输出以Stream的形式进行
java.io包下提供了各种"流"类和接口,用以获得不同类的数据并通过标准的方法输入或输出数据
输入input: 读取外部数据(硬盘,光盘等)到内存中
输出output: 将内存中的数据写入硬盘,光盘等
2 Java中IO流的简单使用
2.1 对文件或目录属性的操作
在java.io.File中File类能操作的不仅是文件还有目录,但是File只能创建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件内容,需要使用输入流/输出流
public static void main(String[] args) throws IOException {
/*file对象就是现在的iotest.txt文件
* Java中 \ 是转义符,在Java中 / 或 \\ 才是文件分隔符*/
File file = new File("D:\\java\\iotest.txt");
System.out.println(file.getName());
System.out.println(file.getAbsolutePath());
file.renameTo(new File("D:\\java\\ioTest.txt"));
/*目录和文件都可以创建File类对象*/
File file1 = new File("D:\\java");
System.out.println(file1.getName());
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getPath());
System.out.println(file1.isFile());
/*使用相对路径来创建File类对象*/
File file2 = new File("src/com/coisini/io/test/IOTest0.java");
System.out.println(file2.getPath());;
System.out.println(file2.getAbsolutePath());
System.out.println(file2.getParent());
/*判断File类对象是否存在,是文件还是目录*/
File file3 = new File("D:\\java\\ioTest.txt");
System.out.println(file3.exists());
System.out.println(file3.isDirectory());
System.out.println(file3.isFile());
/*得到File类对象的具体信息*/
File file4 = new File("D:\\java\\ioTest.txt");
System.out.println(file4.lastModified());
System.out.println(file4.length());
/*根据File类对象创建并删除一个文件*/
File file5 = new File("D:\\java\\IOTT.txt");
if(!file5.exists()) {
file5.createNewFile();
}
System.out.println(file5.getName());
file5.delete();
/*根据File类对象创建并删除一个目录*/
File file6 = new File("D:\\java\\IODIR");
file6.mkdir();
file6.delete();
/*获得File类对象目录下的所有子目录和文件*/
File file7 = new File("D:\\java");
File[] files = file7.listFiles();
for(File f : files) {
System.out.println(f.getName());
}
}
2.2 通过File遍历目录下的所有文件
public class ScanFiles {
public ScanFiles() {
}
public void scanFiles(File file) {
if(file.isFile()) {
System.out.println(file.getName() + "是文件");
}
File[] files = file.listFiles();
for(File f : files) {
if(f.isDirectory()) {
System.out.println(f.getName() + "是目录,进入目录..");
scanFiles(f);
} else {
System.out.println(f.getName() + "是文件");
}
}
}
}
2.3 对文件的内容进行读写
对于文件内容的读写需要使用IO流来进行,读写文件需要FielInputStream,FileOutputStream
public static void main(String[] args) throws IOException {
/*采用字节输入流读取文件中内容*/
FileInputStream fileInputStream = new FileInputStream("D:\\test.txt");
//采用字节流的方式用byte数组接收目标文件的内容
byte[] bytes = new byte[64];
fileInputStream.read(bytes);
System.out.println(new String(bytes));
//使用完流后需要关闭
fileInputStream.close();
/*采用字节输出流向文件中写入内容*/
FileOutputStream fileOutputStream = new FileOutputStream("D:\\test.txt");
String str = "1234342342wdaczzqd@@~`!";
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
}
注: 读取文件内容和向文件写入内容都需要byte[ ]来进行,使用完后需要关闭
3 对象流
3.1 需要对象流的原因
为了让对象持久化(把对象保存到硬盘)和将对象在网络间进行传输
对象流能够把Java中的对象转化为数据流(2进制文件),也能把对象从数据流中还原回来
对象流有两种:
ObjectInputStream
ObjectOutputStream
3.2 序列化和反序列化
序列化:用ObjectInputStream类将一个Java对象转化为数据流中
反序列化:用ObjectOutputStream类从数据流中恢复序列化之前的Java对象
如果要让一个对象实现序列化和反序列化,则需要让该对象的所属类实现Serializable接口/Externalizable接口之一
序列化和反序列化的测试:
将对象序列化保存到文本文件中的结果:
将对象反序列化后输出的结果:
注: 序列化和反序列化所使用的类必须完全一致,包名,类名一切相关信息必须相同,否则反序列化可能得不到想要的结果出现类型转换异常,使用时最好生成一个serialVersionUID以区别同名但结构不同的类