IO流的操作规律

流的操作规律
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适.
想知道开发时用到哪些对象,只要通过四个明确即可
1.明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据.
源: 是纯文本  Reader
否  InputStream
目的: 是纯文本  Writer
否  OutputStream
到这里,就可以明确需求中具体要使用哪个 体系了
3.明确具体的设备
源设备:
硬盘: File
键盘: System.in
内存:数组
网络:Socket流
目的设备:
硬盘: File
控制台: System.out
内存:数组
网络:Socket流
4.是否需要其他额外功能
a.是否需要高效(缓冲区)
是,就加上buffer
b.转换流  InputStreamReader OutputStreamWriter

需求1:复制一个文本文件
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,源:Reader
  目的:Writer
c.明确具体设备
源:硬盘  File
目的:硬盘 File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
d.需要额外功能
需要,高效,
BufferedReader buff = 
new BufferedReader(fr);
BufferedWriter bufw = new BufferedWriter(fw);

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class BufferedCopy {

   public static void main(String[] args)throws IOException {

      //创建BufferedReader一样,必须先有流。

      FileReader fr = new FileReader("tempfile\\buf.txt");

      BufferedReader bufr = new BufferedReader(fr);

      //创建一个字符写入流的缓冲区。应该先创建流。

       FileWriter fw = new FileWriter("tempfile\\buf2.txt");

      BufferedWriter bufw = new BufferedWriter(fw);

      String line = null;

      while((line=bufr.readLine())!=null){

         bufw.write(line);

//       换行

         bufw.newLine();

         bufw.flush();

      }

      bufr.close();

      bufw.close();

   }

}   

需求2:读取键盘录入信息,并写入到文本文件中
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,源:Reader
  目的:Writer
c.明确具体设备
源:键盘  System.in
目的:硬盘 File
InputStream in = System.in;//字节流,使用InputStreamReader
FileWriter fw = new FileWriter("b.txt");
这样做可以完成,但是麻烦,将读取的字节数据转成字符串,再由字符流操作
d.需要额外功能
转换.将字节流围成字符流,因为明确的源是Reader,这样操作方便数据时,便捷.所以要将已有的字节流转成字符流.使用字节-->字符  使用InputStreamReader
InputStreamReader isr = 
new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
需要,高效,
BufferedReader buff = 
new BufferedReader(isr);

BufferedWriter bufw = new BufferedWriter(fw);

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

public class ReadKeyDemo {

   public static void main(String[] args) throws IOException {

       BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//记住:以后读取键盘都用这句,可以背下来。

       BufferedWriter bufw = new BufferedWriter(new FileWriter("d:/a.txt"));

       String line = null;

         while((line=bufr.readLine())!=null){

            //如果输入over,程序结束

            if("over".equals(line))

            {

                break;

            }

            bufw.write(line);

//          换行

            bufw.newLine();

            bufw.flush();

         }

         bufr.close();

         bufw.close();

   }

}

需求3:将一个文件文件内容显示在控制台上
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,
 源:Reader
 目的:Writer
    c.明确具体设备
    源:硬盘:File
    目的:控制台:System.out

    FileReader fr = new FileReader("a.txt");
    OutputStream out = System.out;//这样输出内容很麻烦,使用转换流
    d.需要额外功能吗?
    需要:
    转换流
    FileReader fr = new new FileReader("a.txt");
    OutputStreamWriter osw = new OutputStreamWriter(System.out);
    高效,buffer
    BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.IOException;

import java.io.OutputStreamWriter;

public class ReadKeyDemo {

   public static void main(String[] args) throws IOException {

      BufferedReader bufr = new BufferedReader(new FileReader("d:/a.txt"));

      BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

      String line = null;

         while((line=bufr.readLine())!=null){

            bufw.write(line);

//          换行

            bufw.newLine();

            bufw.flush();

         }

         bufr.close();

         bufw.close();

   }

}

需求4:读取键盘录入数据,显示在控制台上
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,
 源:Reader
 目的:Writer
    c.明确具体设备
    源:键盘:System.in
    目的:控制台:System.out
    InputStream in = System.in;
    OutputStream out = System.out;
    d.明确额外功能?
    需要转换,因为都是字节流,但是操作的却是文本数据
    所以使用字符流操作起来更为便捷
    InputStreamReader isr = 
    new InputStreamReader(System.in);
    OutputStreamWriter osw = 
    new OutputStreamWriter(System.out);
    为了将其高效
    BufferedReader bufr = new BufferedReader(isr);
    BufferedWriter bufw = new BufferedWriter(osw);

