当前位置:   article > 正文

JAVA 中InputStream和OutputStream的基本使用

inputstream和outputstream

1.JAVA IO的基本概念

java IO流,对数据流进行输入输出,其中输入流的抽象类为InputStream,其抽象方法read()可以将数据读入到内存中,输出流的抽象类为OutputStream,其抽象方法write()可将数据流写出。

2.InputStream 字节输入流的使用

inputStream主要方法只有read(),读取字节文件到buf内存中,值得注意的是会中文乱码,所以需要自己转GBK或者UTF-8,当buf过小的时候会分多次读入到buf中,available() 方法可以返回文件长度,但是如果文件过大,会占用很大的内存,所以慎用。

  1. FileInputStream in = new FileInputStream("D:\\test\\abc.txt");
  2. byte[] buf = new byte[1024];
  3. int len;
  4. while ((len = in.read(buf)) != -1) {
  5. String s = new String(buf, 0,len,"GBK");
  6. System.out.println(s);
  7. }
  8. in.close();

3.OutputStream字节输出流的使用

OutputStream核心方法write(),将数据流写出。

  1. FileInputStream in = new FileInputStream("D:\\test\\abc.txt");
  2. FileOutputStream out = new FileOutputStream("D:\\test\\cba.txt");
  3. byte[] buf = new byte[1024];
  4. int len;
  5. //循环写入buf中
  6. while ((len = in.read(buf)) != -1) {
  7. out.write(buf,0,len);
  8. }
  9. in.close();
  10. out.close();

4.Reader字符输入流的使用

Reader是在InputStream基础上提供了字符转码的功能,其还是调用inputStream,这字符流很好的解决了中文乱码的问题。

  1. FileReader fileReader = new FileReader("D:\\test\\abc.txt");
  2. int len;
  3. char[] buf = new char[1024];
  4. while ((len = fileReader.read(buf)) != -1) {
  5. String s = new String(buf, 0,len);
  6. System.out.println(s);
  7. }
  8. fileReader .close();

5.Writer字符输出流的使用

Writer需要调用flush()才能将数据流写出到指定文件。

  1. FileReader fileReader = new FileReader("D:\\test\\abc.txt");
  2. FileWriter out = new FileWriter("D:\\test\\cba.txt");
  3. int len;
  4. char[] buf = new char[1024];
  5. while ((len = fileReader.read(buf)) != -1) {
  6. out.write(buf,0,len);
  7. }
  8. //需要手动 out.flush(),close 包含了
  9. out.close();
  10. fileReader.close();

6.BufferedReader和BufferedWriter的使用

上面的代码我都是手动去创建一个buf缓存内存,去存储临时数据流,比较麻烦,而BufferedReaderBufferedWriter就帮我解决了这个临时数据存储的问题,不需要手动创建一个临时的数据缓存,同提供了一行一行去读取数据readLien()方法。

  1. BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\test\\abc.txt"));
  2. String str = null;
  3. while ((str = bufferedReader.readLine()) != null){
  4. System.out.println(str);
  5. }
  1. BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\test\\abc.txt"));
  2. Stream<String> lines = bufferedReader.lines();
  3. lines.forEach(System.out::println);
  1. BufferedReader in = new BufferedReader(new FileReader("D:\\test\\abc.txt"));
  2. BufferedWriter out = new BufferedWriter(new FileWriter("D:\\test\\cba.txt"));
  3. int len ;
  4. char [] buf = new char[1024];
  5. while ((len = in.read(buf)) != -1){
  6. out.write(buf,0,len);
  7. }
  8. in.close();
  9. out.close();

7.需求:需求有两个大文件A 和 B 在 test文件夹中,将这两个大文件A 移动到 a文件夹中,B 移动到 b文件夹中

  1. {
  2. HashMap<String, String> pathMap = new HashMap<>(16);
  3. pathMap.put("D:\\test\\A.rar", "D:\\test\\a\\A.rar");
  4. pathMap.put("D:\\test\\B.rar", "D:\\test\\b\\B.rar");
  5. ExecutorService threadPool = Executors.newFixedThreadPool(2);
  6. System.out.println("主线程开始工作...");
  7. //使用多线程去处理,不影响主线程的工作
  8. pathMap.entrySet().forEach(entry -> {
  9. threadPool.submit(() -> {
  10. String key = entry.getKey();
  11. String value = entry.getValue();
  12. FileInputStream in = null;
  13. FileOutputStream out = null;
  14. long startTime = System.currentTimeMillis();
  15. System.out.println(Thread.currentThread().getName() + "线程搬运工 开始搬运" + key);
  16. try {
  17. in = new FileInputStream(key);
  18. out = new FileOutputStream(value);
  19. byte[] buf = new byte[1024];
  20. int len;
  21. while ((len = in.read(buf)) != -1) {
  22. out.write(buf, 0, len);
  23. }
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. } finally {
  27. try {
  28. if (in != null) {
  29. in.close();
  30. }
  31. if (out != null) {
  32. out.close();
  33. }
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. long endTime = System.currentTimeMillis();
  39. System.out.println(Thread.currentThread().getName() + "线程搬运工 搬运结束" + " 总耗时: " + (endTime - startTime) + " ms");
  40. //删除文件
  41. File file = new File(key);
  42. file.delete();
  43. });
  44. });
  45. System.out.println("主线程结束工作...");
  46. }

 

 

8.相关链接:

Java IO(非常详细)_一枚深蓝的博客-CSDN博客_io java

Java IO学习整理 - 知乎

CSDN

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/147155
推荐阅读
相关标签
  

闽ICP备14008679号