满招损,谦受益。
目录
JAVA I/O
文件
什么是文件?
相关记录或放在一起的数据的集合
文件一般存储在哪里?
硬盘,u盘、、、、
Java程序如何访问文件属性?
import java.io.File;
File类
File类访问文件属性
// 获取一个File类对象, 这个对象指向计算机F盘中的demo.txt文件
File file1 = new File("F:\\demo.txt");
File file2 = new File("F:/test");
File类的常用方法
方法名称 | 说明 |
---|---|
boolean exists( ) | 判断文件或目录是否存在 |
boolean isFile( ) | 判断是否是文件 |
boolean isDirectory( ) | 判断是否是目录 |
String getPath( ) | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath( ) | 返回此对象表示的文件的绝对路径名 |
String getName( ) | 返回此对象表示的文件或目录的名称 |
boolean delete( ) | 删除此对象指定的文件或目录 |
boolean createNewFile( ) | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节*, 如果文件不存在,则返回 0L |
流
概念:
-
流是一组有序的数据序列
-
以先进先出方式发送信息的通道
Java流的分类
按流向区分:
-
输出流:OutputStream和Writer作为基类
-
输入流:InputStream和Reader作为基类
按照处理数据单元划分:
-
字节流:
-
字节输入流InputStream基类
-
字节输出流OutputStream基类
-
-
字符流:
-
字符输入流Reader基类
-
字符输出流Writer基类
-
注意:字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
InputStream类
InputStream类常用方法
int read( ) int read(byte[] b) int read(byte[] b,int off,int len) void close( ) int available():可以从输入流中读取的字节数目
子类FileInputStream常用的构造方法
FileInputStream(File file) FileInputStream(String name)
使用FileInputStream 读文本文件
//创建File类对象
File file = new File("F:/a.txt");
//创建FileInputStream类对象
FileInputStream fis = new FileInputStream(file);
//读取数据
int num;
while((num=fis.read())!=-1){
System.out.print((char)num);
}
System.out.println("数据读取完毕");
//数据读取完毕之后,关闭流
fis.close();
OutputStream类
OutputStream类常用方法
void write(int c) void write(byte[] buf) void write(byte[] b,int off,int len) void close() void flush():强制把缓冲区的数据写到输出流中
子类FileOutputStream常用的构造方法
FileOutputStream (File file) FileOutputStream(String name) FileOutputStream(String name,boolean append)
注意:
1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容 2.创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
使用FileOutputStream 写文本文件
// 创建File类对象
File file = new File("F:/a.txt");
// 创建FileOutputStream类对象
FileOutputStream fos = null;
try {
// 构造方法FileOutputStream(File file)和FileOutputStream(String
// path):通过这两个构造方法创建的输出流对象在对外进行数据输出的时候,会覆盖文件中原来的数据
// FileOutputStream fos = new FileOutputStream(file);
// FileOutputStream(File file,boolean
// append)和FileOutputStream(String path,boolean
// append):使用这两个构造方法创建输出流对象的时候,将第二个参数赋值为true,则在对外进行输出数据的时候,不会覆盖文件中原来的数据
fos = new FileOutputStream(file, true);
// 调用写的方法,将数据写入到文件中
fos.write(65);
System.out.println("数据写入完毕");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Reader类
Reader类常用方法
int read( ) int read(char[] c) read(char[] c,int off,int len) void close( )
子类InputStreamReader常用的构造方法
InputStreamReader(InputStream in) InputStreamReader(InputStream in,String charsetName)
FileReader类
FileReader类是InputStreamReader的子类
- FileReader(File file) - FileReader(String name)
该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型 System.out.println(System.getProperty("file.encoding")); 获得本地平台的字符编码类型
使用FileReader读取文件
与字节流FileInputStream类实现文本文件读取步骤类似 引入相关的类
import java.io.Reader;
import java.io.FileReader;
Import java.io.IOExceprion;
创建FileReader对象
Reader fr= new FileReader("D:\\myDoc\\简介.txt");
读取文本文件的数据
fr.read();
关闭相关的流对象
fr.close();
// 创建FileReader类对象,FileReader类对象只能按照本地平台的编码格式读取文件,如果文件编码和本地平台编码格式不一样,会出先乱码的现象
FileReader fr = null;
try {
fr = new FileReader("F:/a.txt");
char[] chs = new char[1024];
// 读取数据
int num = fr.read(chs);
for (int i = 0; i < num; i++) {
System.out.print(chs[i]);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader类
概念:
BufferedReader类是Reader类的子类 BufferedReader类带有缓冲区 按行读取内容的readLine()方法
注意:
使用nFileReader类与BufferedReader类可以提高字符流读取文本文件的效率
BufferedReader常用的构造方法
BufferedReader(Reader in)
子类BufferedReader特有的方法
readLine()
使用 BufferedReader读文本文件
// 创建InputStream类对象,但是InputStream类是一个抽象类,不能创建对象,可以将其引用指向子类
InputStream is = null;
// 创建Reader类对象,但是Reader类是一个抽象类,不能创建对象,可以将其引用指向子类(包含孙子类)的实例
Reader reader = null;
// 创建BufferedReader类对象
BufferedReader br = null;
try {
is = new FileInputStream("F:/demo.txt");
reader = new InputStreamReader(is);
br = new BufferedReader(reader);
// 读取文件
// String str = br.readLine();
// System.out.println(str);
// String str2 = br.readLine();
// System.out.println(str2);
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
reader.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
解决读取时中文乱码
FileReader fr = new FileReader("c:\\myDoc\\hello.txt");
BufferedReader br=new BufferedReader(fr);
FileInputStream fis=new FileInputStream("c:\\myDoc\\hello.txt");
//使用InputStreamReader并设置编码格式
InputStreamReader fr=new InputStreamReader(fis,"UTF-8");
BufferedReader br=new BufferedReader(fr);
Writer类
Writer类常用方法
write(String str) write(String str,int off,int len) void close() void flush()
子类OutputStreamWriter常用的构造方法
OutputStreamWriter(OutputStream out) OutputStreamWriter(OutputStream out,String charsetName)
FileWriter类
概念:
FileWriter类是OutputStreamWriter的子类
-
FileWriter (File file)
-
FileWriter (String name)
该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
使用FileWriter写文件
与字节流FileOutputStream类实现向文本文件写入数据步骤类似 引入相关的类
import java.io.Reader;
import java.io.FileWriter;
import java.io.IOException;
创建FileReader对象
Writer fw= new FileWriter("D:\\myDoc\\简介.txt");
写文本文件
fw.write();
关闭相关的流对象
fw.close();
// 创建FileWriter类对象
FileWriter fw = null;
try {
fw = new FileWriter("F:/demo.txt", false);
fw.write("hello java");
System.out.println("文件写入完毕");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
BufferedWriter类
如何提高字符流写文本文件的效率?
使用FileWriter类与BufferedWriter类 BufferedWriter类是Writer类的子类 BufferedWriter类带有缓冲区
BufferedWriter常用的构造方法
BufferedWriter(Writer out)
使用 BufferedWriter写文件
// 创建Writer类对象,但是Writer类是一个抽象类,不能直接创建对象,但是可以创建引用指向其子类对象
Writer writer = null;
// 创建BufferedWriter类对象
BufferedWriter bw = null;
try {
writer = new FileWriter("F:/demo.txt", true);
bw = new BufferedWriter(writer);
// 先向文件中插入一个换行
bw.newLine();
bw.write("hello html");
bw.newLine();
bw.write("hello css");
System.out.println("数据写入完毕");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读写二进制文件
DataInputStream类
FileInputStream的子类 与FileInputStream类结合使用读取二进制文件
DataOutputStream类
FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件
使用 DataInputStream 读二进制文件
import java.io.FileInputStream;
import java.io.DataInputStream;
FileInputStream fis=new
FileInputStream("C:\\HelloWorld.class");
DataInputStream dis=new DataInputStream(fis);
dis.read ();
dis.close();
使用 DataOutputStream写二进制文件
import java.io.FileOutputStream;
import java.io.DataOutputStream;
FileOutputStream outFile = new FileOutputStream("C:\\temp.class");
DataOutputStream out=new DataOutputStream(outFile);
out.write();
out.close();
序列化和反序列化
序列化和反序列化的过程
序列化是将对象的状态写入到特定的流中的过程 反序列化则是从特定的流中获取数据重新构建对象的过程
序列化的步骤
注意:使用集合保存对象,可以将集合中的所有对象序列化
反序列化的步骤
注意:如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取
总结: