输入流与输出流

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. typedef函数用法

    转载自:http://www.cnblogs.com/ggjucheng/archive/2011/12/27/2303238.html 引言 typedef 声明,简称 typedef,为现有类型创 ...

  2. c#后的完整cookie

    http://www.cnblogs.com/top5/archive/2010/04/11/1709457.html c#设置 webbrowser的请求cookie,可以通过fiddler分析co ...

  3. VS2013的Release模式 和 debug 模式

    在有的情况下,我们可能不能直接利用Debug模式进行程序调试,那么如何在Release模式下进行程序调试呢? 一.将项目属性设置为Release,生成--->配置管理器: 二.按Alt+F7,弹 ...

  4. Ubuntu配置网络遇到的一些问题

    Ubuntu配置网络遇到的一些问题 在配置Ubuntu网络时,曾遇到了一些问题.查找了一些博客,所幸都解决了.记录一下,以便日后查阅. 设置DNS sudo vim /etc/resolv.conf ...

  5. 使用jquery实现省市二级列表

    这里讲用到 jquery 的  each  遍历方法  追加 节点或元素方法  append  appendTO   以及 remove 清除节点 <script> $(function( ...

  6. Python基础-列表、元祖

    1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ['Alex',"Tenglan",'Eric ...

  7. Jekyll搭建个人博客

    网上也有HEXO 搭建的博客,有人说使用 HEXO 在多台电脑上发布博客,操作起来并不是那么方便,所以使用Jekyll 来搭建. Jekyll配置 1,安装ruby环境 Windows系统使用Ruby ...

  8. 设置电脑(windows)自动关机的方法

    下面有三种设置方法可以自动关机. 设置一 定时自动关机 假如你需要电脑在20:20自动关机,那么只需要在“开始”菜单中选择“运行”,然后输入at 20:20 Shutdown -s,点击“确定”即可. ...

  9. [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa

    1294: [SCOI2009]围豆豆Bean Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 458  Solved: 305[Submit][Sta ...

  10. HDU 6336 子矩阵求和

    Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 ...