JAVA学习第五十课 — IO流(四)转换流

一、键盘录入

System.out:标准输出设备,控制台

System.in:标准输入设备,键盘

输入演示

输入字符串遇到回车,打印,输入over,输入结束

PS:键盘的录入只读取一个字节,先将字节拼一个字符串,所以需要一个容器,再参与over的判断

import java.io.*;

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

		InputStream in = System.in;
		StringBuilder sb =  new StringBuilder();
		int t = 0;
		while(true){
			t = in.read();Windows下回车是'\r\n'
			if(t== 13)continue;//'\r' = 13
			if(t==10){//'\n' = 10
				String str = sb.toString();
				if(str.equals("over"))
					break;
				System.out.println(str);
				sb.delete(0, sb.length());//注意情况,否则字符串会越来越长
			}
			else {
				sb.append((char)t);
			}
		}
		System.out.println(t);
	}
}

read():是阻塞式方法,没数据就一直等待

注意:默认的输入输出设备不要关,一旦关闭,以后再也无法创建流对象了

二、转换流

因为有readLine()方法,就不必要一个字符一个字符的读取,这就涉及到了字符流转换到字符流

在Reader类中有一个InputStreamReader()类,用来转换字节与字符

API文档解释:InputStreamReader是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。

而字符流的由来:字符流+编码表

字节流转字符流

import java.io.*;

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

		InDemo();
	}

	public static void InDemo() throws IOException{

		InputStream in  = System.in;//字节流

		InputStreamReader ins = new InputStreamReader(in);//转换字符流

		BufferedReader br = new BufferedReader(ins);//缓冲区,增强

		String str = null;
		while((str = br.readLine())!=null){
			if(str.equals("over"))break;

			System.out.println(str);
		}
	}
}

字符流转字节流

在Writer类下有OuputStreamWriter类

API文档解释:OutputStreamWriter是字符流通向字节流的桥梁:可使用指定的charset 将要写入流中的字符编码成字节。

import java.io.*;

public class Main
{
	private static String LINE_SEPARATOR = System.getProperty("line.separator");
	public static void main(String[] args) throws IOException {

		InDemo();
	}

	public static void InDemo() throws IOException{

		/*InputStream in  = System.in;//字节流

		InputStreamReader ins = new InputStreamReader(in);//转换字符流

		BufferedReader br = new BufferedReader(ins);*/
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		/*OutputStream out = System.out;//标准输出流

		OutputStreamWriter osw = new OutputStreamWriter(out);

		BufferedWriter bw = new BufferedWriter(osw);*/

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

		String str = null;

		while((str = br.readLine())!=null){
			if(str.equals("over"))break;
			//将字符数据用缓冲区对象写入缓冲区中,最终目的地osw->out->控制台
			bw.write(str+LINE_SEPARATOR);
			bw.flush();
		}
	}
}

三、转换流演示

将数据写到文本文件中

import java.io.*;

public class Main
{
	private static String LINE_SEPARATOR = System.getProperty("line.separator");
	public static void main(String[] args) throws IOException {

		InDemo();
	}

	public static void InDemo() throws IOException{

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("acm.txt")));

		String str = null;

		while((str = br.readLine())!=null){
			if(str.equals("over"))break;
			bw.write(str+LINE_SEPARATOR);
			bw.flush();
		}
	}
}

将一个文本文件显示到控制台

import java.io.*;

public class Main
{
	private static String LINE_SEPARATOR = System.getProperty("line.separator");
	public static void main(String[] args) throws IOException {

		InDemo();
	}

	public static void InDemo() throws IOException{

		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("acm.txt")));

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

		String str = null;

		while((str = br.readLine())!=null){
			if(str.equals("over"))break;
			bw.write(str+LINE_SEPARATOR);
			bw.flush();
		}
	}
}

将一个文件的内容复制到另一个文件中

import java.io.*;

public class Main
{
	private static String LINE_SEPARATOR = System.getProperty("line.separator");
	public static void main(String[] args) throws IOException {

		InDemo();
	}
	public static void InDemo() throws IOException{

		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("acm.txt")));

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("A.txt")));

		String str = null;

		while((str = br.readLine())!=null){
			if(str.equals("over"))break;
			bw.write(str+LINE_SEPARATOR);
			bw.flush();
		}
	}
}

