- 浏览: 17006 次
- 性别:
- 来自: 广州
-
最新评论
字节流的抽象基类:
InputStream(输入) OutPutStream(输出)
字符流的抽象基类:
Reader(读) Writer(写)
这四个类派生出来的子类都是由父类的名作为子类名的后缀.
IO需要了解的问题:
1.有了垃圾回收站为什么还要调用close方法去进行关闭
解答: 虽然java已经垃圾回收了这个流,但是系统根本就不知道什么时候关闭这个流,所以我们要手动的去关闭
2.为什么IO异常一定要处理嗯?
解答:如果io异常不处理的, 当读到一个文件的时候出现错误,那么后面的也就会执行不到了.所以我们一定要异常处理/..
字符流创建一个文件
FileWriter fw = new FileWriter(“src/a.txt”); //建立数据存放的文件 fw.writer(“test”); //把text写入到流中
关闭流资源,并将流中的数据进行清空到文件中.
如果想要在原文件中加入新的数据呢?
FileWriter fw = new FileWriter(“src/a.txt”,true);//代表从一个文件的末尾处追加 fw.writer(“happy”);
1.jpgCopy.class(对一个图片进行拷贝)
package com.javami.kudy.Code14; import java.io.FileInputStream; import java.io.IOException; import java.io.FileOutputStream; public class JpgCopy { public static void main(String[]args) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("src/a.jpg"); //输入一个图(输出(读) 输出(写)) fos = new FileOutputStream("src/b.jpg"); int len; while((len=fis.read())!=-1) { fos.write(len); //输出(写入) } }catch(IOException e) { e.printStackTrace(); } finally { } } }
CloseUtil.class(自己写的一个工具关闭流)
package com.javami.kudy.Code14; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; public class CloseUtil { private CloseUtil(){} public static void close(InputStream is,OutputStream os,Reader r,Writer w) throws IOException { try { is.close(); } finally { os.close(); try { r.close(); } finally { w.close(); } } } }
System.currentTimeillis();//获取毫米数
自定义输入流:(读)
package com.javami.kudy.CodeBuffer; import java.io.IOException; import java.io.InputStream; public class MyBufferedInputStream extends InputStream { private InputStream is; private byte[] buf = new byte[1024]; //假设我这边有1024个缓冲区 private int len; //默认为零 private int pos; //标记一下角标的个数 public MyBufferedInputStream(InputStream is) { this.is = is; } /* * 1.需要考虑的问题? * 思路: * 加速 * FileInputStream is = new FileInputStream("src/a.jpg"); */ @Override public int read() throws IOException { if(len==0) { len = is.read(buf); //一次性填充缓冲区(从这个文件中截取1024个放到buf里面去,返回的是最长的个数) //角标pos置零 pos=0; } if(len==-1) return -1; len--; //但是返回的这个byte有可能是-1 ,如果-1程序就错了 return buf[pos++]&0xff; //0xff代表:11111111 &00000000 00000000 00000000 11111111 //返回的结果是前面+24个08个1.这样就不会被当成-1处理啦 } public void close()throws IOException { //关闭底层的流 is.close(); } }
自定义输出(写入)
package com.javami.kudy.CodeBuffer; import java.io.IOException; import java.io.OutputStream; public class MyBufferedOutputStream extends OutputStream { private OutputStream op; private byte[] buf = new byte[1024]; int pos; int len; public MyBufferedOutputStream(OutputStream op) { this.op = op; } @Override public void write(int b) throws IOException { if(pos == 1024) { flush(); pos = 0; } /* * 外部执行的情况: * while 不断往里面放入字节 * 内部实现: 判断是否满了.如果满了.我这边就刷新一下. */ buf[pos++] = (byte)b; } public void flush()throws IOException { op.write(buf,0,pos);//写入 : 输出(到一个指定的文件里面去) } public void close()throws IOException { op.close(); } }
测试几种用法的时间差:
package com.javami.kudy.CodeBuffer; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.BufferedInputStream; import com.javami.kudy.Code14.CloseUtil; public class Mp3Copy { public static void main(String[]agrs) { /* //时间差 long Timedifference =end - start; System.out.println(Timedifference);*/ String source = "src/a.mp3"; //来源 String target = "src/d.mp3"; //目标 long start = System.currentTimeMillis(); try { myTest(source,target); } catch(IOException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println(end-start); //获取到时间差 System.out.println("hello"); } /* * 单个拷贝字节: 毫秒大概是: 50000~60000之间 */ private static void FileInputStreamTest(String source,String target)throws IOException { FileInputStream fls = null; FileOutputStream fos = null; try { fls = new FileInputStream(source); fos = new FileOutputStream(target); int ch; while((ch=fls.read())!=-1) { fos.write(ch); } } finally { CloseUtil.close(fls, fos, null, null); } } /* * 通过包装类来拷贝 缓存---> 593 */ private static void BufferedTest(String source,String target)throws IOException { BufferedInputStream bis= null; //读(输入) BufferedOutputStream bos = null; //写(输出) try { bis = new BufferedInputStream(new FileInputStream(source)); bos = new BufferedOutputStream(new FileOutputStream(target)); int len; while((len=bis.read())!=-1) //把左边的内容读到底层的一个bis[pos++]之后再从缓冲区里面返回 { bos.write(len); } } finally { CloseUtil.close(bis, bos, null, null); } } /* * 用户自定义的缓存数组: 94 */ private static void copyMp3ByBuf(String source,String target)throws IOException { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(target); byte[] buf = new byte[1024]; int ch; while((ch=fis.read(buf))!=-1) { fos.write(buf); } } finally { CloseUtil.close(fis, fos, null, null); } } /* * 用自己写的包装输入输出字节流 * 203 * 通过比较得出的结论: * */ private static void myTest(String source,String target )throws IOException { MyBufferedInputStream mis = null; MyBufferedOutputStream mos = null; try { mis = new MyBufferedInputStream(new FileInputStream(source)); mos = new MyBufferedOutputStream(new FileOutputStream(target)); int b; while((b=mis.read())!=-1) { mos.write(b); } } finally { CloseUtil.close(mis, mos, null, null); } } }
关闭流的工具类:
package com.javami.kudy.Code14; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; public class CloseUtil { private CloseUtil(){} public static void close(InputStream is,OutputStream os,Reader r,Writer w) throws IOException { try { if(is!=null) is.close(); } finally { if(os!=null) os.close(); try { if(r!=null) r.close(); } finally { if(w!=null) w.close(); } } } }
其实字符流的底层实现是需要字节流的
package com.javami.kudy.CodeBuffer; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; public class MyFileWriter extends OutputStreamWriter { /* * 如果你放进去一个字符流! * 我们通过底层调用父类的字节流.帮你处理这个数据 */ public MyFileWriter(String name)throws IOException { //底层实现原理: 其实调用字符流底层是字节流实现的?为何呢? super(new FileOutputStream(name)); } public MyFileWriter(String name,boolean is)throws IOException { super(new FileOutputStream(name,true)); } }
关于字节流转字符流
package com.javami.kudy.PM; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import com.javami.kudy.Code14.CloseUtil; public class TreasStreamTest { /* * 字节流转换成字符流 * 思路: * 1.首先要获取到输入流与输出流 * 2.(字符流) == <-- InputStreamReader--> (输入流) 3.(字符流) == <--OutputStream-->(输出流) */ public static void main(String[]args) { /*//1.获取输入流 InputStream ism = System.in; //2.获取输出流 PrintStream pts = System.out; //3.字符流(读)-->输入流 转换 InputStreamReader isr = new InputStreamReader(ism); //4.字符流(写)-->输出留 OutputStreamWriter osr = new OutputStreamWriter(pts); //5.转换成父类型的引用可以指向子类型的对象(转换成字符流的读) Reader r = isr; //6.转换成父类型的引用可以指向子类型的对象(转换成字符流的写) Writer w = osr; //包装字符流 BufferedReader br = new BufferedReader(r);//包装 BufferedWriter bw = new BufferedWriter(w); 关于执行速度--> */ //从字节流转换成字符流的步骤 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); try { String line; while(true) { line = br.readLine(); //读一行 bw.write(line); //写一行 bw.newLine(); bw.flush(); //刷新-->从流里面刷新一下.因为它是属于打一行打一行的概率 if("bye".equals(br)) break; } } catch(IOException e) { e.printStackTrace(); } finally { try { CloseUtil.close(null, null, br, bw); } catch(IOException e) { e.printStackTrace(); } } } }
流程图: System.in(读) System.out(写) BufferedReader br = new BufferedReader(new InputStream(System.in)); //把输入流转换成包装的读 BufferedWriter bw = new BufferedWriter(new OutputStream(System.out)); //把输出流转换成包装的写 BuffferedReader对标准输入System.in进行包装,实现读取键盘上输入的一行 注意: 如果想要实现读一行,打一行↓ String line br.readLine(); //第一行 bw.writer(line); bw.newLine(); //换行 bw.flush()刷新一下流
/** * 测试题5 * 输入学生新,按break终止,每个学生有3门课的成绩,定义一种比较直观的文本文件格式, 输入学生姓名和成绩,从键盘输入以上数据(包括姓名,三门课成绩), 按总分数从高到低的顺序将学生信息存放在磁盘文件"stu.txt"中。 思路: 1.读取键盘,一行输入一个学生的信息,封装成学生对象 2.将学生对象存入一个TreeSet按总分排序 3.遍历TreeSet集合,取出所有的学生信息,输出到stu.txt中 */ package com.javami.kudy.PM; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.Comparator; import java.util.TreeSet; public class Test { public static void main(String[]args) { TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>(){ //比较器 @Override public int compare(Student s1, Student s2) { int num = s1.getSum()-s2.getSum(); if(num!=0) return -num; return s1.getName().compareTo(s2.getName()); } }); try { saveStuInfo(ts); listStuInfo(ts); } catch(IOException e) { e.printStackTrace(); } } /* * 遍历集合里面的内容,把它写入到一个文件名里面 */ private static void listStuInfo(TreeSet<Student> ts)throws IOException { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter("src/a.txt")); for(Student str : ts) { //一定要标记为toString 为啥呢? 因为它是不会自动的打印toString的 bw.write(str.toString()); bw.newLine(); } } finally { bw.close(); } } /* * 读取键盘 * 获取学习的对象 * 把学习的对象存入ts里面去 */ public static void saveStuInfo(TreeSet<Student> ts)throws IOException { //当你读的时候,我们要求它用逗号分隔 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//输入-?读 try { String line; while(true) { line = br.readLine(); //读一行 if("break".equals(line)) break; //将line分隔成4部分 String[]bufs = line.split(","); Student s = new Student(bufs[0],Integer.parseInt(bufs[1]) ,Integer.parseInt(bufs[2]) ,Integer.parseInt(bufs[3])); ts.add(s); } } finally { br.close(); } } } class Student { private String name; private int chinese; //语文成绩 private int math; //数学成绩 private int english; //英语成绩 private int sum; //总分 public Student(String name,int chinese,int math,int english) { this.name = name; this.chinese = chinese; this.math = math; this.english = english; this.sum = chinese+math+english; } public int getSum() { return sum; } public String getName() { return name; } @Override public String toString() { return "姓名:"+name+"语文成绩:"+chinese+"数学成绩:"+math+"英语成绩:"+english; } }
发表评论
-
javase_22(TCP的理解)
2012-09-02 19:43 675TCP传输 Socket(客户端)和ServerSocket( ... -
javase_21(DUp的学习-->*)
2012-08-30 00:45 735Socket网络编程 网络协议 IP地址与端口号 本 ... -
javase_20(Awt初步认识)
2012-08-27 01:00 1056多线程的再度复习.class package com.jav ... -
javase_19(多线程)
2012-08-24 23:32 905进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次 ... -
javase_18(回顾与反射机制学习)
2012-08-20 11:58 481AM上午总结: package com.ja ... -
javase_17(IO的总结)
2012-08-20 11:55 1077所有的流在使用完毕时,都需要调用close方法进行关流,释放资 ... -
javase_16(其它流)
2012-08-20 11:52 939IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_16(其它流)
2012-08-20 11:38 0IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_15(File类的应用)
2012-08-19 00:07 921File类:用来将文件或者 ... -
javase_13(字符流)
2012-08-19 00:00 644IO(Input OutPut)流 IO流用来处理设备 ... -
javase_12(集合+时间对象)
2012-08-19 00:00 595Map集合 1.Map存储了一系列键值的映射关系2.M ... -
javase_11(集合的理解)
2012-08-19 00:00 902集合类: 为什么使 ... -
javase_10(String类日常操作)
2012-08-18 09:40 853第一: package com.ja ... -
javase_09(面向对象总结)
2012-08-18 09:39 937Java的环境配置 day01 1. 环 ... -
javase_08(基础面试题)
2012-08-18 09:38 796面试题:请说说抽象类和接口的区别 抽象类,使用abstrac ... -
javase_07(继承与设计模式)
2012-08-18 09:36 658/* 子类对象的实 ... -
javase_06(面向对象)
2012-08-18 09:29 724/* 内部类: .在类中定义的类我们称之为内部类, ... -
javase_05(面向对象)
2012-08-16 11:25 0一.构造函数的定义与 ... -
javase_05(面向对象)
2012-08-16 11:22 856一.构造函数的定义与作用 1.函数的名次与类同名2.没有 ... -
javase_04(面向对象)
2012-08-16 11:21 568面向对象:一种编程思想,使用对象来描述生活中的事物:面向对象的 ...
相关推荐
IO流(Input/Output Stream)是Java处理输入输出的关键机制,分为字符流和字节流,覆盖了读写文件、网络通信等多种场景。BufferedReader、FileWriter、InputStreamReader、OutputStream等类是常用的IO类。深入理解流...
1. **Java IO体系结构**:Java IO框架主要包括字节流和字符流,分为输入流和输出流。字节流处理单个字节的数据,如InputStream和OutputStream家族;字符流处理Unicode字符,如Reader和Writer家族。此外,还有缓冲流...
在JavaSE_4_JavaIO操作_2课程中,将进一步深入探讨Java中IO操作的高级概念,包括内存操作流、System类对IO的支持、缓冲区读取、字符编码问题以及JDK1.5新支持的Scanner类等。 内存操作流是指输入输出的位置都在内存...
Java语言进阶_javase_这部分的学习涵盖了Java标准版(Java SE)的高级特性,主要集中在类、流、文件操作和数据结构等多个方面。以下是对这些主题的详细解释: 1. **Object类**:所有Java类都直接或间接继承自Object...
Java IO体系主要包括两个方面:字节流和字符流。字节流主要由`InputStream`和`OutputStream`构成;而字符流则由`Reader`和`Writer`构成。这些基础类构成了整个IO系统的核心,其他流类均继承自这些基本类。 #### ...
包括字节流、字符流、对象流以及缓冲流等。 6. **多线程**:Java提供Thread类和Runnable接口来支持并发编程。通过线程池、同步机制(synchronized关键字、Lock接口)以及并发工具类(如ExecutorService、...
字符串在内存中以Unicode编码存储,每个字符占用两个字节。如果需要修改字符串,实际上会创建一个新的`String`对象。此外,`String`类提供了丰富的操作方法,如`substring()`、`concat()`等。 正则表达式是处理字符...
3. **I/O流**:JavaSE6_API的`java.io`包包含了输入输出流的处理,包括字符流和字节流,如`FileInputStream`、`FileOutputStream`、`BufferedReader`、`PrintWriter`等。此外,NIO(New IO)在Java 6中引入,提供了...
- **IO流**:用于读写文件、网络通信等,包括字节流和字符流。 - **线程**:Java支持多线程编程,可以同时执行多个任务,通过Thread类和Runnable接口实现。 - **反射**:运行时动态获取类的信息并创建对象的能力,...
分为字节流和字符流,以及输入流和输出流。还有缓冲流、对象流、文件流等,用于不同类型的I/O操作。 10. **多线程**:Java提供了内置的多线程支持,通过Thread类和Runnable接口可以创建并运行线程。线程同步和互斥...
Java序列化机制允许将对象的状态转换为字节流,以便存储或在网络上传输。 `constant-values.html`:在这个文件中,列出了所有常量字段的值,包括基本类型和字符串常量。这对于开发者查找特定常量的值非常有帮助。 ...
IO流的学习笔记则可能包括了文件读写、字节流与字符流的概念和实际应用。多线程编程和Swing GUI组件也是笔记中的重要内容,它们对于理解并发编程和创建图形用户界面至关重要。 作业部分则是学习者通过实际编码来...
`day24_04`和`day24_02`分别介绍了转换流`CharacterOutputStream`和`InputStream`,这两个流是字节流和字符流之间的桥梁,允许在字节流和字符流之间进行转换,适应不同的数据格式。 最后,`day24_15`视频展示了如何...
字节流和字符流的主要区别在于处理数据的单位,字节流每次处理一个字节,而字符流处理一个字符(两个字节)。Java中,所有的流都继承自`java.io`包下的抽象类,而不是接口。字节流的主要类有`InputStream`(字节输入...
字节流处理的是8位的字节数据,包括InputStream和OutputStream两个抽象基类,分别用于处理输入和输出。字符流则处理Unicode字符,基于Reader和Writer抽象基类。这两个类层次结构分别对应于字节流的处理,但增加了对...
I/O流允许程序进行输入输出操作,支持字符流和字节流,以及缓冲区、转换流等高级功能。网络编程方面,Java提供了Socket和ServerSocket类,用于实现客户端和服务器之间的通信。 多线程是Java的一大亮点,Thread类和...
6. **IO流**:熟悉输入输出流的基本概念,包括文件读写、字符流与字节流、缓冲流、对象序列化等。 7. **多线程**:掌握线程的创建方式,如Thread类和Runnable接口,线程同步与通信机制如synchronized关键字、wait()...
5. **IO流**:字节流与字符流,缓冲流,对象序列化,文件操作,输入输出流的关闭。 6. **多线程**:线程的创建方式(继承Thread类和实现Runnable接口),线程同步(synchronized关键字,wait(),notify(),...
IO流分为字节流(Byte Stream)和字符流(Character Stream),两者分别处理字节数据和字符数据。 1. 字节流: - **字节输入流(InputStream)**:InputStream是所有字节输入流的父接口,提供了基本的读取字节的...
流分为字节流和字符流,有输入流和输出流之分,以及双向流。此外,还有缓冲流、转换流、对象流和文件流等,提供对数据高效读写的支持。 7. **自定义注解**:自定义注解是Java 5引入的元数据功能,允许在代码中添加...