码迷,mamicode.com
首页 > 编程语言 > 详细

Java 输入输出流,Java InputStream FileInputStream OutputStream FileOutputStream

时间:2021-04-21 12:36:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:文件的   buffere   string   nal   map   需要   流转   main   fileinput   

Java 输入输出流,Java InputStream FileInputStream OutputStream FileOutputStream

 

================================

?Copyright 蕃薯耀 2021-04-20

https://www.cnblogs.com/fanshuyao/

 

一、字节流和文件流使用,实现文件(适用所有文件)复制

InputStream、FileInputStream :获取源文件

OutputStream、FileOutputStream:输出目标文件

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Stream1FileStream {

    
    public static void fileInputStream() throws IOException {
        InputStream is = new FileInputStream("c:/img/0.png");
        OutputStream os = new FileOutputStream("c:/img/1.png");
        
        byte[] buffer = new byte[1024];
        int length;
        while((length = is.read(buffer)) != -1) {
            os.write(buffer, 0, length);
        }
        
        os.close();
        is.close();
        System.out.println("执行完成。");
    }
    
    public static void main(String[] args) throws IOException {
        fileInputStream();
    }
}

 

二、字节流和文件流使用,实现文件(文本文件)复制,无中文乱码问题

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Stream1FileStreamTxt {

    
    public static void fileInputStream() throws IOException {
        
        //字节流读取文件不会有中文乱码的问题
        InputStream is = new FileInputStream("c:/img/0.txt");
        OutputStream os = new FileOutputStream("c:/img/1-2.txt");
        
        byte[] buffer = new byte[20];
        int length;
        while((length = is.read(buffer)) != -1) {
            //System.out.println(new String(buffer, "GBK"));//这里直接输出会有中文乱码的问题(因为每次读取的字节数组存在将汉字分开的情况,这样就出现乱码,汉字不被分开就不会有乱码),但生成文件是没有中文乱码问题的
            os.write(buffer, 0, length);
        }
        
        os.close();
        is.close();
        System.out.println("执行完成。");
    }
    
    public static void main(String[] args) throws IOException {
        fileInputStream();
    }
}

 

三、ByteArrayOutputStream字节数组使用

ByteArrayOutputStream的作用就是将多次读取到的所有字节都缓存起来,最后一起输入,能解决中文被截断后出现乱码的问题

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Stream1FileStreamTxtByteArray {

    
    public static void fileInputStream() throws IOException {
        
        //字节流读取文件不会有中文乱码的问题
        InputStream is = new FileInputStream("c:/img/0.txt");//0.txt为GBK编码
        OutputStream os = new FileOutputStream("c:/img/1-3.txt");
        
        //将字节存储在ByteArrayOutputStream中,解决中文汉字截断后在控制台输出存在中文乱码的问题
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        
        byte[] buffer = new byte[20];
        int length;
        while((length = is.read(buffer)) != -1) {
            os.write(buffer, 0, length);
            byteArrayOutputStream.write(buffer, 0, length);
        }
        
        //System.out.println(byteArrayOutputStream.toString("GBK"));
        System.out.println(new String(byteArrayOutputStream.toByteArray(), "GBK"));//处理中文乱码,GBK编码设置,取决于文件的编码,如果不是UTF-8,就必须设置,不然会有乱码
        
        byteArrayOutputStream.close();
        
        os.close();
        is.close();
        System.out.println("执行完成。");
    }
    
    
    public static void fileInputStreamUtf8() throws IOException {
        
        //字节流读取文件不会有中文乱码的问题,但文件的编码一定要是UTF-8,不然在输出时就要指定相应的编码
        InputStream is = new FileInputStream("c:/img/utf8.txt");//utf8.txt为UTF-8编码
        OutputStream os = new FileOutputStream("c:/img/utf8-2.txt");
        
        //将字节存储在ByteArrayOutputStream中,解决中文汉字截断后在控制台输出存在中文乱码的问题
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        
        byte[] buffer = new byte[20];
        int length;
        while((length = is.read(buffer)) != -1) {
            os.write(buffer, 0, length);
            byteArrayOutputStream.write(buffer, 0, length);
        }
        
        System.out.println(byteArrayOutputStream.toString());
        
        byteArrayOutputStream.close();
        
        os.close();
        is.close();
        System.out.println("执行完成。");
    }
    
    public static void main(String[] args) throws IOException {
        //fileInputStream();
        fileInputStreamUtf8();
    }
}

 

四、字符流

字符流就是用来读取文件内容的,如txt,但这个一般都会有中文乱码

Reader、FileReader:输入

Writer、FileWriter:输出

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class Stream2FileReader {

    
    public static void fileInputStream() throws IOException {
        
        Reader r = new FileReader("c:/img/0.txt");//FileReader:直接使用会有中文乱码
        Writer w = new FileWriter("c:/img/2.txt");
        
        char[] buffer = new char[1024];
        int length = 0;
        while((length = r.read(buffer)) != -1) {
            System.out.println(new String(buffer));
            w.write(buffer, 0, length);
        }
        
        r.close();
        w.close();
        System.out.println("执行完成。");
    }
    
    public static void main(String[] args) throws IOException {
        fileInputStream();
    }
}

 

