IO流总结3

来源:互联网 发布:sql in 两个字段 编辑:程序博客网 时间:2024/05/01 14:20

为了提高io流操作的效率,可以使用缓冲区来方便io流对字符和字节的操作,
好比一个容器装满了数据后一次性清空掉,然后再继续装载。

bufferedwriter dw = new bufferedwriter("流对象");//这是简单的语法,需要传入一个相

对应的流对象才可以实现dw的操作。

dw.newline();方法是在文本写入时需要换行操作使用的。如果不使用newLine方法会将所有

读出的数据全部写入到一行之中。所以为了美观和保持原文本样式一般都是每读取到一行就

写入一行然后newline换行。

readline()原理:
从硬盘中读取单个字符,每读一个与read()方法不同的是它不会立刻返回,而是向一个隐式

数组添加所返回的字符,当读到有回车键时(/n)会统一将数组中的值一并返回。


老师手抄:
装饰类设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,给予已有的功能并提

供加强功能。
那么自定义的类就成为装饰类
装饰模式比继承要灵活,避免了继承体系的臃肿。
而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以

装饰类和被装饰类通常都属于一个体系中的。

 


读取带行数的方法:
fileReader fr = new FileReader("文件");
LineNumberReader lnr = new LineNumberReader(fr);//返回文件的行号
String line = null;
while((line=lnr.readLine())!=null)
{
System.out.println(line);
}
lnr.c;


自定义读取行带行数方法:
//定义一个自己的读取整行带行数的方法
class ReaderLine
{
 FileReader fr= null;
 LineNumberReader lnb;
 public ReaderLine(FileReader fr) {
  super();
  lnb = new LineNumberReader(fr);
 }

 public ReaderLine() {
  super();
  // TODO Auto-generated constructor stub
 }

 //返回字符串
 public String MyReaderLine()throws IOException
 {

  
  String line = null;
  line=lnb.readLine();
  //System.out.println("rederline"+line);
  if(line!=null)
  {
   
   return line;
  }
  else
  {
   return null;
  }
  
 }
 
 public int ReadNum()
 {
  int len = 1;
  if((len=lnb.getLineNumber())!=-1) return len;
  return -1;
 }
 public void close() throws IOException
 {
  lnb.close();//添加关闭方法
 }
 
}


读取字节流:
//字节流不同于字符流写入write()每次都需要flush刷新,它在写入时就已经存入不需要刷

新命令就可以生成。
FileInputStream 读入流
FileOutStream 写入流
字节流缓冲区:
BufferedInputStream
BufferedOutputStream
但凡是输出的都是写入流。
如果每次循环都要用while()来判断,也有种直接获取字符串数组的长度,方法如下
FileInputStream fs = new FileInputStram("文件");
byte[] buf = new byte[fs.available()];//自动获取文本的字长度;
fis.read(buf);//写入流显示文本
※不过此类操作很容易造成内存溢出,如果文件过大不可用此类方法;
安全操作以byte[] buf = new byte[1024]为安全

byte[] buf = new byte[1024]


我们可以使用字节流复制视频和图片等,但是字符流却没有字节流强大,虽然字符流也可以

复制,但是复制过来的文件有可能无法打开或者信息错误。因为每次读取数据时会在编码表

中查找相对应的字符,如果无法找到则会进入未知数据区域寻找一个相邻的数据输出

当自己编辑自己复制方法时,设计到了二进制,这里暂时做下记载,以免日后忘记。
当MP3文件中11111111时,就是二进制代码的-1 但是我们以往的判断则都按-1退出。
但是11111111并非是真正的结束。接受MP3代码时转换成INT格式的话就为生成4个字节。
11111111就转换成了11111111 11111111 11111111 11111111但是这样返回依然是-1,我们需

要在补0,补后成为00000000 00000000 00000000 11111111这时返回的结果是255,遍不在

是-1接收,当再次使用BufferedOutputStram的write()是将字节的最后八位截取出来,这样

不会被传入-1误判也不会影响实际参数。
将数字于成0操作,也就是说将二进制中的1转换为0,
方法:
-1&255;或者-1&0xff(255的16进制写法,一个F等于4个一)


键盘录入:
System.out:对应的是标准输出的设备,控制台
System.in:对应的标准输入设备:键盘


字节流转换字符流操作:
InputStream in = System.in//获取键盘录入对象
InputStreamReader isr = new InputStreamReader(in);//将字节流对象转成字符流对象,

使用转换流
//为了提高效率,将字符串进行缓冲区技术高效操作,使BufferedReader
BufferedReader bufr = new BufferedReader(isr);
然后再对字符串作,最后记得使用bufr.close()关闭。


键盘录入最常见写法:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//每次

读取一行字符串


扩展小结:
System.setOut();//写入方式
System.setIn();//读入方式
System.setIn("per.txt");默认读per文件的内容
System.setOut("zz.txt")//默认写到zz文件中