在这里,我们将给大家分享关于用Java中的BufferedReader重置缓冲区?的知识,让您更了解javabufferreader的本质,同时也会涉及到如何更有效地BufferedReader中的缓
在这里,我们将给大家分享关于用Java中的BufferedReader重置缓冲区?的知识,让您更了解java bufferreader的本质,同时也会涉及到如何更有效地BufferedReader中的缓冲区大小是多少?、BufferedReader默认缓冲区大小?、J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》、Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法的内容。
本文目录一览:- 用Java中的BufferedReader重置缓冲区?(java bufferreader)
- BufferedReader中的缓冲区大小是多少?
- BufferedReader默认缓冲区大小?
- J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》
- Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法
用Java中的BufferedReader重置缓冲区?(java bufferreader)
我正在使用类BufferedReader
在缓冲区中逐行读取。当读取缓冲区的最后一行时,我想再次从缓冲区的开头开始读取。我已经阅读过有关mark()
和的信息reset()
,我不确定它的用法,但我认为它们不能帮助我。
有人知道到达最后一行后如何从缓冲区的开头开始读取吗?像我们可以使用seek(0)
的RandomAccessFile
?
答案1
小编典典标记/重置是您想要的,但是您不能真正在BufferedReader上使用它,因为它只能重置一定数量的字节(缓冲区大小)。如果您的文件大于该文件,它将无法使用。不幸的是,没有“简单”的方法可以做到这一点,但是它并不是很难处理,您只需要原始FileInputStream的句柄即可。
FileInputStream fIn = ...;BufferedReader bRead = new BufferedReader(new InputStreamReader(fIn));// ... read through bRead ...// "reset" to beginning of file (discard old buffered reader)fIn.getChannel().position(0);bRead = new BufferedReader(new InputStreamReader(fIn));
(请注意,不建议使用默认字符集,仅使用简化示例即可)。
BufferedReader中的缓冲区大小是多少?
构造函数中的缓冲区大小是什么意思?
BufferedReader(Reader in, int size)
当我编写程序时:
import java.io.*;class bufferedReaderEx{ public static void main(String args[]){ InputStreamReader isr = null; BufferedReader br = null; try{ isr = new InputStreamReader(System.in);// System.out.println("Write data: ");// int i = isr.read();// System.out.println("Data read is: " + i); //Thus the InputStreamReader is useful for reading the character from the stream System.out.println("Enter the data to be read by the bufferedReader: "); //here isr is containing the lnefeed already so this is needed to be flushed. br = new BufferedReader(isr, 2); String str = br.readLine(); System.out.println("The data is : :" + str); }catch(IOException e){ System.out.println("Can''t read: " + e.getMessage()); } }}
输出:
Enter the data to be read by the bufferedReader: Hello world and hello world againThe data is: Hello world and hello world again
然后,缓冲区大小是什么意思,正如我希望的那样,它只能读取两个字符。但事实并非如此。
答案1
小编典典BufferedReader
顾名思义,缓冲输入。这意味着它会在将输入源传递给您之前从输入源读取到缓冲区。此处的缓冲区大小是指其缓冲的字节数。
从大多数来源读取输入非常慢。仅2个字节的缓冲区将损害性能,因为您的程序很可能大部分时间都在等待输入。缓冲区大小为2时,读取100字节将导致从内存缓冲区中读取2个字节(非常快),填充缓冲区(非常慢),从缓冲区中读取2个字节(非常快),填充缓冲区(非常慢),等等-
整体非常慢。缓冲区大小为100时,读取100字节将导致从内存缓冲区中读取100字节(非常快)-总体而言非常快。假设在读取时缓冲区包含100个字节,这在您这样的情况下是一个合理的假设。
除非您知道自己在做什么,否则应使用很大的默认缓冲区大小。使用较小的缓冲区的原因之一是当您在内存有限的设备上运行时,因为缓冲区占用了内存。
BufferedReader默认缓冲区大小?
根据文档,BufferedReader(Reader)
使用默认缓冲区大小,而第二个构造函数BufferedReader(Reader,int)
允许设置缓冲区大小。
public BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。
但是,文档没有提到默认的缓冲区大小是多少。
BufferedReader的默认缓冲区大小是多少?
答案1
小编典典默认缓冲区大小为8192个字符
http://developer.android.com/reference/java/io/BufferedReader.html
BufferedReader(Reader in)Constructs a new BufferedReader, providing in with a buffer of 8192
characters.
除了本文档之外,我还提取了rt.jar存档,并使用JD-
GUI从java.io.
*反编译了BufferedReader.class ,这是我在类定义中找到的:
private static int defaultCharBufferSize = 8192;
J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》
1. 概念简介
与字节缓冲流BufferedInputStream和BufferedOutputStream对应的,我们还有字符缓冲流BufferedReader和BufferedWriter,顾名思义,它们是带有字符缓冲区的字符输入输出流,原理跟字节缓冲流一样,这两个流也是使用装饰模式对底层字符流进行了包装,并通过字符缓冲区来提高I/O效率,这里不再详细说明。唯一需要注意的是,相对于它们的父类,则两个流分别都新增了一些自己的方法,如下所示:
- BufferedReader新增方法:
String readLine() throws IOException
该方法一次性从输入流中读取一行数据,返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
- BufferedWriter新增方法:
void newLine() throws IOException
该方法向输出流中写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 (''\n'') 符。
2. 字符缓冲流应用示例
下面是两个流的使用示例,代码实现将数据从源文件3.txt复制到目标文件4.txt的功能:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedCharsTest {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader("./src/res/3.txt"));
bw = new BufferedWriter(new FileWriter("./src/res/4.txt"));
String str = null;
while(null != (str = br.readLine())) { //每次读取一行
bw.write(str);
bw.newLine(); //手动添加换行符
bw.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != bw) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
代码运行效果:
注:用上面的代码, 源文件和目标文件都必须是GBK编码的才行,如果两者编码不一致,或者即使两者都是UTF-8编码的,也会出现乱码,如下所示:
原因就是前面在介绍FileReader时所说的那样,是由于FileReader只能以平台默认的字符集GBK来解码数据,FileWriter只能以平台默认字符集来编码数据,因此只要任何一方不是GBK编码的,就会导致乱码,这是需要注意的一点。
Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法
BufferedWriter 和 BufferedReader 为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率比没有缓冲区的高。
一、BufferedWriter 类
构造方法:bufferedWriter bf = new bufferedWriter (Writer out);
主要方法:void write (char ch);// 写入单个字符。
void write (char [] cbuf,int off,int len)// 写入字符数据的某一部分。
void write (String s,int off,int len)// 写入字符串的某一部分。
void newLine ()// 写入一个行分隔符。
void flush ();// 刷新该流中的缓冲。将缓冲数据写到目的文件中去。
void close ();// 关闭此流,再关闭前会先刷新他。
[java] view plain copy
- package Buffered;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.io.IOException;
- public class BufferedWriterDemo {
- public static void main(String[] args) throws IOException {
- FileWriter fw = new FileWriter("Buffered.txt");
- // fw.write("ok168");
- // fw.close();
- /**
- * 为了提高写入的效率,使用了字符流的缓冲区。
- * 创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联。
- */
- BufferedWriter bufw = new BufferedWriter(fw);
- // 使用缓冲区中的方法将数据写入到缓冲区中。
- bufw.write("hello world !");
- bufw.newLine();
- bufw.newLine();
- bufw.write("!hello world !");
- bufw.write("!hello world !");
- // 使用缓冲区中的方法,将数据刷新到目的地文件中去。
- bufw.flush();
- // 关闭缓冲区,同时关闭了 fw 流对象
- bufw.close();
- }
- }
二、BufferedReader 类。
构造方法:BufferedReader br = new BufferReader (Reader in);
主要方法:
int read ();// 读取单个字符。
int read (char [] cbuf,int off,int len);// 将字符读入到数组的某一部分。返回读取的字符数。达到 尾部 ,返回 - 1。
String readLine (); // 读取一个文本行。
void close (); // 关闭该流。并释放与该流相关的所有资源。
自定义的一个 myBufferedReader 类。
[java] view plain copy
- package Buffered;
- import java.io.FileReader;
- import java.io.IOException;
- public class MyBufferedReader {
- private FileReader fr;
- private char []buf = new char[1024];
- private int count = 0;
- private int pos = 0;
- public MyBufferedReader(FileReader f){
- this.fr = f;
- }
- public int myRead() throws IOException{
- if(count == 0){
- count = fr.read(buf);
- pos = 0;
- }
- if(count<0)
- return -1;
- int ch = buf[pos++];
- count--;
- return ch;
- }
- public String myReadLine() throws IOException{
- StringBuilder sb = new StringBuilder();
- int ch = 0;
- while ((ch = myRead()) != -1) {
- if (ch == ''\r'')
- continue;
- if (ch == ''\n'')
- return sb.toString();
- sb.append((char) ch);
- if(count == 0)
- return sb.toString();
- }
- return null;
- }
- public void myClose() throws IOException {
- fr.close();
- }
- }
使用 bufferedReader 和 bufferWriter 方法写的一个复制文本的小程序。
[java] view plain copy
- package IOtest;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- public class TextCopyByBuf {
- /**
- * 首先创建读取字符数据流对象关联所要复制的文件。
- * 创建缓冲区对象关联流对象。
- * 从缓冲区中将字符创建并写入到目的文件中。
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- FileReader fr = new FileReader("C:\\demo.txt");
- FileWriter fw = new FileWriter("D:\\love.txt");
- BufferedReader bufr = new BufferedReader(fr);
- BufferedWriter bufw = new BufferedWriter(fw);
- // 一行一行的寫。
- String line = null;
- while((line = bufr.readLine()) != null){
- bufw.write(line);
- bufw.newLine();
- bufw.flush();
- }
- /* 一個字節一個字節的寫。
- int ch = 0;
- while((ch = bufr.read())!=-1){
- bufw.write(ch);
- }*/
- bufr.close();
- bufw.close();
- }
- }
我们今天的关于用Java中的BufferedReader重置缓冲区?和java bufferreader的分享已经告一段落,感谢您的关注,如果您想了解更多关于BufferedReader中的缓冲区大小是多少?、BufferedReader默认缓冲区大小?、J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》、Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法的相关信息,请在本站查询。
本文标签: