Java 文件操作

文件操作

  • Java流简介

  • 文件File的使用

  • FileOutputStream和FileInputStream的使用

  • FileWriter和FileReader的使用

  • ObjectOutputStream和ObjectInputStream的使用

  • BufferedOutputStream和BufferedInputStream的使用

  • BufferedWriter和BufferedReader的使用

  • PrintStream和PrintWriter的使用

一.Java流(Stream)

  • Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

  • 流Stream,封装数据的写入写出,统一管理数据的写入和读取

  • 一个流可以理解为一个数据的序列。流的方向,参考的是自己的内存空间-代码的位置是内存空间。

  • 输出流:从内存空间将数据写到外部。

  • 输入流:将外部数据写到内存中。

粉红色是类型归纳,绿色是接口,黄色是类
  • 字节流类型通过byte[]数组,接受数据或者保存数据。

  • 字符流类型通过char[]数组,接受数据或者保存数据。

二.文件File

1.构造方法

//通过将给定的路径名字符串转换为抽象路径名来创建
File(String pathname)

//从父抽象路径名和子路径名字符串创建
File(File parent, String child)

//从父路径名字符串和子路径名字符串创建
File(String parent, String child)

//通过将给定的 file: URI转换为抽象路径名来创建
File(URL uri)

2.具体的方法

  • 测试此抽象路径名表示的文件或目录是否存在。
public boolean exists() 
  • 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
public boolean createNewFile() throws IOException
  • 测试此抽象路径名表示的文件是否为目录。
public boolean isDirectory()
  • 测试此抽象路径名表示的文件是否为普通文件。
public boolean isFile()
  • 删除由此抽象路径名表示的文件或目录。 如果此路径名表示目录,则目录必须为空才能删除。
public boolean delete()
  • 创建由此抽象路径名命名的目录。
public boolean mkdir() 
  • 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。请注意,如果此操作失败,它可能已成功创建一些必需的父目录。
public boolean mkdirs()
  • 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。如果此抽象路径名不表示目录,则此方法返回null 。
public File[] listFiles()
  • 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
public File[] listFiles(FilenameFilter filter)
  • 创建例子
String path = "G:/Android_Studio";

//方式1
File file = new File(path.concat("/1.txt"));
//方式2
File file = new File(path,"1.txt");

//判断是否存在
if (file.exists() == false){
   //不存在就创建
   file.createNewFile();
}

三.FileOutputStream和FileInputStream的使用

FileOutputStream

1.构造方法

第二个参数默认是false,写入是覆盖写入;true表示追加方式写入。

//创建文件输出流以指定的名称写入文件。
FileOutputStream(String name)

//创建文件输出流以指定的名称写入文件。
FileOutputStream(String name, boolean append)

// 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file)

//创建文件输出流以写入由指定的 File对象表示的文件
FileOutputStream(File file, boolean append)

2.写入数据方法

//将 b.length字节从指定的字节数组写入此文件输出流。
public void write(byte[] b) throws IOException

//从位于偏移量 off的指定字节数组写入 len字节到该文件输出流。
public void write(byte[] b  int off, int len) throws IOException

3.关闭连接方法

//关闭此文件输出流并释放与此流相关联的任何系统资源。 此文件输出流可能不再用于写入字节。
public void close() throws IOException         

4.清空流,把缓冲区的内容强制的写出

flush

FileInputStream

1.构造方法

//通过打开与实际文件的连接来创建一个 FileInputStream 
//该文件由文件系统中的路径名 name命名。
FileInputStream(String name)

// 通过打开与实际文件的连接创建一个 FileInputStream 
//该文件由文件系统中的 File对象 file命名。 
FileIntputStream(File file)

2.读取数据方法

//返回值是读取到缓冲区的总字节数;如果为-1,达到文件末尾 

//从该输入流读取最多b.length字节的数据到字节数组。
public int read(byte[] b) throws IOException

//从该输入流读取最多len字节的数据到字节数组,起始索引从off开始。
public int read(byte[] b int off,int len) throws IOException            

3.关闭连接方法

//关闭此文件输入流并释放与流相关联的任何系统资源。
// 如果该流具有相关联的信道,则该信道也被关闭。
public void close() throws IOException

FileOutputStream和FileInputStream的具体使用

