草庐IT

io流之【字节/字符缓冲流】

Lucky-only 2023-04-17 原文

缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流:BufferedInputStream,BufferedOutputStream
  • 字符缓冲流:BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

①字节缓冲流

 1 package com.Lucky.io.BufferStream;
 2 
 3 import java.io.*;
 4 
 5 /*
 6  字节缓冲流: 是字节流的高级流之一【效率比基础的字节流高的多】
 7  格式:       缓冲流  名称 = new 缓冲流(new 基础流)
 8              例如:    BufferedInputStream bufInStr=
 9                                new BufferedInputStream(new FileInputStream());
10 
11  */
12 
13 /**
14  * 其他的跟基础流一样【同样可以使用数组来进行一次读取多个字节】
15  */
16 public class byteBufferStream {
17     public static void main(String[] args) throws IOException {
18         BufferedInputStream bufInStr=
19                 new BufferedInputStream(new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\bufferTest.txt"));
20         BufferedOutputStream bufOutStr=
21                 new BufferedOutputStream(new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\copy.txt"));
22 
23          int val;
24         while ((val=bufInStr.read())!=-1){
25             bufOutStr.write(val);
26         }
27 
28         bufOutStr.close();    //不用关闭基础流,因为在缓冲流的底层中已经将基础流进行colse
29         bufInStr.close();
30 
31     }
32 }

②字符缓冲流

 1 package com.Lucky.io.BufferStream;
 2 
 3 import java.io.*;
 4 
 5 /*
 6 字符缓冲流: 是字符流的高级流之一【效率比基础的字符流高一点,因为在字符流中本身就存在缓冲区】
 7  格式:       缓冲流  名称 = new 缓冲流(new 基础流)
 8              例如:           BufferedReader reader=
 9                                            new BufferedReader(new FileReader(""));
10 
11 
12  */
13 
14 /**
15  * 其他的跟基础流一样【同样可以使用数组来进行一次读取多个字节】
16  * 注意点:相对于字符基础流来说,多了2个独有的方法【readLine】一次读取一行数据
17  *                                      【newLine】  换行
18  *
19  */
20 public class charBufferStream {
21     public static void main(String[] args) throws IOException {
22        BufferedReader bufreader=
23                new BufferedReader(new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\bufferTest.txt"));
24        BufferedWriter bufWriter=
25                new BufferedWriter(new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\charBufferTest.txt"));
26 
27 
28 
29 
30        String val;
31        while ((val=bufreader.readLine())!=null){  //结尾最后返回null
32            System.out.println(val);
33            bufWriter.newLine();   //换行【可以不同的系统中使用不用再使用\r\n】
34        }
35 
36 
37        //关闭流
38         bufWriter.close();
39         bufreader.close();
40     }
41 }

综合小练习:

练习一材料:

12.穿上婚纱让朋友见证我们
10.白头偕老是我一生宿愿
14.就让我给你一场想要的最美的婚礼
4.你我在调整着紧张的情绪
7.我想和你结婚做炙热的亲吻
8.我想和在这开始私定终身
1.嘉宾正准备着盛装出席
2.亲眼目睹这一浪漫的婚礼
3.红毯散满花瓣爱情在洋溢
9.香槟塔前许下了誓言
13.礼堂里营造出浪漫气息
11.我想和你结婚做最幸福的人
5.神圣的一刻开始记录珍惜
6.感谢这份爱你我都未缺席
package com.Lucky.io.BufferStream.test;

import java.io.*;
import java.util.*;

/**
 * 练习1:将sort.txt【顺序乱的】的数据排序输出到新的文件中【拷贝数据加排序】
 */
public class sort {
    public static void main(String[] args) throws IOException {
        //创建对象
//        BufferedInputStream in=
//                new BufferedInputStream(new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\sort.txt"));
        BufferedWriter out=
                new BufferedWriter(new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\sortNew.txt"));
        BufferedReader bufreader=
                new BufferedReader(new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\sort.txt"));


        //////////////////解法一:ArrayList/////////////////////////////////
        byte[] arr=new byte[1024];
        String  val;
        ArrayList<String> li=new ArrayList<>();
        while ((val=bufreader.readLine())!=null){
            li.add(val);
        }
        //System.out.println(li);
        li.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int min=Integer.parseInt(o1.split("\\.")[0]);
                int max=Integer.parseInt(o2.split("\\.")[0]);
                return min-max;
            }
        });
        System.out.println(li);

        //写出数据
        for (String s : li) {
            out.write(s);
            out.newLine();  //换行
        }


        //关闭流
        out.close();
        bufreader.close();



        //////////////////解法二:TreeMap自动排序/////////////////////////////////
//        TreeMap<Integer,String> map=new TreeMap<>();
//        while ((val=bufreader.readLine())!=null){
//            int i = Integer.parseInt(val.split("\\.")[0]);
//            map.put(i,val);
//        }
//        Set<Map.Entry<Integer, String>> entries = map.entrySet();
//        for (Map.Entry<Integer, String> entry : entries) {
//            String value = entry.getValue();
//            out.write(value);
//            out.newLine();
//        }
//
//        out.close();
//        bufreader.close();

    }
}

练习2材料:

testCount.txt文件的初始数据是 ---》  0

 1 package com.Lucky.io.BufferStream.test;
 2 
 3 import java.io.*;
 4 
 5 /*
 6 练习2: 定义一个小程序,要求前面三次免费运行,第四次开始要提示开通会员使用
 7 
 8 注意点:字符流的读取/写出对象创建【如果指定相同的路径就注意】不要写到一起
 9        因为,在创建写出对象时,会将原来路径的内容清空
10  */
11 
12 /**
13  * 每天一个小知识: IO的使用原则:
14  *                          ★什么时候用就什么时候创建
15  *                          ★用完就立马关闭
16  */
17 public class SMG {
18     public static void main(String[] args) throws IOException {
19         //创建读取文件对象
20         BufferedReader reader=
21                 new BufferedReader(new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\testCount.txt"));
22         //获取行数据
23         String s = reader.readLine();
24         //类型转换
25         int i = Integer.parseInt(s);
26         i++;
27         reader.close();
28         //判断次数
29         if(i<4){
30             System.out.println("运行了"+i+"次");
31         }else {
32             System.out.println("本次第"+i+"运行,只能免费运行"+"3次");
33         }
34 
35         //创建写出对象
36         BufferedWriter writer=
37                 new BufferedWriter(new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\testCount.txt"));
38        //将新的值写出到文件中
39         writer.write(i+"");
40         writer.close();
41 
42     }
43 }

 

有关io流之【字节/字符缓冲流】的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  10. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

随机推荐