输入流与输出流

1,流的分类:字节流和字符流 区别如下:

1,字节流(8位Unicode)在操作的时候本身是不会用到缓冲区(内存)的byte,是与文件本身直接操作的,而字符流(16位Unicode)在操作的时候是使用到缓冲区的char

2,字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,

并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

3,在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。

2,File类

3,I\O流

1,

输入流:从其他数据源写入到代码内存

输出流:从代码内存写入到指定数据源中

2,流分类:

1,节点流有:FileInputStream,FileReader,ArrayInputStream等,对接数据源

处理流:套接在节点流(或处理流)之上的

2,缓存流有:BufferedInputStream,BufferedReader等加快读写速率

3,数据流有:DataInputStream减少数据类型的转换,在网络编程多

4,对象流有:ObjectInputStream,需要对对象序列化,网络编程多

5,打印流有:Print,控制输入,输出的目的地。

3,案例

3.1 字节流进行文件copy

static void testByte(String source ,String target){
final int SIZE=1024;
try {
InputStream in=new FileInputStream(source);// 快捷键:ctrl+alt+t try..catch
BufferedInputStream bufIn=new BufferedInputStream(in,SIZE);
OutputStream out=new FileOutputStream(target,true);
BufferedOutputStream bufOut=new BufferedOutputStream(out);
byte [] byteArr=new byte[SIZE];// if inbuf.size>byte.length ,will have Exception:String index out of range: 105
int len;
while((len=bufIn.read(byteArr))!=-1){
//in.read(buf) 注意点:read()为原生方法,该方法能记录住你上次读取的位置,所以while不会每次都重头开始读文件
//in.read(buf) 将读取的文件字节保存到buf中,并返回读取了多少字节
//Buffer的作用即将文件中先读入缓存,需要先满足Buff的数组容量,(所以byteArr的容量要大于BuffSize)然后将缓存中一起读入byteArr中,
避免一字节一字节来读到byteArr中
bufOut.write(byteArr,0,len);//如果没有len,会按SIZE来写,不足用NULL填充
}
bufOut.flush();
bufOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}

3.2 字符流进行文件copy

//通过字符进行copy文件,使用Buffer和File
static void testChar(String source ,String target){
final int SIZE=1024;
try {
Reader in=new FileReader(source);// 快捷键:ctrl+alt+t try..catch
BufferedReader bufIn=new BufferedReader(in,SIZE);
Writer out=new FileWriter(target, true);//是否对文件进行追加处理
BufferedWriter bufOut=new BufferedWriter(out);
String temp;
bufOut.write("使用字符操作的结果");
while((temp=bufIn.readLine())!=null){
bufOut.write(temp);//不包括换行符,这里
bufOut.newLine();//没该句就不会换行
}
bufOut.flush();
bufOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}

3.3 byteArray和DataInput测试

//数据流 byteArray和Data
static void testByteData(){
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
DataOutputStream dataOut=new DataOutputStream(byteOut); try {
dataOut.writeUTF("你好啊");//用writeChars,导致后面无法读
dataOut.writeDouble(0.33334);
dataOut.close();
System.out.println(byteOut.size()+""+byteOut.toByteArray().length);//19 19即字节的个数
ByteArrayInputStream byteIn=new ByteArrayInputStream(byteOut.toByteArray());//需要在写完后读,即需要读取最新的
DataInputStream dataIn=new DataInputStream(byteIn);
System.out.println(dataIn.readUTF());
System.out.println(dataIn.readDouble());
dataIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}

3.4 File字节流和Data字符流

//数据流 Data和File
static void testeFileData(String target){
String[] name={"知识","zsf","succ"};
double[] hig={13.4,34.4,43,24};
int[] age={34,243,34};
try {
OutputStream out=new FileOutputStream(target);
BufferedOutputStream buf=new BufferedOutputStream(out,1024);
DataOutputStream dataOut=new DataOutputStream(buf);
for(int i=0;i<3;i++){
dataOut.writeUTF(name[i]);
dataOut.writeChar('\t');
dataOut.writeDouble(hig[i]);
dataOut.writeChar('\t');
dataOut.writeInt(age[i]);
dataOut.writeChar('\n');
}
dataOut.close();
InputStream in=new FileInputStream(target);
BufferedInputStream bufIn=new BufferedInputStream(in,1024);
DataInputStream dataIn=new DataInputStream(bufIn);
String str=null;
for(int i=0;i<3;i+=1){//需要事先知道文件中存储的格式和行数
System.out.print(dataIn.readUTF());
dataIn.readChar();
System.out.print(dataIn.readDouble());
dataIn.readChar();
System.out.print(dataIn.readInt());
dataIn.readChar();
}
} catch (IOException e) {
e.printStackTrace();
}
}

3.5 对象流和byteArray流

void testObjectByte(){
User user1=new User("知识",4);
User user2=new User("知识",4);
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
try {
ObjectOutputStream objOut=new ObjectOutputStream(byteOut);
objOut.writeObject(user1);
objOut.writeObject(user2);
byte[] data=byteOut.toByteArray();//
ByteArrayInputStream byteIn=new ByteArrayInputStream(data);
ObjectInputStream objIn=new ObjectInputStream(byteIn);
User u=(User)objIn.readObject();
System.out.println(u.age+"\t"+u.name);
System.out.println(objIn.readObject());
} catch (Exception e) {
e.printStackTrace();
}
}
class User implements Serializable{
private static final long serialVersionUID = 1L;
public String name;
public int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return name+"\t"+age;
}
}

3,6 文件流和对象流

 class User implements Serializable{
private static final long serialVersionUID = 1L;
public String name;
public int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return name+"\t"+age;
}
}
//对象流和文件 字符型没有该方法
void testObjectFile(String source){
User user1=new User("你好",5);
User user2=new User("你好",5);
try {
OutputStream outputStream=new FileOutputStream(source);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(user1);
objectOutputStream.writeObject(user2);
InputStream inputStream=new FileInputStream(source);
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
User user=(User)objectInputStream.readObject();
System.out.println(user.name+"\t"+user.age);
System.out.println(objectInputStream.readObject());
} catch (Exception e) {
e.printStackTrace();
} }

3.7 转换流

//转换流
static void testSteamReader(String source,String target){
try {
InputStream in=new FileInputStream(source);
Reader reader=new InputStreamReader(in,"utf-8");
BufferedReader bufRead=new BufferedReader(reader);
CharArrayWriter charArr=new CharArrayWriter();
FileWriter writer=new FileWriter(target);
String line;
while((line=bufRead.readLine())!=null){
System.out.println(line+"okl");
charArr.write(line);
System.out.println(charArr.toString());
writer.write(line);
} } catch (Exception e) {
e.printStackTrace();
}
}

4 小结

1,关键总结输出流和输入流

2,节点流和处理流的应用场景

3,多看api

java学习之输入,输出流的更多相关文章

  1. java学习笔记-输入输出流

    ================File类 =====================InputStream ==================OutputStream ============== ...

  2. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  3. Java复习7.输入输出流

    Java复习7.输入输出流 20131005 前言: Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别.如 ...

  4. JAVA Io 缓冲输入输出流

    java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...

  5. Java I/O输入输出流详解

    一.文件的编码               开发时一定要注意项目默认的编码!!!!!!!!               文件操作的时候一定要记得关闭!!!!!!!!        ASCII:美国标准 ...

  6. java实验8-Java输入输出流

    1 读写文件 [实验目的] (1)掌握文本文件的读写方法. (2)掌握随机文件的读写方法. (3)掌握InputStream.OutputStream抽象类的基本使用. (4)掌握FileInputS ...

  7. Java工具类-输入输出流

    输入输出流 1.概念 输入输出流:文件复制,上传 输出流: System.out.println() 写操作,程序将字符流写入到"目的地",比如打印机和文件等 输入流 :Scann ...

  8. Java中的输入输出流

    FileInputStream和FileOutputStream 创建含磁盘文件的输入 输出流对象. FileInputStream继承自InputStream,用于读取本地文件中的字节数据,由于所有 ...

  9. 《三》Java IO 字节输入输出流

    那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)     ...

