File类
1.表示路径,可以是文件的也可以是文件夹的,这个路径可以存在也可以不存在。
2.creatNewFile方法:
(1)表示创建一个新的文件夹,如果已经存在那么创建失败。
(2)如果父级路径是不存在的,方法会有异常。
(3)此方法创建的一定是文件,如果文件不包含后缀名,那么这个文件也可以打开。
3.mkdir:创建一个单极文件。
4.mkdirs:既能创建单极文件,又能创建多级文件。
5.delete:如果删除的是文件直接删除不会在回收站里面;如果删除的是空白文件夹同样是直接删除不会在回收站里面;如果删除的是有内容的文件夹则删除失败。
6.public File[] listFiles()方法:
(1)当调用者路径不存在时返回null。
(2)当调用者的路径表示的是文件时返回null。
(3)当调用者的路径表示的是空文件夹时返回一个长度为零的数组。
(4)当调用者的路径表示的是有内容的文件夹时返回此文件夹下所有的文件和文件夹的路径并且放在File数组里面返回(包括此文件夹下的隐藏文件)。
(5)当有内容的文件夹需要权限才可以访问时,返回null。
IO流简单介绍
1.I表示input;O表示output;流表示像水流一样传输数据。
2.IO流的作用:用于读写数据。
3.字节流可以操纵所有类型的文件;字符流只能操纵纯文本文件。
4.纯文本文件:windows系统自带的记事本打开并且可以读懂的文件。
例如:txt、md、xml、rc文件等等。
字节输出流
1.字节输出流名称:FileOutputStream。
2.使用格式:先创建对象,然后再写出数据,最后释放数据。
import java.io.FileOutputStream;
import java.io.IOException;
public class practice06 {
public static void main(String[] args) throws IOException {
FileOutputStream f=new FileOutputStream("a.text");
f.write(97);
f.close();//释放文件
}
}
3.创建字节输出流对象,实现换行和续写:
import java.io.FileOutputStream;
import java.io.IOException;
//创建字节输出流对象,实现换行和续写。
public class practice07 {
public static void main(String[] args) throws IOException {
FileOutputStream f=new FileOutputStream("a.text",true);//如果实现续写的话,需要手动添加true开关。
//存入第一行
String str1="nihao";
byte[] bytes1=str1.getBytes();
f.write(bytes1);
//存入第二行
String str2="\r\n";//Windows系统换行操作\r\n
byte [] bytes2=str2.getBytes() ;
f.write(bytes2);
//存入第三行
String str3 ="666";
byte[] bytes3=str3.getBytes();
f.write(bytes3);
f.close();
}
}
字节输入流
- 字节输入流如果读取不到文件直接报错。
- read方法使用一次只会读取一个字节,如果超出了范围返回-1。(相当于有一个指针在移动)
- 字节输入流的循环读取:
import java.io.FileInputStream;
import java.io.IOException;
//字节输入流的循环读取
public class practice09 {
public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("a.text");
int b;
while((b=f.read())!=-1){//注意:f.read()方法要放在循环里面,这样才能让指针移动.
System.out.print(b+" ");
}
}
}
文件拷贝
1.一次读一个字节(拷贝时间很慢):
//缺点:拷贝时间很慢。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class practice10 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.text");//读取文件
FileOutputStream fos=new FileOutputStream("b.text");//创建一个文件
int b;
while ((b=fis.read())!=-1){
fos.write(b);//将读取的文件拷贝到创建的文件中
}
fos.close();//后开启的先释放
fis.close();//先开启的最后释放
}
}
2.一次读取多个字节(拷贝时间很快):
import java.io.FileInputStream;
import java.io.IOException;
//优点:拷贝时间很快
public class practice11 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.text");
byte[] bytes=new byte[2];//定义一个长度为2的数组
int read1 = fis.read(bytes);//.read()方法会将读取到的内容传递到参数中
System.out.println(new String(bytes,0,read1));//讲读取到的内容转换成字符串并打印
int read2= fis.read(bytes);
System.out.println(new String(bytes,0,read2));
int read3= fis.read(bytes);
System.out.println(new String(bytes,0,read3));
}
}
3.完整优化后的代码实现:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class practice12 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.text");
FileOutputStream fos=new FileOutputStream("b.text");
int len;
byte[] bytes=new byte[1024*1024*5];
while((len=fis.read(bytes))!=-1){
fos.write(bytes);
}
fos.close();
fis.close();
}
}
字符集
1.在计算机中,任意的数据都是以二进制的形式来存储的。
2.计算机中最小的存储单元是一个字节。
3.ASCII字符集中,一个英文占一个字节。
4.简体中文版Windows,默认使用GBK字符集。
5.GBK字符集完全兼容ASCII字符集。
一个英文占一个字节,二进制第一位是0;
一个中文占两个字节,二进制高位字节的第一位是1。
6.Unicode字符集的UTF-8编码格式:
(1)一个英文占一个字节,二进制第一位是0,转成十进制是正数;
(2)一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数。
字符输入流
1.read()方法不带参数的字符输入流:
import java.io.FileReader;
import java.io.IOException;
public class Practice01 {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("c.text");
int a;
while ((a=fr.read())!=-1){
System.out.print((char)a);
}
fr.close();
}
}
2.read()方法带参数的字符输入流:
import java.io.FileReader;
import java.io.IOException;
public class Practice02 {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("c.text");
char[] chars =new char[2];
int b;
while ((b=fr.read(chars))!=-1){
System.out.print(new String(chars,0,b));
}
}
}
字符输出流
字符输入流的练习:
import java.io.FileWriter;
import java.io.IOException;
public class Practice03 {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("d.text");
fw.write("666");
char[] chars ={'你','好'};
fw.write(chars);
fw.close();
}
}
对象操作输出流
对象输出流的练习:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Practice04 {
public static void main(String[] args) throws IOException {
Student s=new Student("zhangsan",23);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("e.text"));
oos.writeObject(s);
oos.close();
}
}
对象操作输入流
对象操作输入流的练习:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Practice05 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream( new FileInputStream("e.text"));
Student o = (Student) ois.readObject();//将读取到的object类型强转为student类型
System.out.println(o);
ois.close();
}
}
对象操作输出流和对象操作输入流的细节汇总:
(1)使用序列流将对象写到文件时,需要让javabean类实现serializable接口。
(2)序列化写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。
(3)序列化对象后,修改了javabean类再次序列化会抛出异常。
解决方案:给javabean类添加SerialVersionUID(序列号、版本号)。
(4)如果成员变量不想被序列化,需要给成员变量添加transient关键字修饰。
字节打印流
字节打印流练习:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Practice06 {
public static void main(String[] args) throws FileNotFoundException {
PrintStream ps=new PrintStream(new FileOutputStream("f.text"));
ps.println("字节打印流");//默认自动换行
ps.print("666");
ps.printf("%s","字符串");//占位符打印
ps.close();
}
}
字符打印流
字符打印流练习:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class Practice07 {
public static void main(String[] args) throws FileNotFoundException {
PrintWriter pw=new PrintWriter(new FileOutputStream("g.text"),true);
//要把true开关打开,否则不会在文件中写下数据.
pw.println("hello,world!");
pw.print("你好");
pw.printf("%d",12);
}
}
打印流的细节汇总:
(1)打印流不操作数据源,只能操作目的地。
(2)字节打印流:默认自动刷新,特有的println自动换行。
(3)字符打印流:自动刷新需要开启,特有的println自动换行。