String path = "G:/Android_Studio/AndroidStudioProjects/JavaCode/Java/src/main/java/swu/xl/day8/Base";
File file = new File(path.concat("/1.txt"));

//判断是否存在
if (file.exists() == false){
   //不存在就创建
   file.createNewFile();
}

//1.创建文件输出流对象
FileOutputStream fos = new FileOutputStream(file);
//2.调用write方法写入
byte[] bytes = {'a','b','c'};
fos.write(bytes);
//3.把缓冲区的内容强制写出,确保缓冲区没有东西
fos.flush();
//4.操作完毕需要关闭Stream对象
fos.close();

FileInputStream fis = new FileInputStream(file);
//2.调用read方法写入
byte[] names = new byte[12];
int count = fis.read(names);
fis.close();
System.out.println(count+" "+(new String(names)));

四.FileWriter和FileReader的使用

FileWriter

1.构造方法

第二个参数默认是false,写入是覆盖写入;true表示追加方式写入。

//构造一个给定文件名的FileWriter对象。
FileWriter(String fileName)

//构造一个给定文件名的FileWriter对象。
FileWriter(String fileName, boolean append)

//给一个File对象构造一个FileWriter对象。
FileWriter(File file)

//给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append)

2.写入数据方法

//写入字符数组
public void write(char[] cbuf) throws IOException

//写入字符数组的一部分。
public void write(char[] cbuf,int off,int len) throws IOException

// 写一个字符串
public void write(String str) throws IOException

// 写一个字符串的一部分。
public void write(String str, int off, int len) throws IOException

3.关闭连接方法

//关闭此文件输出流并释放与此流相关联的任何系统资源。 此文件输出流可能不再用于写入字节。
public void close() throws IOException         

4.清空流,缓冲区的内容强制的写出

flush

FileReader

1.构造方法

//创建一个新的 FileReader ,给定要读取的文件的名称。  
FileReader(String name)

//创建一个新的 FileReader ,给出 File读取。
FileIReader(File file)

2.读取数据方法

//将字符读入数组
public int read(char[] cbuf) throws IOException

//将字符读入数组的一部分。
public int read(char[] cbuf, int offset, int length) throws IOException

3.关闭连接方法

//关闭此文件输入流并释放与流相关联的任何系统资源。
// 如果该流具有相关联的信道,则该信道也被关闭。
public void close() throws IOException

FileWriter和FileReader的具体使用

String path = "G:/Android_Studio/AndroidStudioProjects/JavaCode/Java/src/main/java/swu/xl/day8/Base";
File file = new File(path.concat("/1.txt"));

//判断是否存在
if (file.exists() == false){
   //不存在就创建
   file.createNewFile();
}

//1.创建文件输出流对象
FileWriter fw = new FileWriter(file);
//2.调用write方法写入
char[] name = {'安','桌','开','发'};
fw.write(name);
//String string = new String("sac");
//fw.write(string);
//3.把缓冲区的内容强制写出,确保缓冲区没有东西
fw.flush();
//4.操作完毕需要关闭Stream对象
fw.close();

FileReader fr = new FileReader(file);
char[] book = new char[4];
count = fr.read(book);
fr.close();
System.out.println(count+" "+(new String(book)));

五.ObjectOutputStream和ObjectInputStream

  • ObjectOutputStreamObjectInputStream用于向文件中写入对象,类似于iOS的NSKeyedArchiverNSKeyedUnarchiver对数据的归档和解档。

  • 类比iOS对自定义的类创建出来的对象进行归档,我们需要先实现NSCoding协议

  • Java里面需要对自定义的类实现serializable接口实现序列化,该接口没有任何方法。

  • 如果自定义的类内部还有属性变量是其他自定义的类的对象,这个类也必须实现Seriablizable接口

  • ObjectOutputStreamObjectInputStream都需要传入一个OutputStreamInputStream类型的对象,它们是抽象类,所以使用子类FileOutputStreamFileInputStream来实现初始化。

具体使用

//序列化好的类
import java.io.Serializable;

public class Person implements Serializable {
   String name;
   int age;
}

//file和之前的例子相同

//具体写入
Person xw = new Person();
xw.name = "小王";
xw.age = 18;
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(xw);
oos.close();

