File :代表 文件 与 文件夹
public static void createFile(){
File file1 = new File("D:\\英雄时刻");
System.out.println("file1文件的绝对路径为:"+file1.getAbsoluteFile());
//判断文件是否存在
System.out.println(file1.exists());
//把file1作为父目录创建文件对象
File file2 = new File(file1,"mysql.sql");
System.out.println("file1文件的绝对路径为:"+file2.getAbsoluteFile());
}
常用方法:
获取
重命名
判断
创建
boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。
如果此文件目录的上层目录不存在,也不创建
boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
删除
public TextFile(){
public static void fileMethod(){
//创建文件
File file = new File("D:\\sql.sql");
String parentPath = file.getAbsolutePath();
//把file作为父目录创建文件对象
File file1 = new File(file,"mysql.sql");
//把filePath作为父目录创建文件对象
File file1 = new File(parentPath,"mysql.sql");
//判断文件是否存在
file.exists();
//判断file是否为文件夹
file.isDirectory();
//判断是否为文件
file.isFile();
//查看文件的大小(字节)
file.length();
//重命名文件(物理文件的重命名,类属性不变)
file.renameTo(new File("D:\\mysql.sql"));
//创建文件的上级所有的文件(如果文件夹不存在)
file.mkdirs();
//删除文件
file.delete();
// JVM结束的时候,刪除文件,常用于临时文件的删除
file.deleteOnExit();
// 以字符串数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹)
file.list();
// 以文件数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹)
File[] files = file.listFiles();
}
}
I/O是Input/Output的缩写
Java IO 原理
Java IO流众多,但全部都是从4个抽象基类派生:
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
//方式一:
public static void read() {
FileReader fr = null;
try {
File file = new File("hello_world\\test.txt");
fr = new FileReader(file);
char[] chars = new char[2];
int read ;//0~65535范围的Unicode
while ((read=fr.read(chars))!=-1){
for (int i = 0; i <read ; i++) {
System.out.print((char) chars[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if (fr!=null)fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//方式二:
public static void read() {
FileReader fr = null;
try {
File file = new File("hello_world\\test.txt");
fr = new FileReader(file);
char[] chars = new char[5];
int read ;
while ((read=fr.read(chars))!=-1){
String str = new String(chars,0,read);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if (fr!=null)fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//方式三:
public static void read() {
FileReader fr = null;
try {
File file = new File("hello_world\\test.txt");
fr = new FileReader(file);
char[] chars = new char[3];
int read ;
//创建一个StringBuffer拼接字符
StringBuffer strB = new StringBuffer();
while ((read=fr.read(chars))!=-1){
strB.append(chars,0,read);
}
System.out.println(strB.toString());
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if (fr!=null)fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:File file = new File(“hello_world\test.txt”);为相对路径,当前项目hello_world文件夹下test.txt文件
1.创建流对象,建立数据存放文件
FileWriter fw = new FileWriter(new File(“Test.txt”));
2.调用流对象的写入方法,将数据写入流
fw.write(“我要征服世界”);
3.关闭流资源
fw.close();
写出字符串
public static void write(){
FileWriter fw = null;
try {
File file = new File("hello_world\\test.txt");
//不会覆盖原有文件,追加内容
fw = new FileWriter(file,true);
fw.write("我要征服世界");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw!=null){
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
读取一个文件,写出到指定位置
public static void write(){
FileWriter fw = null;
FileReader fr = null ;
try {
File file = new File("hello_world\\test.txt");
fr = new FileReader("hello_world\\pom.xml");
//不会覆盖原有文件,追加内容
fw = new FileWriter(file,true);
char[] cBuf = new char[64];
int read ;
while((read=fr.read(cBuf))!=-1){
fw.write(cBuf,0,read);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw!=null){
fw.close();
}
if (fr!=null)fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
与文件字符输出流大致相同
字节输出流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt
字节流不能读取文本文件(字符),出现乱码
字符流操作字符,只能操作普通文本文件。最常见的文本文
件:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文 本文件
读取git.md,写出到硬盘下
public static void write(){
FileOutputStream fo = null;
FileInputStream fi = null ;
try {
File file = new File("hello_world\\test.md");
//读入git.md到内存中
fi = new FileInputStream("hello_world\\git.md");
//覆盖当前目录下同名文件
fo = new FileOutputStream(file);
byte[] bBuf = new byte[64];
int read ;
while((read=fi.read(bBuf))!=-1){
fo.write(bBuf,0,read);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fo!=null)
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fi!=null)
fi.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
为了提高数据读写的速度,Java API 提供了带缓冲功能的流类,在使用时,会创建一个内部缓冲区数组,使用8192个字节(8kb)的缓冲区
public class BufferedInputStream extends FilterInputStream {
private static int DEFAULT_BUFFER_SIZE = 8192
public class BufferedReader extends Reader {
private static int defaultCharBufferSize = 8192;
缓冲流要“套接”在相应的节点流上分为(见名知意)
缓冲流能有效的提升数据的读写
特点:
字符缓冲流与字节缓冲流大致相同,缓冲区为8192个字符
public static void copyFile(String srcPath,String destPath){
BufferedInputStream br = null;
BufferedOutputStream bw = null;
try {
File srcFile = new File(srcPath);
File destFile = new File(destPath);
FileInputStream fr = new FileInputStream(srcFile);
FileOutputStream fw = new FileOutputStream(destFile);
br = new BufferedInputStream(fr);
bw = new BufferedOutputStream(fw);
byte[] buff = new byte[1024];
int len ;
while((len=br.read(buff))!=-1){
bw.write(buff,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//缓冲流关闭,自带关闭文件流
if (br!=null) {
try {
br.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw!=null) {
try {
bw.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
String srcPath ="D:\\Users\\333\\Desktop\\毕业设计\\2020.3.4.zip" ;
String destPath ="D:\\Users\\333\\Desktop\\2020.3.4.zip";
copyFile(srcPath, destPath);
long end = System.currentTimeMillis();
System.out.println(end-start);
}
转换流提供了在字节流和字符流之间的转换
构造器:
如: Reader isr = new InputStreamReader(System.in,”GBK”);
public static void change() {
InputStreamReader isr = null;
try {
File file = new File("hello_world\\java web.txt");
InputStream is = new FileInputStream(file) ;
//将字节流转换为字符流
isr = new InputStreamReader(is);
char[] cBuf = new char[1024] ;
int len ;
while((len=isr.read(cBuf))!=-1){
for (int i=0;i<len;i++){
System.out.print((char)cBuf[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (isr!=null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
键盘输入System.in为字节流extends InputStream,所以需要使用到转换流转换为字符流,再使用缓冲流读出
//读取键盘输入一行字符串
public static void systemIn() {
InputStreamReader isr = null;
BufferedReader br = null ;
try {
isr = new InputStreamReader(System.in,"GBK");
br = new BufferedReader(isr);
String s = br.readLine();
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br!=null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识
别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。
这就是编码表。
作用:用于存储和读取基本数据类型和对象的处理流,可以把Java中的对象写入到磁盘中,也能把对象从磁盘中读取回来
对象流运用场景:
序列化:把Java中的对象转换为二进制写入到磁盘中
如果需要序列化,该类必须实现如下两个接口之一
序列化的好处:任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原
注意:被static和stransient关键字修饰的成员变量不能被序列化
反序列化:把磁盘中二进制文件转换为Java中的对象
凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:private static final long serialVersionUID
未声明SerialVersionUID
序列化
public class Person implements Serializable {
private Integer id ;
private String name ;
private Pet pet ;
}
改变属性
public class Person implements Serializable {
private Integer id ;
private String name ;
private Pet pet ;
private int age ;//添加了age属性
}
反序列化
声明SerialVersionUID后
序列化
public class Person implements Serializable {
private static final long serialVersionUID = 10000 ;
private Integer id ;
private String name ;
private Pet pet ;
}
改变属性
public class Person implements Serializable {
private static final long serialVersionUID = 10000 ;
private Integer id ;
private String name ;
private Pet pet ;
private int age ;//添加了age属性
}
反序列化
注意:
序列化对象
public class Person implements Serializable {
private Integer id ;
private String name ;
private Pet pet ;
}
public class Pet implements Serializable {
private String name ;
private Integer age ;
}
序列化
public static void demo01() throws IOException {
Person json = new Person(001, "json",new Pet("旺财", 3));
File file = new File("person.txt");
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(json);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos!=null)
oos.close();
}
}
反序列化
public static void demo02() {
File file = new File("person.txt");
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
Object o = ois.readObject();
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
public static void server() {
//创建ServerSocket对象,指定端口号
ObjectInputStream ois = null;
try {
ServerSocket ss = new ServerSocket(9999);
//监听客户端的连接
Socket s = ss.accept();
System.out.println("客户端已连接。。。");
//获取网络传输字节输入流
InputStream is = s.getInputStream();
//创建对象输入流
ois = new ObjectInputStream(is);
//获取对象
Object o = ois.readObject();
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭对象流
if (ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端
public static void client() {
Person person = new Person(001, "json", new Pet("旺财", 3));
//连接服务端
ObjectOutputStream oos = null;
try {
Socket s = new Socket("127.0.0.1",9999);
//获取网络传输输出流
OutputStream os = s.getOutputStream();
//创建对象输出流
oos = new ObjectOutputStream(os);
//传送person对象
oos.writeObject(person);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭输出流
try {
if (oos!=null)
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意: