美文网首页
Java 文件读写

Java 文件读写

作者: 丿星纟彖彳亍 | 来源:发表于2020-09-29 13:36 被阅读0次

内容太乱,请移步:Java中的File类和IO流

文件类的继承关系.png

1、File类

File类与FileInputStream类的区别:
FileInputStream类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
File不属于文件流,只能代表一个文件或是目录的路径名而已。
详见:https://www.jianshu.com/p/5c2f50a8e874

2、FileInputStream类

以字节为单位(非unicode)的流处理。字节序列即:二进制数据。与编码无关,不存在乱码问题。
FileInputStream类的主要方法有:
Read(),read(byte[] b),read(byte[],int off,int len),available();

FileInputStream类与FileReader类的区别:
FileInputStream:以字节流方式读取;FileReader:把文件转换为字符流读入;
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char(16位,unicode编码)数组或者String ,使用InputStream读取出来的是byte(8位)数组。

InputStreamReader可以将读入的stream转换成字符流方式,是stream和reader之间的桥梁,其子类是FileReader。

FileInputStream类以二进制输入/输出,I/O速度快且效率搞,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读;而FileReader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;

FileReader与InputStreamReader涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream以二进制方式处理,不会出现乱码现象.

FileInputStream是在Socket通讯时会用到很多,如将文件流以Stream的方式传向服务器!

3、FileReader类

与它的父类InputStreamReader的主要不同在于构造函数,当要指定编码方式时,必须使用InputStreamReader类;而FileReader构造函数的参数与FileInputStream同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader。

FileReader fr = new FileReader("ming.txt"); 
   char[] buffer = new char[1024]; 
   int ch = 0; 
  while((ch = fr.read())!=-1 ) 
  { 
   System.out.print((char)ch); 
  } 

4、InputStreamReader类

以文本格式输入/输出,可以指定编码格式;
主要方法: getEncoding(),read();

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt")); 
  while((ch = isr.read())!=-1) 
  { 
   System.out.print((char)ch); 
  } 

5、BufferedReader类

BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt"))); 
   String data = null; 
   while((data = br.readLine())!=null) 
   { 
    System.out.println(data); 
   } 

6、BufferedInputStream类

BufferedInputStream必须传入一个InputStream(一般是FileInputStream)
常用方法:

  • public int read();//从该输入流中读取一个字节
  • public int read(byte[] b,int off,int len);//从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。

示例:

/**
 * BufferedInputStream:缓冲输入流
 * FileInputStream:文件输入流
 */
public class FileReadToString {
    public static void main(String[] args){
        try {
            FileInputStream fis=new FileInputStream("WynnNi.txt");
            BufferedInputStream bis=new BufferedInputStream(fis);
            String content=null;
             //自定义缓冲区
            byte[] buffer=new byte[10240];
            int flag=0;
            while((flag=bis.read(buffer))!=-1){
                content+=new String(buffer, 0, flag);
            }
            System.out.println(content);
            //关闭的时候只需要关闭最外层的流就行了
            bis.close();
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
}

7、BufferedOutputStream类

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

常用方法:

  • public void write(int b);//向输出流中输出一个字节。
  • public void write(byte[] b,int off,int len); //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
  • public void flush();//刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。

示例:

/**
 * BufferedOutputStream:缓冲输出流
 * FileOutPutStream:文件输出流
 */
public class StringOutPutToFile {
    public static void main(String[] args){
        try {
            FileOutputStream fos=new FileOutputStream("WynnNi.txt");
            BufferedOutputStream bos=new BufferedOutputStream(fos);
            String content="xxxxxxxxx!";
            bos.write(content.getBytes(),0,content.getBytes().length);
            bos.flush();
            bos.close();
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
}

3、实际应用

被调用方如何将文件传输给调用方并在本地输出文件

1、被调用方将文件读入缓冲区byte[]

2、将缓冲区数据转换成String传递,String str = Base64.getEncoder().encodeToString(bytes);

3、接收方将String反转为byte[],bytes=Base64.getDecoder().decode(str);

4、接收方将缓冲区输出到文件

3.1 文件简单读写

public class ReadFile {
    public static void main(String[] args) {
        File file = new File("new Hello.txt");
        if(file.exists()){
            System.err.print("exsit");
            try (FileInputStream fis = new FileInputStream(file)) {//文件输入流 这是字节流

                InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//inputstreamReader是一个字节流,将字节流和字符流转化的时候,就需要制定一个编码方式,不然就会乱码
                BufferedReader br = new BufferedReader(isr);//字符缓冲区

                String line;
                while((line = br.readLine())!=null){//这里将缓冲区里的内容如果非空就读出来打印
                    System.out.println(line);
                }
                br.close();//最后将各个线程关闭
                isr.close();
                fis.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        File newfile = new File("newtext.txt");
        try {
            FileOutputStream fos = new FileOutputStream(newfile);//这里如果文件不存在会自动创建文件
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");//和读取一样这里是转化的是字节和字符流
            BufferedWriter bw = new BufferedWriter(osw);//这里是写入缓冲区

            bw.write("厉害了我的哥");//写入字符串

            bw.close();//和上面一样 这里后打开的先关闭 先打开的后关闭
            osw.close();
            fos.close();
            System.out.println("done");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

参考文档:

相关文章

  • 2018-01-31

    java中对文件的读写操作

  • Android 基础之文件和数据库

    Java 文件流 1. 字节流文件操作(读写)的代码 2. 字符流文件操作(读写)的代码 3. 按行(读写)的代码...

  • 数据存储与访问之——文件存储读写

    1.Android文件的操作模式 在java中要想对文件做读写操作,只需创建 文件,读写数据即可,Android却...

  • java文件读写

    源文章Java学习之IO流上(字符流: FileReader FileWriter BuffereedRead...

  • Java 读写文件

    向文件中写入内容 一次性把内容输入。 想要按需要依次输入就可以在上面的代码的基础上使用pw.print()或pw....

  • Java文件读写

    1.知识点 读文件 写文件 释放文件资源 如何优雅的遍历 finally的用法 2.代码 功能代码 测试代码 3....

  • java读写文件

    java的IO体系的api是十分完整的,可以提供各个场景下面的使用,下面介绍常见的javaIO的api的使用。 写...

  • Java 文件读写

    内容太乱,请移步:Java中的File类和IO流[https://blog.csdn.net/qq_3930444...

  • java 读写文件

    用Apache POI读excel(.xlsx)文件 用Apache POI写excel(.xlsx)文件 使用J...

  • java读写文件

    读文件 写文件

网友评论

      本文标题:Java 文件读写

      本文链接:https://www.haomeiwen.com/subject/jsgduktx.html