概念:内存与存储设备之间传输数据的通道,内存与磁盘之间的数据交互需要通过流来进行数据传输。
按方向【重点】:
按单位:
按功能:
package com.jjl.IO;
/*
文件字节输入流
*/
import java.io.FileInputStream;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) throws IOException {
test1();
test2();
test3();
System.out.println("运行结束");
}
public static void test1() throws IOException {
//1创建FileInputStream,并指定文件路径
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\test.txt");
//读取文件
//第一种读取方式:用read一个字节一个字节的读,效率慢
System.out.println("用read一个字节一个字节的读,效率慢");
int data=0;
while ((data=fis.read())!=-1){
System.out.println((char)data);
}
fis.close();
}
public static void test2() throws IOException {
//1创建FileInputStream,并指定文件路径
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\test.txt");
//读取文件
//第二种读取方式:将读字节放在数组里面,一次读指定个数的字节。
System.out.println("\n将读字节放在数组里面,一次读指定个数的字节");
byte[] buf=new byte[3];
int count=fis.read(buf);
System.out.println(count);
System.out.println(new String(buf));
int count1=fis.read(buf);
System.out.println(count1);
System.out.println(new String(buf));
int count2=fis.read(buf);
System.out.println(count2);
System.out.println(new String(buf,0,count2));
fis.close();
}
public static void test3() throws IOException {
//1创建FileInputStream,并指定文件路径
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\test.txt");
//读取文件
//第二种读取方式:将读字节放在数组里面,一次读指定个数的字节,并循环输出全部字节。
System.out.println("\n将读字节放在数组里面,一次读指定个数的字节,并循环输出全部字节");
byte[] buf=new byte[3];
int count3=0;
while ((count3=fis.read(buf))!=-1){
System.out.println(new String(buf,0,count3));
}
//关闭
fis.close();
}
}
输出:
用read一个字节一个字节的读,效率慢
a
b
c
d
e
f
g
将读字节放在数组里面,一次读指定个数的字节
3
abc
3
def
1
g
将读字节放在数组里面,一次读指定个数的字节,并循环输出全部字节
abc
def
g
运行结束
package com.jjl.IO;
import java.io.FileOutputStream;
import java.io.IOException;
/*
FileOutputStream
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
test1();
}
public static void test1() throws IOException {
//1创建文件字节输出流对象,指定好文件路径和文件名,Java会自动创建好文件
FileOutputStream fos=new FileOutputStream("E:\\study_file\\Java\\demo\\IOTest\\test1.txt",true);//加上true,则就不会覆盖文件中原有的数据,而是接着原始数据后面输入。
//写入文件
//写入单个字节
fos.write(97);//就是a的字符编码
fos.write('b');
fos.write('c');
//写入字符串
String string="\nhello word!";
fos.write(string.getBytes());
//关闭
fos.close();
System.out.println("执行完毕");
}
}
运行三次后的结果:(第三次运行时在“hello word!”前面加上了换行。)
abchello word!abchello word!abc
hello word!
package com.jjl.IO;
/*
使用文件字节流,实现图片文件复制
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
test1();
}
public static void test1() throws IOException {
//1.文件字节输入流
FileInputStream fis= new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\test.jpg");
//2.文件字节输出流
FileOutputStream fos= new FileOutputStream("E:\\study_file\\Java\\demo\\IOTest\\test1.jpg");
//3.一边读、一边写
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("复制完成");
}
}
package com.jjl.IO;
/*
使用字节缓冲流读取
*/
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
text1();
}
public static void text1() throws IOException {
//1创建Bu
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\test.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
//2读取
//实用于小文件
// int data=0;
// while ((data=bis.read())!=-1){
// System.out.println((char) data);
// }
//适用于大文件(效率快)
byte[] buf=new byte[1024];
int count=0;
while ((count=bis.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
//关闭
bis.close();
}
}
package com.jjl.IO;
import java.io.*;
/*
使用字节缓冲流写入文件
*/
public class Demo05 {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
//1创建字节输出缓冲流
FileOutputStream fos=new FileOutputStream("E:\\study_file\\Java\\demo\\IOTest\\test2.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
//1写入文件
for(int i=0;i<5000;i++){
bos.write("hello Word!".getBytes());//当字节没有超过8k时,都写入到了缓冲区
bos.flush();//刷新到磁盘文件
}
//关闭(内部会调用flush方法)
bos.close();
}
}
使用流传输对象的过程称为序列化、反序列化。
package com.jjl.IO;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
/*
使用ObjectOutputStream实现对象的序列化
要求:
(1)序列化类必须实现Serializable接口
(2)序列化类中对象属性要求实现Serializable接口
(3)序列号版本号ID,保证序列化的类和反序列化的类是同一个类
(4)使用transient修饰属性,这个属性就不能序列化
(5)静态属性也不能序列化
(6)序列化多个对象,可以借助集合实现
*/
public class Demo06 {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
//1创建对象流
FileOutputStream fos=new FileOutputStream("E:\\study_file\\Java\\demo\\IOTest\\test.bin");
ObjectOutputStream oos=new ObjectOutputStream(fos);
//2序列化(单个)
Student zhangsan=new Student("张三",20);
Student lisi=new Student("李四",22);
Student liwu=new Student("李wu",25);
Student liliu=new Student("李六",25);
Student liba=new Student("李七",29);
oos.writeObject(zhangsan);
oos.writeObject(lisi);
//序列化(批量)
ArrayList<Student> list=new ArrayList<>();
list.add(liwu);
list.add(liliu);
list.add(liba);
oos.writeObject(list);
//3关闭
oos.close();
System.out.println("序列化完成");
}
}
package com.jjl.IO;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
/*
使用ObjectInputStream实现反序列化(读取构造成对象)
*/
public class Demo07 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
test();
}
public static void test() throws IOException, ClassNotFoundException {
//创建对象流
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\test.bin");
ObjectInputStream ios=new ObjectInputStream(fis);
//2读取文件(反序列化)
Student s=(Student) ios.readObject();
Student s1=(Student) ios.readObject();
ArrayList<Student> list= (ArrayList<Student>) ios.readObject();
//关闭
ios.close();
System.out.println("执行完毕");
System.out.println(s.toString());
System.out.println(s1.toString());
System.out.println(list.toString());
}
}
输出:
执行完毕
Student{name='张三', age=20}
Student{name='李四', age=22}
[Student{name='李wu', age=25}, Student{name='李六', age=25}, Student{name='李七', age=29}]
字符编码 | 说明 |
---|---|
ISO-8859-1 | 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。 |
UTF-8 | 针对Unicode码表的可变长度字符编码 |
GB2312 | 简体中文 |
GBK | 简体中文、扩充 |
BIG5 | 台湾,繁体中文 |
字节流的弊端
package com.jjl.IO;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo08 {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
//1创建一个对象
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\hello.txt");
int data=0;
while ((data= fis.read())!=-1){//用这个方式无法读取中文,因为它是一个字节一个字节读取的,而一个中文占两个字节
System.out.print((char) data);
}
fis.close();
}
}
输出:
hello Word!hello Word!hello Word!好好å¦ä¹ ï¼ï¼
字节流无法读取中文以及其他操过一个字节表示的字符,因为它是一个字节一个字节读取的,而一个中文和其他字符占两个以上字节
package com.jjl.IO;
import java.io.FileReader;
import java.io.IOException;
public class Demo09 {
public static void main(String[] args) throws IOException {
System.out.println("单个字符读取");
test();
System.out.println("\n批量多字符读取");
test1();
}
//一个字符一个字符的读
public static void test() throws IOException {
//创建FileReader 文件字符输入流
FileReader fr = new FileReader("E:\\study_file\\Java\\demo\\IOTest\\hello.txt");
//2读取
//2.1单个字符读取
int data = 0;
while ((data = fr.read()) != -1) { //一个字符一个字符的读
System.out.println((char) data);
}
//关闭
fr.close();
}
public static void test1() throws IOException {
//创建FileReader 文件字符输入流
FileReader fr = new FileReader("E:\\study_file\\Java\\demo\\IOTest\\hello.txt");
//创建字符缓冲区,读取全部内容
char[] buf=new char[1024];
int count=0;
while ((count= fr.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
fr.close();
}
}
输出:
单个字符读取
h
e
l
l
o
!
好
好
学
习
!
!
批量多字符读取
hello!好好学习!!
package com.jjl.IO;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo10 {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
//创建Filewriter对象
FileWriter fw=new FileWriter("E:\\study_file\\Java\\demo\\IOTest\\writer.txt",true);//true,不覆盖源文件内容
//2写入
for(int i=0;i<10;i++){
fw.write("java是最好的语言\n");
fw.flush();
}
//3关闭
fw.close();
System.out.println("执行结束");
}
}
注意:
package com.jjl.IO;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
使用filereader和filewriter复制文本文件,不能复制图片或二进制文件
使用字节流可以复制任何文件
*/
public class Demo11 {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
//创建filereader和filewriter流
FileReader fr=new FileReader("E:\\study_file\\Java\\demo\\IOTest\\writer.txt");
FileWriter fw=new FileWriter("E:\\study_file\\Java\\demo\\IOTest\\writer1.txt");
//读写
int data=0;
while ((data=fr.read())!=-1){
fw.write(data);
fw.flush();
}
fw.close();
fr.close();
}
}
package com.jjl.IO;
import java.io.BufferedReader;
import java.io.FileReader;
/*
使用字符缓冲流读取文件
BuferedReader
*/
public class Demo12 {
public static void main(String[] args) throws Exception {
System.out.println("按字符读取");
test();
System.out.println("按行读取");
test1();
}
//第一种读取方式
public static void test() throws Exception{
//1创建缓冲流
FileReader fr=new FileReader("E:\\study_file\\Java\\demo\\IOTest\\writer.txt");
BufferedReader br=new BufferedReader(fr);
//2读取
//创建缓冲区
char[] buf=new char[1024];
int count=0;
while ((count= br.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
br.close();
}
//第二种读取方式,按行读
public static void test1() throws Exception{
//1创建缓冲流
FileReader fr=new FileReader("E:\\study_file\\Java\\demo\\IOTest\\writer.txt");
BufferedReader br=new BufferedReader(fr);
String line=null;
while ((line=br.readLine())!=null){
System.out.println(line);
}
}
}
package com.jjl.IO;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class Demo13 {
public static void main(String[] args) throws Exception {
test();
}
public static void test() throws Exception{
//创建BufferedWrite对象
FileWriter fw=new FileWriter("E:\\study_file\\Java\\demo\\IOTest\\Bwriter.txt");
BufferedWriter bw=new BufferedWriter(fw);
//写入
for(int i=0;i<10;i++){
bw.write("好好学习天天向上");
bw.newLine();//换行,写入一个换行符
bw.flush();
}
bw.close();
System.out.println("run over!");
}
}
package com.jjl.IO;
import java.io.PrintWriter;
public class Demo14 {
public static void main(String[] args) throws Exception{
test();
}
public static void test() throws Exception{
//1创建打印流
PrintWriter pw=new PrintWriter("E:\\study_file\\Java\\demo\\IOTest\\print.txt");
pw.println(97);
pw.println(true);
pw.print(3.51);
pw.print("sdf");
pw.close();
System.out.println("Run.over!");
}
}
package com.jjl.IO;
import java.io.FileInputStream;
import java.io.InputStreamReader;
/*
使用InputStreamReader读取文件、指定使用的编码
*/
public class Demo15 {
public static void main(String[] args) throws Exception{
test();
}
public static void test() throws Exception{
//创建InputStreamReader对象
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\print.txt");
InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
//2读取文件
int data=0;
while ((data=isr.read())!=-1){
System.out.print((char)data);
}
//关闭
isr.close();
}
}
package com.jjl.IO;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Demo16 {
public static void main(String[] args) throws Exception {
test();
}
public static void test() throws Exception{
//1创建OutputStreamWriter
FileOutputStream fos=new FileOutputStream("E:\\study_file\\Java\\demo\\IOTest\\print1.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos,"gbk");
//2写入
for(int i=0;i<10;i++){
osw.write("中江挂面\n");
osw.flush();
}
osw.close();
System.out.println("run over!");
}
}
方法名 | 说明 |
---|---|
createNewFile() | 创建一个新文件 |
mkdir() | 创建一个新目录 |
delete() | 删除文件或空目录 |
exists() | 判断File对象所对象所代表的对象是否存在 |
getAbsolutePath() | 获取文件的绝对路径 |
getName() | 取得名字 |
getParent() | 获取文件/目录所在的目录。 |
isDirectory () | 是否是目录 |
isFile() | 是否是文件 |
length() | 获得文件的长度 |
listFiles() | 列出目录中的所有内容 |
renameTo() | 修改文件名为 |
package com.jjl.IO.File;
import java.io.File;
import java.io.IOException;
import java.util.Date;
/*
file类是的使用
(1)分隔符
(2)文件操作
(3)文件夹操作
*/
public class Demo01 {
public static void main(String[] args) throws IOException, InterruptedException {
test();
fileDo();
}
//(分隔符)
public static void test(){
System.out.println("路径分隔符"+ File.pathSeparator);
System.out.println("名称分隔符"+File.separator);
}
//文件操作
public static void fileDo() throws IOException, InterruptedException {
//1、创建文件
File file=new File("E:\\study_file\\Java\\demo\\IOTest\\file_test1.txt");//创建对象
if(!file.exists()){//判断文件是否存在
boolean b=file.createNewFile();//创建文件
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());
System.out.println("判断是否是文件"+file.isFile());
System.out.println("判断是否是隐藏"+file.isHidden());
}
}
package com.jjl.IO.File;
import java.io.File;
import java.util.Date;
public class Demo02 {
public static void main(String[] args) throws InterruptedException {
directory();
}
public static void directory() throws InterruptedException {
//1、创建文件夹
File dir=new File("E:\\study_file\\Java\\demo\\IOTest\\directory_test");
System.out.println(dir.toString());
if(!dir.exists()){
System.out.println("创建结果:"+dir.mkdir());//只能创建单级目录
//dir.mkdirs();//创建多级目录(递归创建)
}
//2、删除
//2.1直接删除
System.out.println("删除结果:"+dir.delete());//只能删除空目录
//2.2使用jvm退出时删除
dir.deleteOnExit();
Thread.sleep(5000);
//获取文件夹信息
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()));
//判断
System.out.println("是否是文件夹:"+dir.isDirectory());
System.out.println("是否是隐藏:"+dir.isHidden());
//遍历文件夹(获取文件夹里面的内容)
File dir2=new File("E:\\study_file\\Java\\demo");
String[] files=dir2.list();
for (String string:files){
System.out.println(string);
}
}
}
package com.jjl.IO.File;
import java.io.File;
import java.io.FileFilter;
/*
筛选出目录下的图片文件
*/
public class Demo03 {
public static void main(String[] args) {
test();
}
public static void test(){
File dir=new File("F:\\weicat\\WeChat Files\\wxid_flwgymfj3m6w22\\FileStorage\\Video\\2022-04");
File[] files=dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.getName().endsWith(".jpg")){
return true;
}
return false;
}
});
for (File file:files){
System.out.println(file.getName());
}
}
}
递归遍历文件夹,递归删除文件夹
package com.jjl.IO.File;
import java.io.File;
/*
递归遍历文件夹
递归删除文件夹
*/
public class Demo04 {
public static void main(String[] args) {
//遍历
listDir( new File("E:\\study_file\\Java"));
//删除
delDir(new File("E:\\study_file\\Java\\demo\\IOTest\\directory_test"));
}
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.getAbsoluteFile());
}
}
}
}
public static void delDir(File dir){
File[] files=dir.listFiles();
//System.out.println(dir.getAbsolutePath());
if(files!=null&&files.length>0){
for (File file:files){
if (file.isDirectory()){
delDir(file);
}else {
//删除文件
file.delete();
}
}
}
//删除文件夹
dir.delete();
}
}
package com.jjl.IO.Properties;
import java.io.*;
import java.util.Properties;
import java.util.Set;
import static java.lang.System.out;
public class Demo01 {
public static void main(String[] args) throws IOException {
test();
test2();
}
public static void test() throws IOException {
//1、创建集合
Properties properties=new Properties();
//2、添加数据
properties.setProperty("username","zhangsan");
properties.setProperty("age","20");
out.println(properties);
//3、遍历
//3.1------keyset-----
//3.2----entryset-----
//3.3-----stringPropertyNames()-------
Set<String> pronames=properties.stringPropertyNames();
for (String pro:pronames){
out.println(pro+":"+properties.getProperty(pro));
}
//4和流有关的方法
//----------list方法-----------
PrintWriter pw=new PrintWriter("E:\\study_file\\Java\\demo\\IOTest\\properties.txt");
properties.list(pw);
pw.close();
//保存
//-------store方法---------
FileOutputStream fos=new FileOutputStream("E:\\study_file\\Java\\demo\\IOTest\\store.peroperties");
properties.store(fos,"注释");
}
//加载
public static void test2() throws IOException {
//--------load方法-----
Properties properties=new Properties();
FileInputStream fis=new FileInputStream("E:\\study_file\\Java\\demo\\IOTest\\store.peroperties");
properties.load(fis);
fis.close();
out.println(properties.toString());
}
}