JAVA 中InputStream和OutputStream的基本使用

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

参考资源链接:[Java IO流文档:InputStreamOutputStream使用](https://wenku.csdn.net/doc/539zcsi7uy?utm_source=wenku_answer2doc_content) 在Java编程中,InputStreamOutputStream是处理数据输入输出的基础。理解它们的使用场景子类功能对于开发数据处理相关的应用程序至关重要。以下是对这两个抽象类及其主要子类的详细说明: 首先,InputStream是所有输入字节流的超类。它提供了一套通用的方法,用于从不同的数据源读取字节。其主要的子类包括: - `FileInputStream`:用于从文件系统中的文件中读取数据。 - `ByteArrayInputStream`:允许从一个字节数组中读取数据。 - `BufferedInputStream`:通过增加一个缓冲层来提高InputStream的读取效率。 - `DataInputStream`:提供了读取Java原始数据类型的方法。 而OutputStream是所有输出字节流的超类,它提供了一系列方法用于向不同的目的地写入字节。其主要的子类包括: - `FileOutputStream`:用于将数据写入文件系统中的文件。 - `ByteArrayOutputStream`:允许将数据写入一个字节数组。 - `BufferedOutputStream`:通过缓冲机制提高OutputStream的写入效率。 - `DataOutputStream`:提供了写入Java原始数据类型的方法。 使用场景: 1. 当需要从文件中读取或写入数据时,通常使用`FileInputStream``FileOutputStream`。 2. 如果需要处理内存中的数据,例如字节数组,可以使用`ByteArrayInputStream``ByteArrayOutputStream`。 3. 对于提高效率的场景,可以使用带有缓冲的流,如`BufferedInputStream``BufferedOutputStream`,这样可以减少物理读写操作的次数。 4. 当需要进行数据转换时,如数据类型转换或编码转换,可以使用`DataInputStream``DataOutputStream`。 5. 如果需要执行更复杂的I/O操作,可以使用`FilterInputStream``FilterOutputStream`来创建过滤流,如`CipherInputStream``CipherOutputStream`,用于加密解密数据。 掌握这些流的使用,可以帮助你高效地进行文件读写、网络通信等多种数据操作。如果你希望深入学习这些流类的具体使用方法最佳实践,可以参考《Java IO流文档:InputStreamOutputStream使用》。这本书提供了关于如何使用这些基本IO类以及如何将它们与其他高级I/O流类结合使用的详细教程示例,非常适合对Java I/O流感兴趣的开发者学习参考。 参考资源链接:[Java IO流文档:InputStreamOutputStream使用](https://wenku.csdn.net/doc/539zcsi7uy?utm_source=wenku_answer2doc_content)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值