概念:内存与存储设备之间传输数据的通道
图示:
按方向(重点):
输入流:将<存储设备>的内容读入到<内存>中
输出流:将<内存>中的内容写入到<存储设备>中
按单位:
字节流:以字节为单位,可以读写所有数据
字符流:以字符为单位,只能读写文本数据
按功能:
节点流:具有实际传输数据的读写功能
过滤流:在节点流的基础之上增强功能
输入流方法:
输出流方法:
FileInputStream:
public int read(byte[] b); 从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1
FileOutputStream:
public void write(byte[] b); 一次写多个字节,将b数组中所有字节,写入输出流
演示FileInputStream:
package com.io.demo01;
import java.io.FileInputStream;
public class Demo01 {
//演示FileInputStream的使用
public static void main(String[] args) throws Exception {
//1. 创建FileInputStream,并指定文件路径
FileInputStream fis = new FileInputStream("f:\\aaa.txt");
/*
//2.1 读取文件 fis.read() 单个字节读取
int data = 0;
while ((data = fis.read())!=-1){
System.out.print((char) data);
}
*/
/*
//2.2 一次性读取多个字节
byte[] buf = new byte[4];
int count = fis.read(buf);
System.out.println(new String(buf));
System.out.println(count);
int count1 = fis.read(buf);
System.out.println(new String(buf));
System.out.println(count1);
int count2 = fis.read(buf);
System.out.println(new String(buf,0,count2));
System.out.println(count2);
*/
//2.3循环读取多个字节
byte[] buf = new byte[4];
int count = 0;
while ((count = fis.read(buf)) != -1){
System.out.print(new String(buf,0,count));
}
//3. 关闭
fis.close();
System.out.println("执行完毕");
}
}
示例:
package com.io.demo01;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Demo03 {
public static void main(String[] args) throws Exception {
//1. 创建流,实现文件的复制
//1.1 文件字节输入流
FileInputStream fis = new FileInputStream("f:\\beautifulGirl.jpg");
//1.2 文件字节输出流
FileOutputStream fos = new FileOutputStream("f:\\beautifulGirl2.jpg");
//2. 一边读,一边写
byte[] buf = new byte[1024];
int count = 0;
while((count = fis.read(buf))!=-1){
fos.write(buf, 0 , count);
}
//3. 关闭
fis.close();
fos.close();
System.out.println("复制完毕");
}
}
BufferedInputStream/BufferedOutputStream
示例:
package com.io.demo01;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class Demo04 {
public static void main(String[] args) throws Exception {
//1. 创建BufferedInputStream
FileInputStream fis = new FileInputStream("f:\\aaa.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
//2. 读取
/* int data = 0;
while ((data = bis.read()) != -1){
System.out.print((char)data);
}*/
//自建缓冲区
byte[] buf = new byte[1024];
int count = 0;
while ((count = bis.read(buf)) != -1) {
System.out.println(new String(buf,0,count));
}
//3. 关闭,这里关了bis即可
bis.close();
}
}
package com.io.demo01;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
public class Demo05 {
public static void main(String[] args) throws Exception {
//使用字节缓冲流写入文件
//1. 创建字节输出缓冲流
FileOutputStream fos = new FileOutputStream("f:\\buffer.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//2. 写入文件
for (int i = 0; i < 10; i++) {
bos.write("helloWorld\r\n".getBytes()); //写入8K缓冲区
bos.flush(); //刷新到硬盘,不然没内容
}
//3. 关闭
bos.close();
}
}
ObjectInputStream/ObjectOutputStream
使用流传输对象的过程称为序列化、反序列化
序列化类必须要实现Serializable接口
序列化类中对象属性必须要实现Serializable接口
示例:
创建Student类:
package com.io.demo02;
import java.io.Serializable;
public class Student implements Serializable { //序列化标记
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name=‘" + name + ‘\‘‘ +
", age=" + age +
‘}‘;
}
}
创建测试类:
package com.io.demo02;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class Demo02 {
public static void main(String[] args) throws Exception{
//使用ObjectInputStream实现对象的序列化,读取重构成对象
//1. 创建对象流
FileInputStream fis = new FileInputStream("f:\\stu.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
//2. 反序列化(读取操作)
Student s = (Student) ois.readObject(); //不能读多次
//3. 关闭
ois.close();
System.out.println(s.toString());
System.out.println("执行完毕");
}
}
当编码方式与解码方式不一致时,会出现乱码
字符流的父类(抽象类):
示例:
package com.io.demo03;
import java.io.FileInputStream;
import java.io.FileReader;
public class Demo01 {
public static void main(String[] args) throws Exception{
//创建FileReader对象读取文件
FileReader fr = new FileReader("f:\\hello.txt");
/* int data = 0;
while ((data = fr.read())!=-1){ //读取汉字,三个字节一个字,字节流一个一个读会乱码,要用字符流
System.out.print((char) data);
}*/
//自建缓冲区
char[] buf = new char[1024];
int count = 0;
while ((count = fr.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
fr.close();
}
}
package com.io.demo03;
import java.io.FileWriter;
public class Demo02 {
public static void main(String[] args) throws Exception {
FileWriter fw = new FileWriter("f:\\write.txt");
for (int i = 0; i < 10; i++) {
fw.write("I love you\r\n");
fw.flush();
}
fw.close();
System.out.println("执行完毕");
}
}
示例:
package com.io.demo03;
import java.io.FileReader;
import java.io.FileWriter;
public class Demo03 {
//使用FileReader和FileWriter复制文件,注意不能复制图片或二进制文件
public static void main(String[] args) throws Exception {
FileWriter fw = new FileWriter("f:\\write01.txt");
FileReader fr = new FileReader("f:\\write.txt");
int data = 0;
while ((data = fr.read())!=-1){
fw.write(data);
fw.flush();
}
fr.close();
fw.close();
System.out.println("执行完毕");
}
}
缓冲流:BuffferedReader/BuffferedWriter
示例:
package com.io.demo03;
import java.io.BufferedReader;
import java.io.FileReader;
public class Demo04 {
//使用字符缓冲流读取文件
public static void main(String[] args) throws Exception {
//1. 创建对象
FileReader fr = new FileReader("f:\\write.txt");
BufferedReader br = new BufferedReader(fr);
//2.1 第一种方式
char[] buf = new char[1024];
int count = 0;
while ((count = br.read(buf))!=-1){
System.out.print(new String(buf,0,count));
}
//2.2 第二种方式,一行一行读取
String line = null;
while ((line = br.readLine())!=null){
System.out.println(line);
}
br.close();
}
}
package com.io.demo03;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class Demo05 {
//使用BufferedWriter
public static void main(String[] args) throws Exception{
FileWriter fw = new FileWriter("f:\\write03.txt");
BufferedWriter bw = new BufferedWriter(fw);
for (int i = 0; i < 10; i++) {
bw.write("I love you");
bw.newLine(); //换行,相当于\r\n
bw.flush();
}
bw.close();
}
}
PrintWriter:封装了print()和println()方法,支持写入后换行
支持数据原样打印
示例:
package com.io.demo03;
import javafx.print.Printer;
import java.io.PrintWriter;
public class Demo06 {
public static void main(String[] args) throws Exception{
//演示PrintWriter的使用
//创建对象
PrintWriter pw = new PrintWriter("f:\\pw.txt");
//打印
pw.println(97);
pw.println(‘a‘);
pw.println("helloWord");
pw.close();
System.out.println("执行完毕");
}
}
桥转换流:InputStreamReader/OutputStreamWriter
示例:
package com.io.demo03;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
public class Demo07 {
public static void main(String[] args) throws Exception{
//1. 创建InputStreamReader对象
FileInputStream fis = new FileInputStream("f:\\write.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8"); //和文件编码方式不一样会乱码
//2. 读取文件
int data = 0;
while ((data = isr.read())!=-1){
System.out.print((char)data);
}
//3. 关闭
isr.close();
}
}
package com.io.demo03;
import javax.xml.ws.WebServiceException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Demo08 {
public static void main(String[] args) throws Exception {
//1. 创建OutputStreamWriter
FileOutputStream fos = new FileOutputStream("f:\\info.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
//2. 写入
for (int i = 0; i < 10; i++) {
osw.write("我爱广东,我爱故乡\r\n");
osw.flush();
}
//3. 关闭
osw.close();
System.out.println("执行完毕");
}
}
概念:
代表物理盘符中的一个文件或者文件夹
方法:
createNewFile() //创建物理盘符中的一个文件或者文件夹
mkdir() //创建一个新目录
delete() //删除文件或空目录
exists() //判断File对象所代表的对象是否存在
getAbsolutePath() //获取文件的绝对路径
getName() //取得名字
getParent() //获取文件或目录所在的目录
isDirectory() //是否是目录
isFile() //是否是文件
length() //获得文件的长度
listFiles() //列出目录中的所有内容
renameTo() //修改文件名为
示例:
package com.io.demo04;
import com.sun.corba.se.impl.encoding.CDROutputObject;
import java.io.File;
import java.util.Date;
public class Demo01 {
public static void main(String[] args) throws Exception{
//File类的使用,分隔符、文件操作、文件夹操作
separator();
System.out.println("==============");
fileOpe();
}
public static void separator() {
System.out.println("路径分隔符" + File.pathSeparator);
System.out.println("名称分隔符" + File.separatorChar);
}
public static void fileOpe() throws Exception{
//1. 创建文件
File file = new File("f:\\newFile.txt"); //不加盘符直接创建在项目文件夹中
boolean b = file.createNewFile(); //创建文件,没有true,有就false
System.out.println("创建结果:" + b);
//2. 删除文件
//2.1 直接删除
//System.out.println("删除结果" + file.delete());
//2.2 使用jvm退出时删除
//file.deleteOnExit();
//Thread.sleep(5000); //等待5秒钟删除文件
//3. 获取文件信息
System.out.println("获取文件的绝对路径:" + file.getAbsolutePath());
System.out.println("获取路径:" + file.getPath());
System.out.println("获取文件名称:" + file.getName());
System.out.println("获取父目录:" + file.getParent());
System.out.println("获取文件长度" + file.length());
System.out.println("文件创建时间" + new Date(file.lastModified()).toLocaleString());
//4. 判断
System.out.println("是否可写:" + file.canWrite()); //文件属性改为只读不能写输出false
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否隐藏:" + file.isHidden());
}
}
示例:
package com.io.demo04;
import java.io.File;
import java.util.Date;
public class Demo02 {
public static void main(String[] args) throws Exception{
directoryOpe();
}
public static void directoryOpe() throws Exception{
//1. 创建文件夹
File dir = new File("f:\\aaa\\bbb\\ccc");
System.out.println(dir.toString());
if ((!dir.exists())){
//dir.mkdir() //创建单级目录
dir.mkdirs(); //创建多级目录
}
//2. 删除文件夹,只删除最底层空目录
//2.1 直接删除
//dir.delete();
//2.2 jvm删除
//dir.deleteOnExit();
//3. 获取文件夹信息
System.out.println(dir.getAbsolutePath());
System.out.println(dir.getPath());
System.out.println(dir.getName());
System.out.println(dir.getParent());
System.out.println(new Date((dir.lastModified())).toLocaleString());
//4.判断
dir.isDirectory();
dir.isHidden();
//5. 遍历文件夹(文件夹特殊操作)
File dir2 = new File("f:\\编程学习笔记");
String[] files = dir2.list();
System.out.println("=========================");
for (String s:
files) {
System.out.println(s);
}
}
}
文件过滤,当调用File类中的listFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才可出现在其返回值中
示例(部分代码):
//6. 文件过滤器接口
File[] files2 = dir2.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".md")){ //只读取.md文件
return true;
}
return false;
}
});
for (File s1:
files2) {
System.out.println(s1.getName());
}
示例:
package com.io.demo05;
import java.io.File;
public class Demo01 {
//递归遍历文件夹
public static void main(String[] args) {
listDir(new File("f:\\编程学习笔记")); //自己找一个文件夹遍历
deleteDir(new File("f:\\编程学习笔记 - 副本")); //删除文件夹
}
public static void listDir(File dir) {
File[] files = dir.listFiles();
System.out.println(dir.getAbsolutePath());
if (files != null && files.length>0){ //存在且非空
for (File file:
files) {
if (file.isDirectory()){
listDir(file); //如果还是文件夹,递归
}else{
System.out.println(file.getAbsolutePath());
}
}
}
}
//递归删除文件夹
public static void deleteDir(File dir) {
File[] files = dir.listFiles();
System.out.println(dir.getAbsolutePath());
if(files != null && files.length > 0){
for (File file:
files) {
if (file.isDirectory()){
deleteDir(file);
}else {
System.out.println(file.getAbsolutePath() + "删除" + file.delete()); //删除文件
}
}
}
System.out.println(dir.getAbsolutePath() + "删除" + dir.delete()); //删除文件夹
}
}
属性集合,特点:
示例:
package com.io.demo05;
import javafx.print.Printer;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Properties;
/*
演示Properties集合的使用
*/
public class Demo03 {
public static void main(String[] args) throws Exception{
//创建集合
Properties properties = new Properties();
//添加数据
properties.setProperty("username","小明");
properties.setProperty("age","20");
System.out.println(properties.toString());
//遍历
//keySet();
//entrySet();
//stringPropertyNames();
for (String pro:
properties.stringPropertyNames()) {
System.out.println(pro + "=" + properties.getProperty(pro));
}
//和流有关的方法
//list方法
/*PrintWriter pw = new PrintWriter("f:\\print.txt");
properties.list(pw);
pw.close();*/
//store方法
/*FileOutputStream fos = new FileOutputStream("f:\\print1.properties");
properties.store(fos,"注释");
fos.close();*/
//load方法
Properties properties1 = new Properties();
FileInputStream fis = new FileInputStream("f:\\print1.properties");
properties1.load(fis);
fis.close();
System.out.println(properties1.toString());
}
}
原文:https://www.cnblogs.com/czy2642168812/p/14640176.html