/**
录入键盘输入字母并将小写变为大写
*/
import java.io.*;
class readin
{
	public static void main(String[] args)throws IOException
	{
		InputStream in = System.in;//引入输入流
		InputStreamReader isr = new InputStreamReader(in);
		StringBuilder sb = new StringBuilder();//新建一个缓冲区
		while(true)
		{
			int ch = in.read();//读入键盘输入
			if(ch=='\r')
				continue;
			if(ch=='\n')
			{
				String s = sb.toString();//讲读入输入转换为字符型
				if("over".equals(s))//判断S是否为OVER
					break;
				else
					System.out.println(s.toUpperCase());//打印出字母大写
				sb.delete(0,sb.length());
			}
			else
				sb.append((char)ch);
		}
	}
}

什么时候使用转换流呢?
  1.源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高对文本操作的便捷.
  2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流

时间: 2024-11-09 00:21:02

IO流的操作规律的相关文章

Java---IO加强(3)-IO流的操作规律

一般写关于操作文件的读取的几个通用步骤!!! 1.明确源和目的. 源:InputStream Reader 一定是被读取的. 目的:OutputStream Writer 一定是被写入的. 2.处理的数据是否是纯文本的数据? 是:使用字符流.Reader Writer 否:使用字节流. InputStream OutputStream 到这里,两个明确确定完,就可以确定出要使用哪个体系.接下来,就应该明确具体这个体系要使用哪个具体的对象.(看顶层) 3.明确数据所在的设备. 到这里,具体使用哪个

java 标准Io流

问题描述 我想问下,为什么java里面要有标准IO流,有了字节流和字符流,不就可以了吗.为什么啊,我晕. 问题补充:blessed24 写道 解决方案 标准IO指计算机的的输入设备和输出设备,搞这些的吧,为了兼容不同系统,不同物理设备的输入与输出!解决方案二:引用是不是说,只有标准Io实现了跨平台,其他的流都不是跨平台的?标准IO 一般所有的操作系统都是一样的...windows要遵循,linux也一样吧....解决方案三:引用inpublic static final InputStream

java基础知识——网络编程、IO流

IO流 字节流:处理字节数据的流对象,计算机中最小数据单元就是字节.InputStream OutputStream 字符流:字符编码问题,将字节流和编码表封装成对象就是字符流.Reader Write 读.写都会发生 IO 异常.io 异常的处理方式 :io 一定要写 finally.fw.flush();//刷新缓冲区,fw.close()://关闭流. IO 中的使用到了一个设计模式: 装饰设计模式. 装饰设计模式解决:对一组类进行功能的增强. 包装:写一个类(包装类)对被包装对象进行包装

文件和 流-刚接触IO流和文件操作有许多不懂,请大神们来教教这些定义是什么意思

问题描述 刚接触IO流和文件操作有许多不懂,请大神们来教教这些定义是什么意思 File f1 = new File(dir, name);//什么意思,不懂啊. FileOutputStream out = new FileOutputStream(path);//什么意思,不懂啊. FileInputStream in = new FileInputStream(path);//什么意思,不懂啊. FileOutputStream fout = new FileOutputStream(xxx

Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:登录注册IO版本案例(掌握) 要求,对着写一遍. cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImpl(实现我不管)

too many open files-Log4J中Logger如何关闭IO流

问题描述 Log4J中Logger如何关闭IO流 在项目由于日志需要对日志进行扩展,根据交易号和日期生成logger对象放入队列中,每天会清除之前的日志对象,刚开始没有发现问题,大约到了1个月左右,生产中报了java.net.SocketException:too many open files异常,首先整个系统中除了日志外,只有读取配置文件的两个本地IO操作,其他的是网络IO,其次在早上没有大规模并发请求,除了心跳报文外,其他无请求,综合上述可以将问题定位在日志上.仔细想每天我只是把日志对象从

Java中IO流缓冲区的装饰模式的体现

一.Java中IO流缓冲区 import java.io.*; public class BufferedTest {public static void copy1(){InputStream is = null;OutputStream os = null;try{is = new FileInputStream("c:\\xy1.jpg");os = new FileOutputStream("d:\\xy2.jpg");int len = 0;byte[]

io流-java中的IO流使用情况

问题描述 java中的IO流使用情况 java中有很多读取和写入文件的操作 像FileWirter Writer Reader BufferWriter 等 我一直区分不清这几个的特点,有没有大神帮忙处理下,通常什么情况使用什么比较好.各有那些优点和缺点 解决方案 你可以上网搜索哦下,很多的 解决方案二: 有的有缓冲区,有的没有,有的没有:有的可以操纵字符文件,有的可以操纵字节文件,你可以按照这个进行分类 解决方案三: 这是我自己整理的,你可以参考下http://blog.csdn.net/ev

Java IO: 流

原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO流是既可以从中读取,也可以写入到其中的数据流.正如这个系列教程之前提到过的,流通常会与数据源.数据流向目的地相关联,比如文件.网络等等. 流和数组不一样,不能通过索引读写数据.在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件.流仅仅只是一个连续的数据流. 某些类似PushbackInputStream 流的实现允许你将数据重新推回