javaIO总结(三)

使用指定的码表读写字符

原因:不同的文件有不一样的码表
InputStreamReader() 字符与字节之间的桥

import java.io.*;

/**
 * 用来转换不同编码格式文件
 * @author kiosk
 */
public class TransIO {
    public static void main(String[] args) throws IOException {
        BufferedReader bis = new BufferedReader( new InputStreamReader(new FileInputStream("utf-8.txt"),"UTF-8"));
        BufferedWriter bos = new BufferedWriter( new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK"));
        int flag;
        while ((flag = bis.read()) != -1){
            bos.write(flag);
        }
        bis.close();
        bos.close();
    }
}

统计文本文件中的字符出现的次数

思想:
(1)创建输入流,读取。
(2)创建Map集合,将读取的次数存入在Map中(三元表达式)。
(3)建立输出流,将出现的次数输出在文件上。
代码:

/**
 * 统计一个文本的字符的个数
 *
 * @author kiosk
 */
public class Count {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("hello.txt"));
        Map<Character, Integer> map = new TreeMap<>();
        int ch;
        while ((ch = reader.read()) != -1) {
            char c = (char) ch;
            //三元运算符,如果包含,就给值加1,如果不包含的话,就输入1
            map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);
        }
        reader.close();
        BufferedWriter writer = new BufferedWriter(new FileWriter("count.txt"));
        for (Character character : map.keySet()) {
         switch (character){
             case '\t':
                 writer.write("\\t"+ ":" +map.get(character) + "次数");
                 break;
             case '\n':
                 writer.write("\\n"+ ":" +map.get(character) + "次数");
                 break;
             case '\r':
                 writer.write("\\r"+ ":" +map.get(character) + "次数");
                 break;
             default:
                 writer.write("\\r"+ ":" +map.get(character) + "次数");
                 break;

         }
            writer.write(character+ ":" +map.get(character) + "次数");
            writer.newLine();

        }
        writer.close();
    }
}

IO(试用版软件)

模拟软件的使用期。
思路:先从文件中读取次数(缓冲字符流的readLine()方法),然后将读取的字符转换为数字,然后再进行自减操作,之后将减少的次数写入到原来的文件里。
代码如下:

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

/**
 * @author kiosk
 * 1)使用带缓冲流的方法,要使用readLine方法
 * 2)将读取的内容转化为数字,可以判断还有多少次
 * 3)如果数字大于0则可以使用,如果数字不大于0,那就会提示购买正版
 */
public class Trial {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("config.txt"));
        String line = reader.readLine();
        int num = Integer.parseInt(line);
        if(num > 0){
            System.out.println("你还有" + --num + "次机会");
            FileWriter writer = new FileWriter("config.txt");
            writer.write(String.valueOf(num));
            writer.close();
        }else{
            System.out.println("请您进行注册");
        }
        reader.close();
    }
}

递归调用来把一个文件夹下的后缀为.java文件遍历打印出来

import java.io.File;
import java.util.Scanner;

/**
 * 从键盘上输入一个文件夹,然后找出所有文件后缀为.java的文件
 * @author kiosk
 */
public class FindFile {
    public static void main(String[] args) {
        File dir = findDir();
        getFileName(dir);
    }

    /**
     * 获取输入键盘的文件夹文件
     * @return
     */
    public static File findDir(){
        Scanner scanner = new Scanner(System.in);
        while (true){
            String path = scanner.nextLine();
            File dir = new File(path);
            if(!dir.exists()){
                System.out.println("抱歉您输入的文件夹路径是不存在的,请您重新输入");
            }
            if(dir.isFile()){
                System.out.println("抱歉您输入的路径是一个文件,请您重新输入");
            }
            if(dir.isDirectory()){
                return dir;
            }
        }
    }
    public static void getFileName(File dir){
        File[] files = dir.listFiles();
        for (File file : files) {
            if(file.isFile() && file.getName().endsWith(".java")){
                System.out.println(file.getName());
            }else if(file.isDirectory()){
                getFileName(file);
            }
        }
    }
}

java中的序列流

可以把多个字节流整合在一起,从第一个被整合的流开始读取
问题:在复制两个文件为一个文件的时候文件的复用性太差,是两个并行的输入流。
代码:

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

/**
 * 序列化流
 * @author kiosk
 */
public class Sequence {
    public static void main(String[] args) throws IOException {
        FileInputStream fis1 = new FileInputStream("1.txt");
        FileOutputStream fos = new FileOutputStream("3.txt");
        int b1;
        while((b1 = fis1.read()) != -1){
            fos.write(b1 );
        }
        fis1.close();
        FileInputStream fis2 = new FileInputStream("2.txt");
        int b2;
        while((b2 = fis2.read()) != -1){
            fos.write(b2);
        }
        fis1.close();
    }
}

如何整合多个流?(应用的场景:MP3歌曲的串烧)
利用枚举
代码:

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;

/**
* 整合多个
* @author kiosk
*/
public class Sequence2 {
   public static void main(String[] args) throws IOException {
       FileInputStream fis1 = new FileInputStream("1.txt");
       FileInputStream fis2 = new FileInputStream("2.txt");
       FileInputStream fis3 = new FileInputStream("3.txt");
       Vector<FileInputStream> vector = new Vector<>();
       vector.add(fis1);
       vector.add(fis2);
       vector.add(fis3);
       Enumeration enumeration = vector.elements();
       SequenceInputStream sis = new SequenceInputStream(enumeration);
       FileOutputStream fos = new FileOutputStream("4.txt");
       int read;
       while ((read = sis.read()) != -1){
           fos.write(read);
       }
       sis.close();
       fis3.close();
   }
}

内存输出流

像内存写数据,把内存当作一个缓冲区,写出之后可以一次性的获取所有的数据。
ByteArrayOutputStream
ByteArrayInputStream

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class ByteOutput {
  public static void main(String[] args) throws IOException {
      FileInputStream fis = new FileInputStream("1.txt");
      ByteArrayOutputStream stream = new ByteArrayOutputStream();
      int b;
      while ((b = fis.read()) != -1){
          stream.write(b);
      }
      //将缓冲区的数据获取出来,并将数据存入在字节数组中
      byte[] bytes = stream.toByteArray();
      String string = new String(bytes);
      System.out.println(string);
      fis.close();
      //是在内存中的,所以是不用关掉,没有意义
  }
}

用内存流来将文件的字符读取出来打印在控制台上

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

/**
* @author kiosk
*/
public class Test{
  public static void main(String[] args) throws IOException {
      FileInputStream fis = new FileInputStream("1.txt");
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      byte[] bytes = new byte[5];
      int b;
      while ((b = fis.read(bytes)) != -1){
          baos.write(bytes,0,b);
      }
      fis.close();
      byte[] byteArray = baos.toByteArray();
      System.out.println(new String(byteArray));

  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值