JAVA 中InputStream和OutputStream的基本使用

7 篇文章 0 订阅
5 篇文章 0 订阅

1.JAVA IO的基本概念

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

2.InputStream 字节输入流的使用

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

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

3.OutputStream字节输出流的使用

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

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

4.Reader字符输入流的使用

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

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

5.Writer字符输出流的使用

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

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

6.BufferedReader和BufferedWriter的使用

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

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

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

{

    HashMap<String, String> pathMap = new HashMap<>(16);
    pathMap.put("D:\\test\\A.rar", "D:\\test\\a\\A.rar");
    pathMap.put("D:\\test\\B.rar", "D:\\test\\b\\B.rar");

    ExecutorService threadPool = Executors.newFixedThreadPool(2);
    System.out.println("主线程开始工作...");

    //使用多线程去处理,不影响主线程的工作
    pathMap.entrySet().forEach(entry -> {
        threadPool.submit(() -> {
            String key = entry.getKey();
            String value = entry.getValue();

            FileInputStream in = null;
            FileOutputStream out = null;
            long startTime = System.currentTimeMillis();
            System.out.println(Thread.currentThread().getName() + "线程搬运工 开始搬运" + key);
            try {
                in = new FileInputStream(key);
                out = new FileOutputStream(value);
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println(Thread.currentThread().getName() + "线程搬运工 搬运结束" + " 总耗时: " + (endTime - startTime) + " ms");
            //删除文件
            File file = new File(key);
            file.delete();
        });

    });
    System.out.println("主线程结束工作...");

}

 

 

8.相关链接:

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

Java IO学习整理 - 知乎

CSDN

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值