• JAVA 读写文件(InputStream,FileReader)


    目录

    什么是输入输出流

    字节流

    说明

    inputstream   outputstream

    使用总结:

    方法总结:

     FileOutputStream   FileInputStream

    字符流

    说明

    FileReader         FileWriter

    缓冲流

    说明

    读取文件

    复制文件(包含了写入文件) 

    性能比较


    什么是输入输出流

    输入流的话 就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,

    输出流则正好相反,是将数据从内存中的数据写入到各种输出设备(比如文件、显示器、磁盘等)。

    哈哈,是不是和你想的不一样那?不是问题记住就行了,加油&&

    字节流

    说明

    适用于所有的场景,也是最原始的读写操作

    inputstream   outputstream

    输出流                输入流(覆盖/追加)

    1. import java.io.*;
    2. import java.nio.charset.StandardCharsets;
    3. public static void FileReadWrite() {
    4. String path = "F:\\a.txt";
    5. //新建一个文件对象
    6. File file = new File(path);
    7. //文件读取
    8. try {
    9. //创建输入流((以内存为参照物)从文件输入到内存中叫输入流,相反为输出流),用于读取文件
    10. //如果你这里有疑惑看总结
    11. InputStream inputStream = new FileInputStream(file);
    12. //定义一个字节数组
    13. byte[] b = new byte[1024];
    14. //将文件读入b,如果读完后b数组没有满,则b的剩余位置用空格填充
    15. inputStream.read(b);
    16. //新建字符串对象,并指定编码方式
    17. String res = new String(b, StandardCharsets.UTF_8);
    18. //.trim()方法用于去除多余的空格
    19. System.out.println(res.trim());
    20. inputStream.close();
    21. } catch (FileNotFoundException e) {
    22. throw new RuntimeException(e);
    23. } catch (IOException e) {
    24. System.out.println(e.getMessage());
    25. }
    26. String path2 = "F://b.txt";
    27. File file2 = new File(path2);
    28. //写入
    29. //输出流(从内存输入到文件中)
    30. OutputStream out = null;
    31. try {
    32. //新建输出流对象
    33. //注意这里的FileOutputStream的弟2个参数为true时表示追加,反之为覆盖
    34. out = new FileOutputStream(file2, true);
    35. //写入文件的字符串
    36. String inputString = "测试一下爱";
    37. //以字节的方式写入
    38. out.write(inputString.getBytes());
    39. out.flush();
    40. out.close();
    41. } catch (Exception e) {
    42. System.out.println(e.getMessage());
    43. }
    44. //记得最终的释放
    45. finally {
    46. if (out != null) {
    47. try {
    48. out.close();
    49. }
    50. catch (Exception e)
    51. {
    52. System.out.println(e.getMessage());
    53. }
    54. }
    55. }

    使用总结:

    1 inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。

    2 inputstream类和outputstream类是输入输出字节用的类

    3 里面的各个方法都有可能会产生异常,记得try,catch包裹,或者使用断言

    方法总结:

    inputstream

    1. public abstract int read( )
    2. 读取一个byte的数据,返回值是高位补0int类型值。
    3. public int read(byte b[ ])
    4. 读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实上是调用下一个方法实现的
    5. public int read(byte b[ ], int off, int len)
    6. 从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
    7. public int available( )
    8. 返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
    9. public long skip(long n)
    10. 忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
    11. public int close( )
    12. 我们在使用完后,必须对我们打开的流进行关闭.

    OutputStream

    1. public void write(byte b[ ])
    2. 将参数b中的字节写到输出流。
    3. public void write(byte b[ ], int off, int len)
    4. 将参数b的从偏移量off开始的len个字节写到输出流。
    5. public abstract void write(int b)
    6. 先将int转换为byte类型,把低字节写入到输出流中。
    7. public void flush() :
    8. 将数据缓冲区中数据全部输出,并清空缓冲区。
    9. public void close() :
    10. 关闭输出流并释放与流相关的系统资源。

     FileOutputStream   FileInputStream

    1. public static void FileOutput_InputStream()
    2. {
    3. String Path="F://a.txt";
    4. //输出流
    5. try {
    6. FileInputStream input=new FileInputStream(Path);
    7. byte[] c_s=new byte[1024];
    8. try{
    9. if(input.read(c_s)==-1)
    10. {
    11. System.out.println("文件读取完毕");
    12. }
    13. input.close();
    14. }
    15. catch (Exception e)
    16. {
    17. System.out.println(e.getMessage());
    18. }
    19. String res = new String(c_s, StandardCharsets.UTF_8);
    20. System.out.println(res.trim());
    21. } catch (FileNotFoundException e) {
    22. throw new RuntimeException(e);
    23. }
    24. //输入流
    25. FileOutputStream fos=null;
    26. try {
    27. //依然两种方法
    28. fos = new FileOutputStream(Path,true);
    29. String inputString="测试FileOutputStream";
    30. try {
    31. fos.write(inputString.getBytes());
    32. System.out.println("写入完成");
    33. } catch (IOException e) {
    34. throw new RuntimeException(e);
    35. }
    36. } catch (FileNotFoundException e) {
    37. throw new RuntimeException(e);
    38. }
    39. finally {
    40. if (fos != null) {
    41. try {
    42. fos.close();
    43. }
    44. catch (IOException e) {
    45. System.out.println(e.getMessage());
    46. }
    47. }
    48. }
    49. }

    字符流

    说明

    适用于文本文件的读写呀,速度也很快

    FileReader         FileWriter

    输出流                输入流(覆盖/追加)

    1. import java.io.FileWriter;
    2. import java.io.FileReader;
    3. public static void FZ_FileReadWrite() {
    4. //以字符的方式写入
    5. FileWriter fw = null;
    6. String Path = "F://a.txt";
    7. try {
    8. //同上面的字节写入一样,加true为追加
    9. fw = new FileWriter(Path,true);
    10. String inputString = "写入要";
    11. fw.write(inputString);
    12. } catch (Exception e) {
    13. System.out.println(e.getMessage());
    14. }
    15. finally {
    16. if (fw != null) {
    17. try {
    18. fw.close();
    19. } catch (Exception e) {
    20. System.out.println(e.getMessage());
    21. }
    22. }
    23. }
    24. //文件读出
    25. FileReader fd=null;
    26. try {
    27. fd=new FileReader(Path);
    28. char[] reader=new char[1024];
    29. try {
    30. //返回值为非空格字符个数
    31. int length=fd.read(reader);
    32. System.out.println("实际字有:"+length);
    33. //新建拼接字符串
    34. StringBuilder stringBuilder=new StringBuilder();
    35. //将非空格字符拼接
    36. for (int i = 0; i < length;i++) {
    37. stringBuilder.append(reader[i]);
    38. }
    39. System.out.println(stringBuilder.toString());
    40. } catch (IOException e) {
    41. throw new RuntimeException(e);
    42. }
    43. } catch (FileNotFoundException e) {
    44. throw new RuntimeException(e);
    45. }
    46. }

    缓冲流

    说明

    这是最常用的,性能也不错的读写方式呀!

    读取文件

    1. public static void Buffer_()
    2. {
    3. String path="F:\\JAVA EE Preject\\untitled2\\KotlinPratice\\src\\helloworld.kt";
    4. //可以看出是越封装越深入
    5. try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path)))){
    6. String printString;
    7. //每次读一行
    8. while ((printString=bufferedReader.readLine())!=null)
    9. {
    10. //每次输出一行
    11. System.out.println(printString);
    12. }
    13. }
    14. catch (Exception e) {
    15. System.out.println("搓搓");
    16. }
    17. }

    复制文件(包含了写入文件) 

    1. public static void copyFile()
    2. {
    3. String path1="F:\\JAVA EE Preject\\untitled2\\KotlinPratice\\src\\helloworld.kt";
    4. String path="F:\\JAVA EE Preject\\untitled2\\KotlinPratice\\src\\helloworld.txt";
    5. try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path1)));
    6. BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(path))))) {
    7. String line;
    8. while ((line = bufferedReader.readLine()) != null)
    9. {
    10. bufferedWriter.write(line+"\r\n");
    11. }
    12. }
    13. catch (Exception e)
    14. {
    15. System.out.println("踩踩踩");
    16. }
    17. }

    性能比较

    文件大小读写方式耗时
    30M普通文件流50-60 ms
    缓存流32-35 ms
    随机文件方式40-50 ms
    内存映射文件50-60 ms
    461M普通文件流1300-2300 ms
    缓存流1700-2000 ms
    随机文件方式1300-3000 ms
    内存映射文件890-1000 ms
    1.47G普通文件流11s
    缓存流9s
    随机文件方式10s
    内存映射文件3s(首次较慢)
  • 相关阅读:
    做百度百科需要什么资料,怎么创建产品类百度百科词条
    七天学会C语言-第一天(C语言基本语句)
    图纸管理制度 《五》
    【网络协议】IP
    springboot+jsp球队球员比赛数据管理系统java
    图像语义分割概述
    Spring Boot之容器功能
    Node.js 使用 officecrypto-tool 读取加密的 Excel (xls, xlsx) 和 Word( docx)文档
    java计算机毕业设计景区在线购票系统源码+系统+mysql数据库+lw文档+部署
    java.lang.Float类下toString()方法具有什么功能呢?
  • 原文地址:https://blog.csdn.net/qq_53679247/article/details/126778337