inputstreamreader input音响按键
大家好,今天小编来为大家解答以下的问题,关于inputstreamreader,input音响按键这个很多人还不知道,现在让我们一起来看看吧!
InputStreamReader.read()详解
在最一开始,我们先明确InputStreamReader和InputStream的区别:InputStreamReader用于读取字符,而InputStream用于读取字节
public abstract int read() throws IOException
从输入流中读取数据的一个字符(可以从中读入一个字节序列的对象称为输入流,这些字节序列可以来自文件、网络、内存块)。
以整数的形式返回读入的这个字符(其实就是ASC码),也就是一个0-255的整数。
如果已经到达流末尾而没有可用的字节,则返回值-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
public int read(byte[] cbuf, int offset, int length) throws IOException
将输入流中最多 length个字符读入 byte数组(缓冲区)。尝试读取 length个字符,但读取的字节也可能小于该值。
以整数形式返回实际读取的字符数。
如果已经到达流末尾而没有可用的字符,则返回值-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
如果 len为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字符。如果因为流位于文件末尾而没有可用的字字符,则返回值-1;否则,至少读取一个字节并将其存储在 b中。
将读取的第一个字节存储在元素 b[offset]中,下一个存储在 b[off+1]中,依次类推。读取的字符数最多等于 length。设 k为实际读取的字节数,这些字节将存储在 b[offset]到 b[off+k-1]的元素中,不影响 b[off+k]到 b[off+len-1]的元素。
在任何情况下,b[0]到b[off]的元素以及b[off+len]到b[b.length-1]的元素都不会受到影响。
此方法重复调用方法 read()。如果第一次这样的调用导致 IOException,则从对 read(cbuf, offset, length)方法的调用中返回该异常。如果对 read()的任何后续调用导致IOException,则捕获该异常并将其视为到达文件末尾;到达该点时读取的字符存储在 cbuf中,并返回发生异常之前读取的字节数。在已读取输入数据len的请求数量、检测到文件结束标记、抛出异常前,此方法的默认实现将一直阻塞。建议子类提供此方法更为有效的实现。
理解不了BufferedReader的大小有什么作用
1、java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
2、从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。
3、System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。例如:
BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
下面的示例示范了BufferedReader和BufferedWriter的使用。可以在文字模式下输入字符,程序会将输入的文字存储至指定的文件中,如果要结束程序,输入quit字符串即可。
Java代码:
package ysu.hxy;
import java.util.*;
import java.io.*;
public class BufferedReaderWriterDemo{
public static void main(String[] args){
try{
//缓冲System.in输入流
//System.in是位流,可以通过InputStreamReader将其转换为字符流
BufferedReader bufReader= new BufferedReader(new InputStreamReader(System.in));
//缓冲FileWriter
BufferedWriter bufWriter= new BufferedWriter(new FileWriter(args[0]));
String input= null;
//每读一行进行一次写入动作
while(!(input= bufReader.readLine()).equals("quit")){
bufWriter.write(input);
//newLine()方法写入与操作系统相依的换行字符,依执行环境当时的OS来决定该输出那种换行字符
bufWriter.newLine();
}
bufReader.close();
bufWriter.close();
} catch(ArrayIndexOutOfBoundsException e){
System.out.println("没有指定文件");
} catch(IOException e){
e.printStackTrace();
}
}
}
//运行后会在目录下产生一个文件test2.txt,并在其中写入刚才输入的内容。
Java BufferedReader和Scanner的区别及使用技巧
Java中BufferedReader和Scanner的核心区别在于:BufferedReader适合高效读取大文本,Scanner便于解析多类型数据。以下从设计目的、性能特点、使用场景及技巧展开详细说明:
一、设计目的与底层机制BufferedReader
定位:字符流的包装类,基于InputStreamReader工作,通过缓冲机制提升读取效率。
底层机制:按行读取文本(readLine()),每次读取默认8KB缓冲区内容,减少系统调用次数。
更接近底层IO操作,仅提供字符串级别的读取,不涉及数据类型解析。
Scanner
定位:专为解析基本类型(如整数、浮点数)和字符串设计的工具类。
底层机制:内部使用正则表达式分词,支持从字符串、文件、标准输入等多种源读取数据。
提供nextInt()、nextDouble()等方法,自动将输入转换为指定类型。
二、性能对比大规模输入场景
BufferedReader:性能显著更高。例如读取10万行数字时,可能仅需几百毫秒,因其减少了系统调用和内存分配开销。
Scanner:每次调用next()需正则匹配和分词判断,开销较大,同样任务可能慢数倍。
小规模或交互式输入
两者性能差异不明显,但Scanner的便捷性更突出。
三、使用技巧与推荐场景优先使用BufferedReader的情况读取大文件或网络流
示例:处理日志文件、网络数据传输等需高效读取的场景。
BufferedReader br= new BufferedReader(new FileReader("largefile.txt"));String line;while((line= br.readLine())!= null){ System.out.println(line);//逐行处理}仅需按行处理文本内容
如统计行数、过滤特定行等无需解析类型的操作。
追求高性能输入(如竞赛编程)
算法竞赛中常用于快速读取大量测试数据。
优先使用Scanner的情况解析混合类型数据
示例:一行输入包含整数、浮点数和字符串时,可直接调用nextInt()、nextDouble()、next()。
Scanner sc= new Scanner(System.in);int age= sc.nextInt();double salary= sc.nextDouble();String name= sc.next();快速原型开发或教学演示
代码简洁,适合快速验证逻辑或教学场景。
输入格式不规则,需灵活分割
可通过useDelimiter()自定义分隔符(如逗号、分号等)。
Scanner sc= new Scanner("1,2,3");sc.useDelimiter(",");while(sc.hasNextInt()){ System.out.println(sc.nextInt());}四、常见注意事项Scanner的换行符问题
调用nextInt()或nextDouble()后,换行符可能残留在缓冲区,导致后续nextLine()读取到空字符串。
解决方案:在数值读取后添加sc.nextLine()消费换行符,或统一使用nextLine()并手动解析字符串。
流结束判断
BufferedReader的readLine()返回null表示流结束。
Scanner需通过hasNext()或hasNextLine()判断。
资源关闭
两者均需关闭资源,推荐使用try-with-resources自动管理。
try(BufferedReader br= new BufferedReader(new FileReader("file.txt")); Scanner sc= new Scanner(new File("data.txt"))){//操作代码}性能敏感场景优化若需用Scanner处理大规模数据,可调整缓冲区大小(通过BufferedReader包装Scanner的输入源)。
五、总结:如何选择?选BufferedReader:
读取大文件、网络流或追求极致性能。
仅需按行处理文本,无需解析类型。
选Scanner:
输入数据类型多样(如混合整数、字符串)。
开发效率优先(如快速原型、教学)。
需灵活分割输入(如自定义分隔符)。
核心原则:根据场景权衡速度与便利性,合理选择工具类可显著提升代码效率与可读性。
关于inputstreamreader,input音响按键的介绍到此结束,希望对大家有所帮助。