上述三个例子,改变的只是流的源和目的地

时间: 2024-12-28 00:49:51

JAVA学习第五十课 — IO流(四)转换流的相关文章

JAVA学习第五十一课 — IO流(五)流的操作基本规律

转换流: InputStreamReader:字节到字符的桥梁.解码 OutputStreamWriter:字符到字节的桥梁.编码 流的基本规律 1.明确源和汇 源:InputStream.Reader 汇:OutputStream.Writer 2.明确数据是否是纯文本数据 源:如果是,Reader,否,InputStream 汇:如果是,Writer,否,OutputStream 前两点明确后院,体系也就明确了 3.明确具体的设备 源设备: 硬盘:File 键盘:System.in 内存:

JAVA学习第五十三课 — IO流(七)File对象练习 & Properties集合

一.练习 深度遍历文件夹 深度遍历很自然而然想到递归,而递归就很自然的想到其实现的底层算法是栈 对指定目录下列出所有内容(包含子目录的内容) PS:建议不要遍历C盘 import java.io.*; public class Main { public static void main(String[] args) throws IOException { File dir = new File("D:\\ACM集训"); ListAllDemo(dir,0); } public s

JAVA学习第五十七课 — IO流(十一)

一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该连接到管道输出流:管道输入流提供要写入管道输出流的全部数据字节.通常,数据由某个线程从 PipedInputStream 对象读取,并由其它线程将其写入到对应的 PipedOutputStream. 不建议对这两个对象尝试使用单个线程.由于这样可能死锁线程. 管道输入流包括一个缓冲区.可在缓冲区限定

JAVA学习第五十四课 — IO流(八)打印流 & 序列流

一.综合练习-文件清单列表 获取指定目录下,指定扩展名的文件(含子目录),并将这些文件的绝对路径写到一个文本文件中.也就是建立一个指定扩展名的文件列表 1.深度遍历 2.过滤器->容器 3.写入文件 import java.util.List; import java.io.*; import java.util.ArrayList; public class Main { public static void main(String[] args) throws IOException { F

JAVA学习第五十二课 — IO流(六)File对象

File类 用来给文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作 File对象可以作为参数传递给流的构造函数 一.构造函数和分隔符 public static void FileDemo() {//构造函数演示 //可以将一个已存在或不存在的文件或目录封装成File对象 File file = new File("d:\\a.txt"); File file2 = new File("d:","a.txt"); File file

JAVA学习第五十五课 — IO流(九)文件切割合成器

文件切割器 private static final int SIZE = 1024 *1024; public static void splitFile(File file) throws IOException{ //用读取流关联文件(不确定文件格式) FileInputStream fis = new FileInputStream(file);//源是一个 byte[] by = new byte[SIZE];//定义1M的缓冲区 FileOutputStream fos = null

JAVA学习第五十六课 — IO流(十)对象的序列化和反序列化 & RandomAccessFile

操作对象 ObjectInputStream.ObjectOutputStream 被操作的对象需要实现Serializable(标记接口) ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStream 读取(重构)对象.通过在流中使用文件可以实现对象的持久存储.如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的

JAVA学习第五十九课 — 网络编程概述

网络模型 OSI(Open System Interconnection)开放系统互连:參考模型 TCP/IP 网络通讯要素 IP地址 port号 传输协议 网络參考模型 七层OSI模型的基本概念要了解 网际层协议:包含:IP协议.ICMP协议.ARP协议.RARP协议. 传输层协议:TCP协议.UDP协议. 应用层协议:FTP.Telnet.SMTP.HTTP.RIP.NFS.DNS. 要真正实现网络通讯,首先要找到IP地址,IP地址是网络通讯的一大要素 IP地址:InetAddress 网络

JAVA学习第五十八- GUI

GUI Graghical User Interface(图形用户接口) java为GUI提供的对象都存在java.awt和java.swing包中 Java的GUI做的的确干不过C++等,不打算浪费过多的时间在这上面 一个简单的窗体演示 public static void main(String[] args){ Frame f = new Frame("新窗体"); f.setLocation(400, 200);//设置窗体的位置 f.setSize(500, 400);//设