Java基础13-字符串缓冲流;字节流
作业解析
描述HashMap内部实现原理
HashMap是一种存储机制,存储的是key-value对,key用来保证元素的唯一性。通过hash算法将要存储的对象打散,分布在不同的区间中。- 当添加对象时,先得到该对象的hashcode,通过hashcode定位到将要存储的区间上,然后将区间中原有的元素依次与该对象进行比对,比对原则有三个:hashcode是否相同、是否是同一对象、equals方法是否返回true。如果没有元素与之相同,则添加到该区间元素的末尾
- 通过key查询时,先得到key对应的hashcode, 然后定位到所在区间,简化了查询,最后按照上述的三个原则进行比对
List Set Map区别
List
ArrayList: 有序,可重复,线程不安全
LinkedList: 手拉手,线程不安全
Vector: 线程安全Set
HashSet: 不可重复,无序,使用键值对存储机制
TreeSet: 通过实现Comparable接口实现排序,或者包装一个对比器ComparatorMap
HashMap: 键值对,不可重复
HashTable: 线程安全
描述HashSet和HashMap的区别
HashSet集合内部是通过HashMap进行实现的。使用的是HashMap中key部分。对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行&运算,得到介于0和集合容量值之间一个数字。该数字表示着数组的下标。也就是该元素应该存放在哪个集合中。然后按照hashcode1()==hashcode2() && (是否同一对象 || equals() )与集合中已有元素进行对比,如果没有相同的元素,则添加该元素。编程实现文本文件的复制。合理设计程序,得到缓冲区的大小的高效区间。
提示缓冲区设置1k开始,不超过10M。public static void main(String[] args) throws Exception { FileWriter fw = new FileWriter("Test.txt");
int count=0;
for(int i=0;i<=10000000;i++) {
if(count<=1000) {
count++;
fw.write(i+",");
}
else {
fw.write("\r\n");
count=0;
}
}
fw.close();
System.out.println("over"); /*
* 编程实现文本文件的复制。合理设计程序,得到缓冲区的大小的高效区间。
* 提示:缓冲区设置1k开始,不超过10M。
* */ int bufSize=1024;//缓冲区1k开始
long spendTime = 0;//耗费的时间
long minTime = Long.MAX_VALUE;//记录最少耗时
for(int i=1;i<=10*1024;i++) {
long beginTime = System.currentTimeMillis();
copyFile("Test.txt","Test2.txt",i*bufSize);
spendTime = System.currentTimeMillis()-beginTime;
if(spendTime<minTime) {
minTime = spendTime;
System.out.println(i);
}
}
System.out.println(minTime);
System.out.println("over");
}
/*
* 按给定的缓冲区大小,复制文件src到des
*/
public static void copyFile(String src,String des,int bufSize) throws Exception {
FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(des);
char[] buf = new char[bufSize];
int len = -1;
while((len=fr.read(buf))!=-1) {
fw.write(new String(buf,0,len));
}
fw.close();
fr.close();
}
使用FileWriter,将1-1000000写入到文本中
package com.kokojia.io; import java.io.FileWriter;
import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) {
/**
* 使用FileWriter,将1-1000000写入到文本中
*/
FileWriter fw = null;
try {
fw = new FileWriter("h1.txt");
for(int i=1;i<=1000000;i++) {
fw.write(i+",");
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
if(fw!=null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("over!");
}
}
变长参数 + 增强for循环
package com.kokojia.io; public class AvgParAndForDemo { public static void main(String[] args) {
/**
* 变长参数 + 增强for循环练习
*/
OutString("a","b","123","中国"); } //变长参数只能有一个,且必须是最后一位形参
private static void OutString(String...str) {
for(String s: str) {
System.out.println(s);
}
} }
行分隔符在java中可以通过方法得到
System.getProperty("line.separator"); //执行 系统属性名
系统属性名是line.separator
windows: \r\n
macOS: \n
字符缓冲区
FileWriter没有缓冲区功能,本身没有新增任何功能,继承的OutputStreamWriter
等级树结构:Object ---> Writer ---> OutputStreamWriter ---> FileWriter
writer(){
//直接写入数据到文件中
sun.nio.cs.StreamEncoder.write();
}
FileReader
继承关系树:Object ---> Reader ---> InputStreamReader ---> FileReader
read()
读取一个字符read(char[])
读取多个字符read(){
InputStreamReader.read(){
sun.nio.StreamDecoder.read();
}
}
BufferedReader
等级树结构:Object ---> Reader ---> BufferedReader ---> LineNumberReader
read(){
char[] cbuf = ... ;
cbuf[xxx] = c;
return c;
}
避免对物理文件的频繁访问
public static void main(String[] args) throws Exception {
BufferedReader bufReader = new BufferedReader(new FileReader("d:/foo.txt"));
String line = null;
while((line = bufReader.readLine())!=null) {
System.out.println(line);
}
System.out.println("over");
bufReader.close(); /*
* 使用LineNumberReader读取文件的行号
* 打印输出行号+"."+行内容
*/
LineNumberReader lineNumReader = new LineNumberReader(new FileReader("d:/foo.txt"));
while((line=lineNumReader.readLine())!=null) {
int lineNo = lineNumReader.getLineNumber();
System.out.println(lineNo+"."+line);
}
lineNumReader.close();
System.out.println("------------"); /**
* 使用FileReader和BufferedReader读取文本文件,观察消耗时间
*/
//非缓冲reader
FileReader fr = new FileReader("d:\\1.txt");
//缓冲reader
BufferedReader br = new BufferedReader(new FileReader("d:\\1.txt")); //非缓冲循环读取
int len = -1;
//开始时间
long beginTime = System.currentTimeMillis();
while((len=fr.read())!=-1) {
}
//结束时间
long endTime = System.currentTimeMillis();
fr.close();
System.out.println("reader over!花费了时间"+(endTime-beginTime));//42443 //缓冲循环读取
beginTime = System.currentTimeMillis();
while((len=br.read())!=-1) {
}
//结束时间
endTime = System.currentTimeMillis();
br.close();
System.out.println("bufreader over!花费了时间"+(endTime-beginTime));//18654
}
BufferedWriter
对Writer进行包装,里面定义缓冲区,提供写入单个字符、char[]、String方法,提高写入效率
等级树结构:Object ---> Writer ---> BufferedWriter
flushBuffer(): 清理缓冲区,将缓冲区数据写入目的地
close()方法: 包含flushBuffer()动作
static char[] buf = null;
static {
buf = new char[8192];
for(int i=0;i<8192;i++) {
buf[i]='a';
} }
public static void main(String[] args) throws Exception { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("d:/foo.txt")));
out.println("hello word");
out.close();
System.out.println("over"); //非缓冲
FileWriter fw = new FileWriter("d:/1.txt");
//缓冲区
BufferedWriter bw = new BufferedWriter(new FileWriter("d:/2.txt"),1024*1024); /**************非缓冲区writer操作*******/
//最大次数
int max = 100000;
//开始时间
long startTime = System.currentTimeMillis();
for(int i=0;i<max;i++) {
fw.write(buf);
}
fw.close();
long endTime = System.currentTimeMillis();
System.out.println("wrtier over! 花费了时间:"+(endTime-startTime)); /**************缓冲区writer操作*******/
//开始时间
startTime = System.currentTimeMillis();
for(int i=0;i<max;i++) {
bw.write(buf);
}
bw.close();
endTime = System.currentTimeMillis();
System.out.println("bufwrtier over! 花费了时间:"+(endTime-startTime));
}
内存回收机制
堆中的对象只有在没有引用时才会释放
byte[] bytes = new byte[1023][1024][1024];
byte[] b2 = bytes ;
.
.
.
.
bytes = null ;
几个重要的函数
flush() //清理
refresh() //刷新
clear() //清空
字节流
- OutputStream
- 输出流
- FileOutputStream
- 等级树: Object ---> OutputStream --->FileOutputStream
- InputStream
- 输入流
- FileInputStream
- 等级树:Object ---> InputStream --->FileInputStream
装饰模式:decorator
实现方式: Buffered 类继承Writer类,在类中添加Writer类型的成员变量,对象应方法进行重写时,调用成员变量的方法进行完成。
class BufferedWriter extends Writer{
Writer out;
char[] cb = new char[8192];
public void writer(String str){
//1.先将数据写入缓冲区
cb.xxx
//2.如果cb已满,再写入到out中
}
public void close(){
//1.清理cb
//2.关闭out
}
}
时间单位换算:
1s=1000ms
1ms=1000us
1us=1000ns
juint
- 单元测试框架
- 方便进行测试时使用
- 方法签名
import org.juint.Text
@Test
public void xxx(){
}
作业
阐述BufferedReader和BufferedWriter的工作原理,
是否缓冲区读写器的性能恒大于非缓冲区读写器的性能,为什么,请举例说明?写入数据1~1000000数字到文件中,分别使用FileWriter和BufferedWriter实现,考察其效率的不同
文件切割:
把较大的文件切割成20k一个的小文件文件合成:
把小文件合并成大文件文件归档解档:
0=txt,1=jpg,2=avi,3=gifCharset类操作: isSupport()
通过该类验证平台是否支持一下字符集:
gb2312
GB2312
gbk
GBK
utf-8
utf8
iso8859-1
iso-8859-1取出平台默认的字符集
FileReader.getEncoding();
new String(,,,,,charset);使用FileInputStream + FileOutputStream / BufferedInputStream + BufferedOuputStream
实现大文件复制,比较复制效率。阐述对象回收的前提条件。
Java基础13-字符串缓冲流;字节流的更多相关文章
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- java基础10(IO流)-字节流
IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...
- Java基础系列8——IO流超详细总结
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 在初学Java时,I ...
- Java基础之详谈IO流
Java基础知识.IO流详细讲解.你所要的IO这里都有
- java基础11(IO流)-字符流
转换流 由于字节流操作中文不是特别方便,所以java中提供了转换流 编码表:由现实世界的字符和对应的数值组成的一张表 编码:把看得懂的变成看不懂的(String-------byte[]) 解码:把看 ...
- Java基础之I/O流
一.数据流的基本概念 数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流.数据写入程序可以是一段.一段地向数据流管道中写入数据, ...
- Java基础之(IO流)
简介: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. 一.File ...
- java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件
字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...
- 6.3(java学习笔记)缓冲流
一.缓冲流 使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出. 避免程序频繁的和文件直接操作,这样操作有利于提高读写效率. 缓冲流是构建在输入输出流之上的,可以理 ...
- Java基础12一IO流
1.IO流的原理 利用数据通道实现程序和数据源之间数据的的读写操作. 2.IO流分类 输入流.输出流.字节流.字符流.节点流.过滤流 3.InputStream 字节输入流 实现类FileInpu ...
随机推荐
- 折半、快排、插入排序的Java实现
插入排序 import java.util.Arrays; public class InsertionSort { /** * 对数组里面进行插入排序 * 参数1 数组 * 参数2 数组大小 */ ...
- ora-14400:插入的分区关键字未映射到任何分区
参考:https://blog.csdn.net/rubychen410/article/details/5317553 出现该问题是由于: 1.为表设置了根据时间进行分区(PARTITION),而每 ...
- 关于 Be 主
大三在校生 每天不定刷 Leetcode POJ HDU 以及其他算法专题 自己很菜 还没有能力可以帮助别的旁友解决问题 :-( 毕竟有个人每天看着你写代码还是很幸福的事情呢 还是要骄傲夸一下 FH ...
- laravel 开启定时任务需要操作
1.在xshell 中 crontab -e //编辑任务crontab -l //查看执行中的任务列表 2.在打开的任务中: /home/wwwroot/default 换为自己项目的根路径 vag ...
- [转]html5监听任何App自带返回键javascript事件
1.前言 如今h5新特性.新标签.新规范等有很多,而且正在不断完善中,各大浏览器商对它们的支持,也是相当给力.作为前端程序员,我觉得我们还是有必要积极关注并勇敢地加以实践.接下来我将和各位分享一个特别 ...
- icpc 南昌邀请赛网络赛 Max answer
就是求区间和与区间最小值的积的最大值 但是a[i]可能是负的 这就很坑 赛后看了好多dalao的博客 终于a了 这个问题我感觉可以分为两个步骤 第一步是对于每个元素 以它为最小值的最大区间是什么 第二 ...
- Docker常用镜像
Docker,具有快捷方便的特性,机器上不需要安装软件和进行各种配置,拉取镜像,一行命令即可启动服务,不使用时,一行命令关闭容器即可,快捷方便,干净.利索.建议将本地的redis.mysql.kafk ...
- python并发编程之多进程基础知识点
1.操作系统 位于硬件与应用软件之间,本质也是一种软件,由系统内核和系统接口组成 和进程之间的关系是: 进程只能由操作系统创建 和普通软件区别: 操作系统是真正的控制硬件 应用程序实际在调用操作系统提 ...
- [十二省联考2019]异或粽子(堆+可持久化Trie)
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...
- jmeter笔记(8)--关联
关联是jmeter中比较重要的一个点,在测试过程中有些数据是经常发生变化的,要获取这些数据,就需要使用关联,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联.. 正则表达式提取器 ...