java----IO流:字符流

字节和字符的桥梁
package IO流.字符流;
/*
    InputStreamReader是从字节流到字符流的桥梁:
        它读取字节,并使用指定的charset将其解码为字符。
        它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

    OutputStreamWriter是从字符流到字节流的桥梁:
        使用指定的charset将写入的字符编码为字节。
        它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
 */

import java.io.*;

public class 字节和字符的桥梁 {
    public static void main(String[] args) throws IOException {
        //OutputStreamWriter​(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
        //OutputStreamWriter​(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("idea_text\\osw.txt"));
        osw.write("中国");
        osw.close();


        //InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。
        //InputStreamReader​(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
        InputStreamReader isr = new InputStreamReader(new FileInputStream("idea_text\\osw.txt"));
        //一次读取一个字符数据
        int ch;
        while ((ch = isr.read()) != -1) {
            System.out.println((char)ch);
        }

        isr.close();

    }
}
字符串中的编码解码问题
package IO流.字符流;
/*
字符串中的编码解码问题

    编码:
        byte[]getBytes():
        使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
        byte[]getBytes(String charsetName):
        使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

    解码:
        String(byte[]bytes):
        通过使用平台的默认字符集解码指定的字节数组来构造新的String
        String(byte[]bytes,String charsetName):
        通过指定的字符集解码指定的字节数组来构造新的String
 */


import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class 字符串中的编码解码问题 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //定义一个字符串
        String s="中国";

        //编码:
        //byte[]getBytes():
        byte[] bys=s.getBytes();//[-28, -72, -83, -27, -101, -67]
        //byte[]getBytes(String charsetName):
        byte[] bytes=s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
        byte[] bytess=s.getBytes("GBK");//[-42, -48, -71, -6]

//        System.out.println(Arrays.toString(bytess));


        //解码:
        //String(byte[]bytes):
        String ss=new String(bys);//中国
        //String(byte[]bytes,String charsetName):
        String sss=new String(bys,"UTF-8");//中国
        String ssss=new String(bys,"GBK");//涓浗


//        System.out.println(ssss);

    }
}

