io包
1.FileInputStream字节输入流(读取)
默认:源文件字符—》程序十进制
read()方法:一次只能读取一个字节,当读取到文件末尾,返回值为-1
close()方法:关闭流释放资源–》Java程序占用的系统资源被释放
注意:Windows平台使用\作为路径分隔符,在Java字符串中需要用\表示一个\。Linux平台使用/作为路径分隔符
//1.创建字节输入流对象 FileInputStream fis = new FileInputStream("D:\\abc.txt"); //2.读取文件中的数据 int f = fis.read(); //一次只能读取一个字节,当读取到文件末尾,返回值为-1,鼠标点击read()方法,查看返回数据类型, //输出的是字符对应的十进制数,参考ASCII码,转换为字符类型,需要强制转换 System.out.println((char)f);
while循环输出文件所有内容
int f; //不确定循环次数,使用while //在循环中不断地调用read方法,并把读取到的数据给f复制,只要没有读取到-1,说明没有达到文件末尾 while((f = fis.read()) != -1) { System.out.println((char)f); } fis.close();//关闭流释放资源
说明:在程序还在执行的状态下,若不关闭流,Java占用的系统文件(如abc.txt),将不能被操作(删除、重命名等)
2.FileOutputStream字节输出流
默认:程序十进制—》写出字符
特点:
- 输出流写出数据,若不存在指定文件,将自动创建
- 输出流写出数据,如果关联的文件已经存在,会将原本内容覆盖;若不想覆盖原本内容,可以在构造方法的位置加上true开关即可实现追加。
write()方法:写出数据(十进制)
2.1单个字节写出
//1.创建字节输出对象,写到write.txt文件中,若不存在指定文件,将自动创建 FileOutputStream fos = new FileOutputStream("D:\\write.txt"); //2.写出数据 fos.write(97); //3.关闭流释放资源 fos.close();
文件中写入的是a
2.2当我们不知道字符对应的字节数时,采用getBytes()方法
byte[] bytes = "hello".getBytes(); //输出字符对应的所有字节 System.out.println(Arrays.toString(bytes)); //将字符写到文件中 fos.write(bytes);
Java程序输出[104, 101, 108, 108, 111]
文件中是hello
追加不覆盖原本内容
FileOutputStream fos = new FileOutputStream("D:\\write.txt",true);
3.文件的拷贝copy()
步骤:
- 1.创建输入流和输出流对象
输入流对象关联要拷贝的数据源文件
输出流对象关联要拷贝的数据目的文件 - 2.在读取的过程中,将数据写到目标文件中
- 3.关闭流释放资源
- 注意:建议IO流的异常使用try……catch进行处理,加上finally代码块,将关闭流释放资源的代码,放在finally当中
1.不建议使用这个,费时(一个一个的拷贝)
public class CopyTest { public static void main(String[] args) throws IOException{ //1.创建字节输入流和输出流对象 FileInputStream fis = new FileInputStream("D:\\abc.txt"); FileOutputStream fos = new FileOutputStream("D:\\copy.txt"); //2.在读取的过程中,将数据写到目标文件中 int i; while((i=fis.read())!=-1) { fos.write(i); } //关闭流 fos.close(); fis.close(); } }
输出文件全部内容
FileInputStream fis = new FileInputStream("D:\\abc.txt"); //将字符存放到容器中 byte[] bytes = new byte[1024]; int len = fis.read(bytes); //将数组转换成String类型,三个参数,1个表示数组名,1个从哪一位开始(起始0),1个从哪个结束(数组长度) System.out.println(new String(bytes,0,len)); //字符长度 System.out.println(len);
运行:
abcd
4
2.使用一个容器数组来实现拷贝(一次性拷贝过去)
//开始时间,获取当前时间 long start = System.currentTimeMillis(); FileInputStream fis = new FileInputStream("D:\\abc.txt"); FileOutputStream fos = new FileOutputStream("D:\\copy.txt"); //将字符存放到容器 byte[] bytes = new byte[1024]; int len; while((len=fis.read(bytes))!=-1) { fos.write(bytes); } fis.close(); fos.close(); long end = System.currentTimeMillis(); //开始到结束耗时(毫秒) System.out.println(end-start);
4.字节缓冲流
- BufferedInputStream字节缓冲输入流
- BufferedOutputStream字节缓冲输出流
特点:
提高IO流的读写效率,内置了字节数组
//1.创建字节输入输出缓冲流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\abc.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\copy.txt",true)); //2.读写操作 int i; while((i=bis.read())!=-1) { //写出 bos.write(i); } //3.关闭流 bis.close(); bos.close();
5.字符流
字符流只能操作纯文本文件
GBK:一个(中文)字符占两个字节
UTF-8:一个字符占三个字节
共同点:英文和英文状态下的字符都占一个字节
中文对应的是负数,英文对应正数
作用:解决中文乱码
5.1字符输入流FileReader
//1.创建字符输入流 FileReader fr = new FileReader("D:\\char.txt"); //2.读取一个字符 int i; while((i=fr.read()) != -1) { System.out.print((char)i); } //3.关闭流 fr.close();
5.2字符输出流FileWtite
FileWriter fw = new FileWriter("D:\\write.txt"); //写出一个字符 fw.write("a"); char[] c = {'b','c'}; //写出数组所有元素 fw.write(c); //写出字符数组内部分元素b fw.write(c, 0, 1); fw.write("真不戳"); //写出字符的指定一部分 fw.write("干得漂亮", 0, 1); //关闭流 fw.close();
结果:
abcb真不戳干
6.字符缓冲流
优点:自动换行
- BufferedReader---->readLine()一次读取一行字符串,结束标记null
- BufferedWriter---->newLine()写出回车换行,此方法有跨平台性(windows)
//1.创建字符缓冲流对象 BufferedReader br = new BufferedReader(new FileReader("D:\\char.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\copy.txt")); //2.读写操作 String line; while((line=br.readLine())!= null) { bw.write(line); } //3.关闭流 br.close();
转换流
指定编码
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),"gbk");
7.File类的常用方法
Java中的file类可以将文件或文件夹的路径,封装成对象。
相对路径:相对于当前目录下文件或文件夹
绝对路径:从盘符的根目录开始,一直指向到某个具体的文件
**7.1exists()**判断文件是否存在
File file = new File("a.txt"); //exists()返回boolean类型,true表示存在该文件 System.out.println(file.exists());
**7.2creatNewFile()**创建文件
返回boolean类型,true表示创建成功
File file = new File("a.txt"); System.out.println(file.createNewFile());
7.3delete删除文件
返回boolean类型,true表示删除成功
7.4getName获取文件名称
File file = new File("D:\\write.txt"); File f2 = new File("a.txt"); //getName()获取文件或文件夹名称 System.out.println(file.getName()); //getPath()获取对象构造方法中封装的路径 System.out.println(f2.getPath()); //getAbsolutePath()获取绝对路径 System.out.println(f2.getAbsolutePath()); //getParent()获取构造方法中封装的父级路径 System.out.println(file.getParent());
eclipse:选中代码块,alt+shift+m装到方法中
运行:
write.txt
a.txt
G:\work\j\practices\a.txt
D:\
8.对象序列化
对象需要实现Serializable接口
Stu类
package io; import java.io.Serializable; public class Stu implements Serializable{ private String name,id; public Stu() { super(); // TODO Auto-generated constructor stub } public Stu(String name, String id) { super(); this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public String toString() { return "name=" + name + ", id=" + id ; } }
测试类
public static void main(String[] args) throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt")); Object object = ois.readObject(); System.out.println(object); } public static void writeObj() throws IOException{ //1.创建对象输出流,用于将对象写出到文件中 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt")); Stu stu = new Stu("张三", "11"); //2.使用对象输出流写出对象 oos.writeObject(stu); //3.关闭流 oos.close(); }