//具体读取
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Person xw = (Person) ois.readObject();
System.out.println(xw.name+" "+xw.age);
ois.close();

六.BufferedOutputStream和BufferedInputStream

  • BufferedOutputStreamBufferedInputStream类的构造函数都需要传入一个OutputStreamInputStream类型的对象,它们是抽象类,所以使用子类FileOutputStreamFileInputStream来实现初始化。

  • 数据覆盖写入的意思是下一次运行写入是覆盖写入,RandomAccessFile有类似于C语言文件操作中 seek,如果你想要可以读取文件的任意位置可以使用它。

具体使用:将图片复制到指定位置。

//1.源文件的路径
String sourcePath = "C:/Users/a2867/Desktop/壁纸/1.jpg";
//2.目标文件的路径
String desPath = "C:/Users/a2867/Desktop/1.jpg";

FileInputStream fis = new FileInputStream(sourcePath);
BufferedInputStream bis = new BufferedInputStream(fis);

FileOutputStream fos = new FileOutputStream(desPath);
BufferedOutputStream bos = new BufferedOutputStream(fos);

byte[] in = new byte[1024];
int count = 0;

while((count = bis.read(in)) != -1){
   bos.write(in,0,count);
}

bis.close();
bos.flush();
bos.close();

七.BufferedWriter和BufferedReader的使用

  • BufferedWriterBufferedReader类的构造函数都需要传入一个OutputStreamWriterInputStreamReader类型的对象。

  • OutputStreamWriterInputStreamReader类的构造函数都需要传入一个OutputStreamInputStream类型的对象。

  • public readLine() throws IOException 读一行文字。 一行被视为由换行符('\ n'),回车符('\ r')中的任何一个或随后的换行符终止。

具体使用:将图片复制到指定位置。

//1.源文件的路径
String sourcePath = "C:/Users/a2867/Desktop/壁纸/1.jpg";
//2.目标文件的路径
String desPath = "C:/Users/a2867/Desktop/1.jpg";

FileInputStream fis = new FileInputStream(sourcePath);
BufferedReader bis = new BufferedReader(new InputStreamReader(fis));

FileOutputStream fos = new FileOutputStream(desPath);
BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(fos));

char[] in = new char[1024];
int count = 0;

while((count = bis.read(in)) != -1){
   bos.write(in,0,count);
}

bis.close();
bos.flush();
bos.close();

//结果不对,对于这种图片,视频等操作建议使用字节流方式,不然很可能出错

具体使用:读取控制台输入(Java 的控制台输入由 System.in 完成)

public class BRReadLines {
   public static void main(String args[]) throws IOException {
       // 使用 System.in 创建 BufferedReader
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       String str;
       System.out.println("Enter lines of text.");
       System.out.println("Enter 'end' to quit.");
       do {
           str = br.readLine();
           System.out.println(str);
       } while (!str.equals("end"));
   }
}

输出:
Enter lines of text.
Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
end
end

八.PrintStream和PrintWriter的使用

PrintStream

  • Java的控制台的输出由 print()println()完成。这些方法都由类 PrintStream定义,System.out是该类对象的一个引用。

  • PrintStream继承了OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

  • write()方法不经常使用,因为print()println()方法用起来更为方便。

  • format()使用指定的格式字符串和参数将格式化的字符串写入此输出流。

  • append()将指定的字符或者字符序列附加到此输出流。

  • checkError()刷新流并检查其错误状,因为该输出流不会抛异常。

  • clearError()清除此流的内部错误状态。。

  • flush()刷新流。

  • close()关闭流。

具体使用:向控制台输出

public class WriteDemo {
   public static void main(String args[]) {
       int b;
       b = 'A';
       System.out.write(b);
       System.out.write('\n');
   }
}

输出:
A

PrintWriter

  • 构造方法:public PrintWriter(Writer out,boolean autoFlush)

  • 其他方法和PrintStream类似

PrintStream和PrintWriter的区别

  • PrintStream操纵的是字节流,PrintWriter操纵的是字符流。

  • PrintStream在遇到换行符的时候就会自动刷新,即在调用了println()方法,或者文本中出现“\n”,就会自动flush。

  • PrintWriter需要在构造方法中设置自动刷新,或者手动flush。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容