字符流写数据的5种方式
package IO流.字符流.字符流写数据的5种方式;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
        构造方法:
            OutputStreamWriter​(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。

        写数据的5种方式
            void write​(int c) 写一个字符
            void write​(char[] cbuf) 写一个字符数组。
            void write​(char[] cbuf, int off, int len) 写入字符数组的一部分。
            void write​(String str) 写一个字符串。
            void write​(String str, int off, int len) 写一个字符串的一部分。

            void close​() 关闭流,先刷新。
            void flush​() 刷新流。

 */
public class Demo {
    public static void main(String[] args) throws IOException {
        //OutputStreamWriter​(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("idea_text\\osw.txt"));
/*
        //void write​(int c) 写一个字符
        osw.write("97");//无显示

        //void flush​() 刷新流。
        osw.flush();//有显示97
        osw.write("98");
        osw.flush();
        osw.write("99");

        //释放资源
        osw.close();//直接释放,不用刷新了,99也会显示
//        osw.write("100");//IOException: Stream closed

        */

        //void write​(char[] cbuf) 写一个字符数组。
        char[] chs = {'a', 'b', 'c', 'd', 'e'};
//        osw.write(chs);
        // void write​(char[] cbuf, int off, int len) 写入字符数组的一部分。
//        osw.write(chs,0,chs.length);
//        osw.write(chs,1,3);

        //void write​(String str) 写一个字符串。
        osw.write("abcde");
        //void write​(String str, int off, int len) 写一个字符串的一部分。
        osw.write("abcde",0,"abcde".length());
        osw.write("abcde",1,3);

        //释放资源
        osw.close();


    }
}
字符流读数据的2种方式
package IO流.字符流.字符流读数据的2种方式;
/*
        构造方法
            InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。

        2种方式
            int read​() 一次读一个字符数据
            int read​(char[] cbuf) 一次读一个字符数组数据

 */

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo {
    public static void main(String[] args) throws IOException {
        //InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。
        InputStreamReader isr = new InputStreamReader(new FileInputStream("idea_text\\osw.txt"));
/*

        //int read​() :一次读一个字符数据
        int ch;
        while ((ch = isr.read()) != -1){
            System.out.println((char) ch);
        }
*/


        //int read​(char[] cbuf) 一次读一个字符数组数据
        char[] chs=new char[1024];
        int len;
        while ((len = isr.read()) != -1){
            System.out.println(new String(chs, 0, len));
        }

        //释放资源
        isr.close();

    }
}
字符缓冲流
package IO流.字符流.字符缓冲流;
/*
    字符缓冲流:
        BufferedWriter:
            将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
            可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
        BufferedReader:
            从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
            可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。

        构造方法:
            BufferedWriter​(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
            BufferedReader​(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。
 */

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
/*
        //BufferedWriter​(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
        BufferedWriter bw=new BufferedWriter(new FileWriter("idea_text\\bw.txt"));
        bw.write("hello\r\n");
        bw.write("world\r\n");
        bw.close();
*/

        //BufferedReader​(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。
        BufferedReader br=new BufferedReader(new FileReader("idea_text\\bw.txt"));
        int ch;
        while ((ch = br.read()) != -1){
            System.out.println((char)ch);
        }

        char[] chs=new char[1024];
        int len;
        while ((len = br.read()) != -1){
            System.out.println(new String(chs,0,len));
        }

        //释放资源
//        bw.close();
        br.close();
    }
}
特有功能
package IO流.字符流.字符缓冲流;
/*
        BufferedWriter:
            void newLine(): 写一行行分隔符,行分隔符字符串由系统属性定义
        BufferedReader:
            void String readLine(): 读一行文字,结果包含行的内容的字符串,不包括任何行终止字符
            如果过流的结尾已经到达,则为null
 */

import java.io.*;

public class 特有功能 {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲流
/*
        BufferedWriter bw=new BufferedWriter(new FileWriter("idea_text\\bw.txt"));

        //写数据
        for (int i=0; i<10;i++){
            bw.write("hello"+i);
            bw.newLine();
            bw.flush();
        }
*/

        BufferedReader br = new BufferedReader(new FileReader("idea_text\\\\bw.txt"));

        //读数据
        String line;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }


        br.close();
    }
}
复制java文件改进版
package IO流.字符流;
/*
    需求:
        把模块目录下的“ConversionStreamDemo.java”复制到模块目录下的“Copyjava
    分析:
        1,转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化书写,转换流提供了对应的子类
        2,FileReader:用于读取字符文件的便捷类
            FileReader(String fileName)
        3,FileWriter:用于写入字符文件的便捷类
            FileWriter(String fileName)
        4,数据源和目的地的分析
          数据源:
              myCharStream\\ConversionStreamDemo.java---读数据---Reader---InputStreamReader---FileReader
         目的地:
              myCharStream\\Copy.java---写数据---Writer---OutputStreamWriter-FileWriter

        思路
            1,根据数据源创建字符输入流对象
            2,根据目的地创建字符输出流对象
            3,读写数据,复制文件
            4,释放资源

 */

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class 复制java文件改进版 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符输入流对象
        FileReader fr=new FileReader("myCharStream\\\\ConversionStreamDemo.java");
        //根据目的地创建字符输出流对象
        FileWriter fw=new FileWriter("myCharStream\\\\Copy.java");

        //读写数据,复制文件
        int ch;
        while ((ch = fr.read())!=-1){
            fw.write(ch);
        }

        char[] chs=new char[1024];
        int len;
        while ((len = fr.read(chs))!=-1){
            fw.write(chs,0,len);
        }



        //释放资源
        fr.close();
        fw.close();

    }
}
复制java文件字符缓冲流改进版
package IO流.字符流;
/*
    需求:
        把模块目录下的“ConversionStreamDemojava”复制到模块目录下的“Copyjava

    思路:
        1,根据数据源创建字符缓冲输入流对象
        2,根据目的地创建字符缓冲输出流对象
        3,读写数据,复制文件
        4,释放资源


 */

