Java中的I/O流

举报
谢公子 发表于 2021/11/18 22:47:13 2021/11/18
【摘要】 目录 I/O流 输入流(FileInputStream) 字节流的读取 字符流的读取 输出流(OutputStream) 带缓冲区的输入输出流(BufferedInput/OutputStream) I/O流 I/O流是数据传送的通道,I/O流分为输入流(Input)和输出流(Ouput)。程序从外部读取称为输入(In...

目录

I/O流

输入流(FileInputStream)

字节流的读取

字符流的读取

输出流(OutputStream)

带缓冲区的输入输出流(BufferedInput/OutputStream)


I/O流

I/O流是数据传送的通道,I/O流分为输入流(Input)和输出流(Ouput)。程序从外部读取称为输入(Input),程序向外部写成为输出(Output)。

  • Java.io 包中几乎包含了所有操作 输入、输出需要的类。所有这些类代表了输入源和输出目标。
  • Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

根据操作类型的不同可以分为:字节流 和 字符流

输入流(FileInputStream)

父类:InputStream

常用的字节输入流:FileInputStream ,继承于InputStream


  
  1. File file = new File("1.txt");
  2. FileInputStream ff = new FileInputStream(file);

如果要读取的文件不存在,会报错: java.io.FileNotFoundException 

字节流的读取

read()方法,读取一个字节,返回该字节的值,如果到达文件末尾,则返回-1。read()方法和迭代器一样,会自动下移。

字符流的读取

read(byte[])方法,从输入流中读取至多一个数组长度的内容,如果到达文件末尾,则返回-1。read()方法和迭代器一样,会自动下移。

  • 数组称为缓冲区数组,大小一般取值为1024的整数倍。
  • 转换为字符时,使用String(byte [ ]   bytes,int offset,int length)
  • available()没有读取的剩余字节数,如果该文件还从未被读取,就返回该文件的长度。
  • close() 关闭流并释放资源

  
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. public class Main {
  5. public static void main(String[] args) throws IOException {
  6. File file = new File("1.txt");
  7. System.out.println("读取字节流的第一个字符:");
  8. FileInputStream ff = new FileInputStream(file);
  9. int a = ff.read(); //读取的是1.txt文件的第一个字符的ascii值
  10. System.out.println(a);
  11. ff.close();
  12. //字节流的循环读取
  13. System.out.println("读取字节流:");
  14. FileInputStream mm = new FileInputStream(file);
  15. int b;
  16. while( (b=mm.read())!=-1){
  17. System.out.print(b+"-");
  18. }
  19. System.out.println("");
  20. mm.close();
  21. //字符流的循环读取
  22. System.out.println("读取字符流:");
  23. FileInputStream nn = new FileInputStream(file);
  24. byte[] by = new byte[1024];
  25. int c;
  26. while((c= nn.read(by))!=-1){
  27. String str = new String(by,0,c);
  28. System.out.println(str);
  29. }
  30. nn.close();
  31. }
  32. }

输出流(OutputStream)

父类:OutputStream

常用的字节输出流:FileOutputStream ,OutputStream


  
  1. File file = new File("1.txt");
  2. //覆盖
  3. FileOutputStream ff = new FileOutputStream(file,false);
  4. //追加
  5. FileOutputStream ff = new FileOutputStream(file,true);

如果父目录不存在,会报FileNotFoundException异常,如果父目录存在,会创建一个新的文件,如果此时已经有文件存在,会覆盖原文件

常用方法:


  
  1. //向文件中写入一个字节的值
  2. write(int x)
  3. //向文件中写入一个数组的数据
  4. write(byte[])
  5. //将偏移量为offset的索引位置长度为len的数据写入文件中
  6. write(byte[],offset,len)
  7. //关闭该输出流
  8. close()

示例代码


  
  1. import java.io.*;
  2. public class Main {
  3. public static void main(String[] args) throws IOException {
  4. File file = new File("1.txt"); //如果本目录下无1.txt文件,则会新建一个1.txt文件
  5. //覆盖
  6. FileOutputStream ff = new FileOutputStream(file,false);
  7. ff.write("hello,word!".getBytes());
  8. ff.close();
  9. //追加
  10. FileOutputStream fff = new FileOutputStream(file,true);
  11. fff.write("\n".getBytes()); //写入换行符
  12. fff.write("加油,中国!".getBytes());
  13. fff.close();
  14. //文件复制,将1.txt的内容复制到2.txt内容去
  15. FileInputStream aa = new FileInputStream(file);
  16. FileOutputStream bb = new FileOutputStream(new File("2.txt"));
  17. byte[] cc = new byte[1024];
  18. int count;
  19. while((count=aa.read(cc))!=-1){
  20. bb.write(cc,0,count);
  21. }
  22. aa.close();
  23. bb.close();
  24. }
  25. }

 带缓冲区的输入输出流(BufferedInput/OutputStream)

带缓冲区的输入输出流读写文件速度快于字节流,java 上提供了专门带缓冲区的字节流,用以提高读写速度。

BufferedInputStream / BufferedOutputStream 带缓冲区的字节输入 / 输出流

代码:


  
  1. import java.io.*;
  2. public class Main {
  3. public static void main(String[] args) throws IOException {
  4. //读取
  5. File f = new File("1.txt");
  6. //读取字节
  7. BufferedInputStream fff = new BufferedInputStream(new FileInputStream(f));
  8. int b;
  9. while( (b=fff.read())!=-1){
  10. System.out.print(b+"-");
  11. }
  12. System.out.println("");
  13. //读取字符
  14. BufferedInputStream mmm = new BufferedInputStream(new FileInputStream(f));
  15. byte[] by = new byte[1024];
  16. int c;
  17. while((c= mmm.read(by))!=-1){
  18. String str = new String(by,0,c);
  19. System.out.println(str);
  20. }
  21. //写入字符
  22. File f2 = new File("2.txt");
  23. BufferedOutputStream nnn = new BufferedOutputStream(new FileOutputStream(f2,false));
  24. nnn.write("hello,word".getBytes());
  25. nnn.close();
  26. BufferedOutputStream ppp = new BufferedOutputStream(new FileOutputStream(f2,true));
  27. ppp.write("\n".getBytes()); //写入换行符
  28. ppp.write("加油,中国!".getBytes());
  29. ppp.close();
  30. //文件复制
  31. BufferedInputStream rrr = new BufferedInputStream(new FileInputStream(f2));
  32. BufferedOutputStream qqq = new BufferedOutputStream(new FileOutputStream(new File("3.txt")));
  33. byte[] cc = new byte[1024];
  34. int count;
  35. while((count=rrr.read(cc))!=-1){
  36. qqq.write(cc,0,count);
  37. }
  38. rrr.close();
  39. qqq.close();
  40. }
  41. }

参考文章:JAVA中IO流详解

相关文章:Java文件系统操作

文章来源: xie1997.blog.csdn.net,作者:谢公子,版权归原作者所有,如需转载,请联系作者。

原文链接:xie1997.blog.csdn.net/article/details/107328377

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。