随机推荐

  1. codeforces ice cave

    /// /// 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎 /// DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了:2. ...

  2. 使序列有序的最少交换次数(minimum swaps)

    交换相邻两数 如果只是交换相邻两数,那么最少交换次数为该序列的逆序数. 交换任意两数 数字的总个数减去循环节的个数?? A cycle is a set of elements, each of wh ...

  3. linux常用60条命令 转

    Linux必学的60个命令   Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命 ...

  4. java1.7集合源码阅读:ArrayList

    ArrayList是jdk1.2开始新增的List实现,首先看看类定义: public class ArrayList<E> extends AbstractList<E> i ...

  5. oracle 批量改temp/data/redo file的路径

    批量生成修改路径的脚本.select 'alter database rename file ''' || name ||'''' || ' to '''|| substr(name,0,instr( ...

  6. Request的Body只能读取一次解决方法

    一.需要一个类继承HttpServletRequestWrapper,该类继承了ServletRequestWrapper并实现了HttpServletRequest, 因此它可作为request在F ...

  7. 第二部分:Spring中配置mongodb

    一.需要引用的jar包 1.spring-data-mongodb-1.9.4.RELEASE.jar 2.spring-data-commons-1.12.11.RELEASE.jar 3.mong ...

  8. linux 系统的负载与CPU、内存、硬盘、用户数监控脚本[marked]

    转载文章 原始出处  在没有nagios监控的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统资源的使用情况. 一.编写linux系统告警邮件脚本 # vim /scripts/sy ...

  9. HDU 2546.饭卡-动态规划0-1背包

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  10. Codeforces 940F Machine Learning (带修改莫队)

    题目链接  Codeforces Round #466 (Div. 2) Problem F 题意  给定一列数和若干个询问,每一次询问要求集合$\left\{c_{0}, c_{1}, c_{2}, ...