五、InputStreamReader:将字节流转换成字符流

将字节流转换成字符流,转换时,可以声明文件编码,解决中文乱码问题

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Stream3FileInputStreamReader {

    
    public static void fileInputStream() throws IOException {
        
        //使用转换流InputStreamReader解决中文乱码问题。InputStreamReader:将字节流inputStream转换成字符流Reader
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("c:/img/0.txt"), "GB2312");//InputStreamReader中的GB2312为具体文件的编码,默认是UTF-8的编码,不一致就会出现中文乱码
        
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("c:/img/3.txt"), "UTF-8");//生成新的文件,使用UTF-8编码
        
        char[] buffer = new char[1024];
        int length = 0;
        while((length = inputStreamReader.read(buffer)) != -1) {
            //System.out.println(new String(buffer));
            outputStreamWriter.write(buffer, 0, length);
        }
        
        outputStreamWriter.close();
        inputStreamReader.close();
        System.out.println("执行完成。");
    }
    
    public static void main(String[] args) throws IOException {
        fileInputStream();
    }
}

 

六、字节缓冲流

BufferedInputStream、BufferedOutputStream:加快文件输入输出,小文件影响不大,但大文件影响很明显。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Stream4FileStreamBufferStream {

    
    public static void fileInputStream() throws IOException {
        
        long start = System.currentTimeMillis();
        
        InputStream is = new FileInputStream("c:/img/00.mp4");
        OutputStream os = new FileOutputStream("c:/img/11.mp4");
        
        //缓冲流,加快文件输入输出
        BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(os);
        
        
        byte[] buffer = new byte[1024];
        int length;
        while((length = bufferedInputStream.read(buffer)) != -1) {
            bufferedOutputStream.write(buffer, 0, length);
        }
        
        bufferedOutputStream.close();
        bufferedInputStream.close();
        os.close();
        is.close();
        
        long end = System.currentTimeMillis();
        System.out.println("end - start=" + (end - start));//307 12767 14004
        System.out.println("执行完成。");
    }
    
    public static void fileInputStreamBuffer() throws IOException {
        long start = System.currentTimeMillis();
        
        InputStream is = new FileInputStream("c:/img/00.mp4");
        OutputStream os = new FileOutputStream("c:/img/22.mp4");
        
        //缓冲流,加快文件输入输出
        BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(os);
        
        
        byte[] buffer = new byte[1024];
        int length;
        while((length = bufferedInputStream.read(buffer)) != -1) {
            bufferedOutputStream.write(buffer, 0, length);
        }
        
        bufferedOutputStream.close();
        bufferedInputStream.close();
        os.close();
        is.close();
        
        long end = System.currentTimeMillis(); 
        System.out.println("end - start=" + (end - start));//276 4307 7262 7130
        System.out.println("执行完成。");
    }
    
    
    
    public static void main(String[] args) throws IOException {
        //fileInputStream();
        fileInputStreamBuffer();
    }
}

 

七、字符缓存流

BufferedReader、BufferedWriter

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Stream5BufferedReader {

    
    public static void fileInputStream() throws IOException {
        
        //使用转换流InputStreamReader解决中文乱码问题。InputStreamReader:将字节流inputStream转换成字符流Reader
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("c:/img/0.txt"), "GB2312");//InputStreamReader中的GB2312为文件的编码,默认是UTF-8的编码,不一致就会出现中文乱码
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("c:/img/5.txt"), "UTF-8");//生成新的文件,使用UTF-8编码
        
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        
        char[] buffer = new char[1024];
        int length = 0;
        while((length = bufferedReader.read(buffer)) != -1) {
            //System.out.println(new String(buffer));
            bufferedWriter.write(buffer, 0, length);
        }
        
        bufferedWriter.close();
        bufferedReader.close();
        outputStreamWriter.close();
        inputStreamReader.close();
        System.out.println("执行完成。");
    }
    
    public static void main(String[] args) throws IOException {
        fileInputStream();
    }
}

 

八、Java 数据流

DataInputStream、DataOutputStream

用于数据存储,类似map的键值对,而且读写顺序要一致。

省略。

.

九、Java 对象流

ObjectInputStream、ObjectOutputStream

用于在网络中实现对象的传输,对象需要实现序列化接口。

省略。

 

注:

示例代码只是往外抛异常,没有使用Try…Catch…Finally,是不对的,只是为了演示代码整洁,实际是要使用Try…Catch…Finally来关闭流。

 

技术图片

(如果文章对您有所帮助,欢迎捐赠,^_^)

 

================================

?Copyright 蕃薯耀 2021-04-20

https://www.cnblogs.com/fanshuyao/

 

Java 输入输出流,Java InputStream FileInputStream OutputStream FileOutputStream

标签:文件的   buffere   string   nal   map   需要   流转   main   fileinput   

原文地址:https://www.cnblogs.com/fanshuyao/p/14679868.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!