import java.io.*;

public class 复制java文件字符缓冲流改进版 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
        //根据目的地创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));
        //读写数据,复制文件
        // 一次读写一个字符数据
        int ch;
        while ((ch = br.read()) != -1) {
            bw.write(ch);
        }
        //一次读写一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len = br.read(chs)) != -1) {
            bw.write(chs, 0,len);
        }
        //释放资源
        bw.close();
        br.close();
    }
}
复制java文件字符缓冲流特有功能改进版
package IO流.字符流;
/*
    需求:
        把模块目录下的“ConversionStreamDemojava”复制到模块目录下的“Copyjava

    思路:
        1,根据数据源创建字符缓冲输入流对象
        2,根据目的地创建字符缓冲输出流对象
        3,读写数据,复制文件
                使用字符缓冲流特有功能实现
        4,释放资源


 */

import java.io.*;

public class 复制java文件字符缓冲流特有功能改进版 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符缓冲输入流对象
        BufferedReader br =new BufferedReader(new FileReader("myCharStreamlConversionStreamDemo.java"));
        //根据目的地创建字符缓冲输出流对象
        BufferedWriter bw=new BufferedWriter(new FileWriter("myCharStreamCopy.java"));
        //读写数据,复制文件
        //使用字符缓冲流特有功能实现
        String line;
        while((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //释放资源
        bw.close();
        br.close();
    }
}
复制单级文件夹
package IO流.字符流;

import java.io.*;

public class 复制单级文件夹 {
    public static void main(String[] args) throws IOException {
        //创建数据源目录File对象,路径是D:\\AAA
        File srcFolder=new File("D:\\AAA");
        //获取数据源目录File对象的名称  AAA
        String srcFolderName= srcFolder.getName();
        //创建目的地目录File对象,路径名是模块名+AAA组成
        File destFolder =new File("idea_text",srcFolderName);
        //判断目的地目录对应的File是否存在,如果不存在,就创建
        if (!destFolder.exists()){
            destFolder.mkdir();
        }
        //获取数据源目录下的所有文件的File数组
        File[] listFiles=srcFolder.listFiles();
        //遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件
        for (File srcFile:listFiles){
            //获取数据源文件对象的名称
            String srcFileName = srcFile.getName();
            //创建目的地文件File对象
            File destFile=new File(destFolder,srcFileName);
            //复制文件
            copyFile(srcFile,destFile);
        }
    }

    private static void copyFile(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bos.close();
        bis.close();
    }
}
点名器
package IO流.字符流;
/*
        需求:
            我有一个文件里面存储了班级同学的姓名,每个姓名占一行,通过程序实现随机点名器具
        思路:
            1,创建字符缓冲输入流对象
            2,创建ArrayList集合对象
            3,调用字符缓冲输入流对象的方法读数据
            4,把读取到的字符串数据存储到集合中
            5,释放资源
            6,使用Random产生一个随机数,范围在【0,集合长度)
            7,把第6步产生的随机数作为索引到ArrayList集合中获取值
            8,把第7步得到的数据输出在控制台
 */

import java.io.*;
import java.util.ArrayList;
import java.util.Random;

public class 点名器 {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("idea_text\\osw.txt"));
        //创建ArrayList集合对象
        ArrayList<String> array = new ArrayList<String>();
        //调用字符缓冲输入流对象的方法读数据
        String line;
        while ((line = br.readLine()) != null) {
            array.add(line);
        }
        //释放资源
        br.close();
        //使用Random产生一个随机数,范围在【0,集合长度)
        Random r = new Random();
        int index = r.nextInt(array.size());
        //把第6步产生的随机数作为索引到ArrayList集合中获取值
        String name = array.get(index);
        //把第7步得到的数据输出在控制台
        System.out.println("幸运者是:" + name);

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放码过来a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值