【java基础】--(3)javaIO详细阐释
1、总的4类
字符:Reader 和Writer
字节:InputStream和OutputStream
2、Reader
六个子类BufferedReader, CharArrayReader, FilterReader,InputStreamReader, PipedReader, StringReader
2.1 BufferedReader
为什么用它?
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的
工作原理?
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
什么时候用?
建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)
示例1:包装InputStreamReader
InputStreamReader又包装System.in
将控制台输入,赋给字符串
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
String str = null;
System.out.println("请输入内容");
try{
str = buf.readLine();
}catch(IOException e){
e.printStackTrace();
}
System.out.println("你输入的内容是:" + str);
子类:LineNumberReader
跟踪行号的缓冲字符输入流
2.2 CharArrayReader
工作原理?
把字符数组作为源的输入流的实现
什么时候用?
缓冲字符数组,读取每个字符的时候
示例1:读取字符数组中每个字符并输出
String strTmp = "abcdefghijklmnopqrstuvwxyz";
int intLen = strTmp.length();
char c[] = new char[intLen];
strTmp.getChars(0,intLen,c,0);
CharArrayReader input1 = new CharArrayReader(c);
CharArrayReader input2 = new CharArrayReader(c,0,5);
int i;
System.out.println("input1 is : ");
while((i=input1.read())!=-1){
System.out.print((char)i);
}
System.out.println();
System.out.println("input2 is : ");
while((i=input2.read())!=-1){
System.out.print((char)i);
}
2.3 FilterReader抽象类
子类:PushbackReader
工作原理?
允许将字符推回到流的字符流
unread(char c) 回压一个字符; unread(char c[]) 回压数组 c 中全部字符
unread(char c[],offset,int n) 回压 c 中从 offset 开始的 n 个字符
为什么用它?
编译原理的一个重要的组成部分叫做词法分析器,就是我上面提到的scanner。对于词法分析程序来说,输入就是源代码,输出就是一个一个的Token(想不出来合适的词),通常词法分析器会一个字符一个字符读取,然后将将这些字符根据一定的规则组成token的序列。有些时候,scanner需要超前读下一个字符才能判断当前的token是否已经结束。例如,int abc=5;这样一个语句,词法分析器要读到=这个字符的时候才能确定abc是一个id,而不是"abc=",这样=已经从输入流中读出来了,但是=又不属于当前的Token,所以要把这个=退回去,这时就要用到pushback。
2.4InputStreamReader
是字节流通向字符流的桥梁
要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in
= new BufferedReader(new InputStreamReader(System.in));
子类:FileReader
工作原理?
用来读取字符文件的便捷类
示例1:读取字符文件并写到数组
路径分隔符:File.separator
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
char[] ch=new char[100];
Reader read=new FileReader(f);
int count=read.read(ch);
read.close();
System.out.println("读入的长度为:"+count);
System.out.println("内容为"+new String(ch,0,count));
2.5 PipedReader
工作原理?
传送的字符输入流。
什么时候用?
管道输入输出流类主要用于线程之间的通信,不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。
示例1:管道输入输出流类用于线程之间的通信(读管道中数据到字符数组,写到管道中)
两个线程
一个读一个写,都用到管道流,并返回管道流对象
主函数中得到输入输出对象
输出对象与输入对象打通管道 t1.connect(t2);
开启各自线程 s.start(); r.start();
PipedInputStream,PipedOutputStream管道输入输出流类主要用于线程之间的通信,不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。
PipedReader,Pipedwriter字符输入输出流类和上面的类似
import java.io.*;
public class PipedStreamTest { public static void main(String[] args) {
// TODO Auto-generated method stub
Sender s=new Sender();
Reciever r=new Reciever();
PipedWriter t1=s.getWriter();
PipedReader t2=r.getReader();
try{
t1.connect(t2);
}
catch(Exception e)
{
e.printStackTrace();
}
s.start();
r.start();
}
}
class Reciever extends Thread
{
PipedReader in=new PipedReader();
public PipedReader getReader()
{
return in;
}
public void run()
{
char [] buf=new char[1024];
try{
int len=in.read(buf);
System.out.println("the following messageid:"+'\n'+
new String(buf,0,len));
in.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Sender extends Thread
{
private PipedWriter out=new PipedWriter();
public PipedWriter getWriter()
{
return out;
}
public void run()
{
String strInfo=new String("hello,how are you doing?");
try{
out.write(strInfo);
out.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
2.6StringReader
工作原理?
其源为一个字符串的字符流。
什么时候用?
StringReader并不常用,因为通常情况下使用String更简单一些。但是在一些需要Reader作为参数的情况下,就需要将String读入到StringReader中来使用了
示例1:统计单词数
StreamTokenizer(reader);需要reader参数
文件未结束:streamTokenizer.nextToken() != StreamTokenizer.TT_EOF
读到单词:streamTokenizer.ttype == StreamTokenizer.TT_WORD
public void countWordsInAString() {
StreamTokenizer streamTokenizer = null;
String stringToBeParsed = "The quick brown fox jumped over the lazy dog";
StringReader reader = new StringReader(stringToBeParsed);
int wordCount = 0;
try {
streamTokenizer = new StreamTokenizer(reader);
while (streamTokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (streamTokenizer.ttype == StreamTokenizer.TT_WORD)
wordCount++;
}
System.out.println("Number of words in file: " + wordCount);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
【java基础】--(3)javaIO详细阐释的更多相关文章
- java基础 lang包 详细介绍
Java.javax和org.其中以java开头的包名是JDK的基础语言包,以javax开头的属 (org是organization的简写).而在JDK API中还包含了一些以com.sun开头的包名 ...
- java基础:进制详细介绍,进制快速转换,二维数组详解,循环嵌套应用,杨辉三角实现正倒直角正倒等腰三角,附练习案列
1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...
- java基础知识及详细笔记
第一章:初识java 1.1.java的概述 ü 什么是计算机程序:计算机按照某种顺序而完成的一系列有序指令的集合. ü Java的作用:1:安装和运行本机上的桌面程序.2:通过浏览器访问面向in ...
- Java基础之多线程详细分析
在了解多线程之前,先来了解一下进程与线程之间的关系. 进程和线程: 进程是指在系统中正在执行的一个程序,每个进程之间是独立的. 线程是进程的一个基本执行单元.一个进程要想执行任务,必须得有线程(每1个 ...
- java基础路线与详细知识点
点击下方打开文件查看 还在持续更新中.....
- Java基础系列8——IO流超详细总结
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 在初学Java时,I ...
- 40道Java基础常见面试题及详细答案
最近看到网上流传着各种面试经验及面试题,往往都是一大堆技术题目贴上去,但是没有答案. 为此我业余时间整理了40道Java基础常见的面试题及详细答案,望各路大牛发现不对的地方不吝赐教,留言即可. 八种基 ...
- 011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三—— 变量值——即Java中的“字面值”
011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三-- 变量值--即Java中的"字面值" 变量值可以是 ...
- 010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二——变量类型——即Java中的数据类型
010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二--变量类型--即Java中的数据类型 Java中变量的三要素 变量名 变 ...
随机推荐
- XCODE6 提交至 App Store
新到一个公司,以前的苹果开发人员离职,临时接手他的苹果代码,需要修改并上线到APP STORE. xcode6.0升级到最新的6.1后, 发现各种坑 1. 路径配置不对, 这个是个人习惯问题,之前的 ...
- OpenCart本地调试环境搭建
OpenCart简介: 免费开源网络版电子商务系统,是建立在线商务网站首选之一.有众多用户和开发基础,结合其丰富特性与模板插件,可最大化定制在线商店.(也就是用来方便开网店的) 本地调试准备: Fir ...
- java问题整理
1.一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制? 答:可以有多个类.但只能有一个public类.并且public类名必须与文件名相一致. 2.Java有没有goto? ...
- javascript——事件处理
<script type="text/javascript"> function EventUtil() { var _self = this; ///添加事件 var ...
- VB.NET中LINQ TO List泛型查询语句(分组,聚合函数)
Public Class LinqToList 'LINQ在C#中使用比较方便,但是在VB中使用比较麻烦,复杂,和C#用法并不太一样 Dim listNew As List(Of Product) = ...
- .htaccess内容
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENA ...
- PHP获取每月第一天与最后一天
<?phpfunction getthemonth($date){$firstday = date('Y-m-01', strtotime($date));$lastday = date('Y- ...
- C语言结构体(struct)使用方法
基本定义:结构体,通俗讲就像是打包封装,把一些变量有共同特征(比如同属于某一类事物的属性)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 struct stuf ...
- arp欺骗
arp欺骗原理 某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后,就会进行数据传输.如果未找到,则广播A一个ARP请求报文(携带主机A的IP地址Ia——物理地址 ...
- IOS--UILabel的使用方法详细
IOS-UILabel的使用方法详细 //UILabel的使用 UILabel *oneLabel = [[UILabel alloc] init]; // 最经常使用的 oneLabel.fra ...