- 浏览: 919591 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
PrintWriter因其简单易用、灵活而强大的格式化输出能力从而在字符流输出方面得到了越来越多的使用,不过以下两点还是需要强调一下:
一、PrintWriter带缓冲吗?一般而言是否带有缓冲对IO的性能影响非常大,而关于PrintWriter是否带有缓冲这一点在JDK中并没有统一而明确的阐述,下面就从两个不同的层次讨论一下这个问题:
1)BufferedWriter缓冲:事实上PrintWriter共有八个构造器,除了最后两个以Writer作为参数的构造器外,其他六个构造器都会在内部创建一个BufferedWriter,然后再使用该BufferedWriter作为参数去调用最后一个构造器从而完成PrintWriter对象的创建,因此通过前六个构造器创建的PrintWriter本身是带有BufferedWriter缓冲的,而通过后两个构造器创建的PrintWriter对象是否也有缓冲能力则取决于你提供的Writer参数本身是否带有缓冲,类实现并不自动为其提供。
2)StreamEncoder缓冲:通过前六个构造器创建的PrintWriter对象都是基于OutputStreamWriter之上的,而OutputStreamWriter又是通过sun.nio.cs.StreamEncoder包装而成的,通过查阅文档,我们可以知道StreamEncoder中已经内置了一个8KB的ByteBuffer缓冲,输出字符经过再编码后保存在该缓冲区中,缓冲满后调用本地方法整体写入IO子系统。
3)由上可知,一个PrintWriter对象不论其是否带有BufferedWriter缓冲,在字符流和IO系统之间总是存在一个ByteBuffer缓冲,这样呢BufferedWriter缓冲对PrintWriter性能的影响就变得不那么显著了,因为它只起到了减少方法调用次数的作用(实际上是降低了CPU的开销),在成串输出字符模式下这一点体现的会更加明显,因为成串输出本身已显著较少了方法的调用次数。如下例:
import java.io.*;
public class PrintWriterTest {
public static void main(String[] args) throws Exception
{
Timer timer = new Timer();
String sText = "书山有路勤为径,蜡炬成灰泪始干。问渠那得清如许?牧童遥指杏花村。";
char[] aText = sText.toCharArray();
System.out.println("每次输出操作只输出一个字符时:");
long totalTime1 = 0;
long totalTime2 = 0;
for(int i = 0; i < 20; i++) { //测试20次,取平均值
for( int j = 0; j < 1024*1024*64; j++ ) //等待IO子系统恢复平静
timer.start();
PrintWriter pw1 = new PrintWriter("d:\\测试1.txt");
for( int j = 0; j < 1024*1024; j++ ){
for( int k = 0; k < aText.length; k++)
pw1.write(aText[k]);
}
pw1.close();
timer.stop();
totalTime1 += timer.getTime();
System.out.print("使用内置BufferedWriter缓冲的PrintWriter时耗时:" + timer.getTime());
for( int j = 0; j < 1024*1024*64; j++ ) //等待IO子系统恢复平静
timer.start();
PrintWriter pw2 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("d:\\测试2.txt")));
for( int j = 0; j < 1024*1024; j++ ){
for( int k = 0; k < aText.length; k++)
pw2.write(aText[k]);
}
pw2.close();
timer.stop();
totalTime2 += timer.getTime();
System.out.println(" 使用无内置BufferedWriter缓冲的PrintWriter时耗时:" + timer.getTime());
}
System.out.print("内置BufferedWriter缓冲时的耗时平均值:" + (long)(totalTime1/20));
System.out.println(" 无内置BufferedWriter缓冲时的耗时平均值:" + (long)(totalTime2/20));
System.out.println("\n----------------------------------\n");
System.out.println("每次输出操作输出一串字符时:");
totalTime1 = 0;
totalTime2 = 0;
for(int i = 0; i < 20; i++) { //测试20次,取平均值
for( int j = 0; j < 1024*1024*64; j++ ) //等待IO子系统恢复平静
timer.start();
PrintWriter pw1 = new PrintWriter("d:\\测试1.txt");
for( int j = 0; j < 1024*1024; j++ ){
pw1.write(aText);
}
pw1.close();
timer.stop();
totalTime1 += timer.getTime();
System.out.print("使用内置BufferedWriter缓冲的PrintWriter时耗时:" + timer.getTime());
for( int j = 0; j < 1024*1024*64; j++ ) //等待IO子系统恢复平静
timer.start();
PrintWriter pw2 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("d:\\测试2.txt")));
for( int j = 0; j < 1024*1024; j++ ){
pw2.write(aText);
}
pw2.close();
timer.stop();
totalTime2 += timer.getTime();
System.out.println(" 使用无内置BufferedWriter缓冲的PrintWriter时耗时:" + timer.getTime());
}
System.out.print("内置BufferedWriter缓冲时的耗时平均值:" + (long)(totalTime1/20));
System.out.println(" 无内置BufferedWriter缓冲时的耗时平均值:" + (long)(totalTime2/20));
}
}
class Timer {
private long startTime, endTime;
public void start(){
startTime = System.currentTimeMillis();
}
public void stop(){
endTime = System.currentTimeMillis();
}
public long getTime(){
return endTime - startTime;
}
}
输出结果如下(单位毫秒):
每次输出操作只输出一个字符时:
使用内置BufferedWriter缓冲的PrintWriter时耗时:6344 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6360
使用内置BufferedWriter缓冲的PrintWriter时耗时:2734 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6469
使用内置BufferedWriter缓冲的PrintWriter时耗时:2422 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6562
使用内置BufferedWriter缓冲的PrintWriter时耗时:2391 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6078
使用内置BufferedWriter缓冲的PrintWriter时耗时:3109 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6172
使用内置BufferedWriter缓冲的PrintWriter时耗时:2734 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6359
使用内置BufferedWriter缓冲的PrintWriter时耗时:2656 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6391
使用内置BufferedWriter缓冲的PrintWriter时耗时:2672 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6062
使用内置BufferedWriter缓冲的PrintWriter时耗时:2578 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6500
使用内置BufferedWriter缓冲的PrintWriter时耗时:2438 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6063
使用内置BufferedWriter缓冲的PrintWriter时耗时:2578 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6609
使用内置BufferedWriter缓冲的PrintWriter时耗时:2640 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6282
使用内置BufferedWriter缓冲的PrintWriter时耗时:2609 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6578
使用内置BufferedWriter缓冲的PrintWriter时耗时:2594 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6250
使用内置BufferedWriter缓冲的PrintWriter时耗时:2719 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6422
使用内置BufferedWriter缓冲的PrintWriter时耗时:2562 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6485
使用内置BufferedWriter缓冲的PrintWriter时耗时:2609 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6407
使用内置BufferedWriter缓冲的PrintWriter时耗时:2422 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6437
使用内置BufferedWriter缓冲的PrintWriter时耗时:2469 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6687
使用内置BufferedWriter缓冲的PrintWriter时耗时:2438 使用无内置BufferedWriter缓冲的PrintWriter时耗时:6360
内置BufferedWriter缓冲时的耗时平均值:2785 无内置BufferedWriter缓冲时的耗时平均值:6376
----------------------------------
每次输出操作输出一串字符时:
使用内置BufferedWriter缓冲的PrintWriter时耗时:2062 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2578
使用内置BufferedWriter缓冲的PrintWriter时耗时:3969 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2484
使用内置BufferedWriter缓冲的PrintWriter时耗时:3032 使用无内置BufferedWriter缓冲的PrintWriter时耗时:4718
使用内置BufferedWriter缓冲的PrintWriter时耗时:3140 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2844
使用内置BufferedWriter缓冲的PrintWriter时耗时:4546 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2563
使用内置BufferedWriter缓冲的PrintWriter时耗时:2515 使用无内置BufferedWriter缓冲的PrintWriter时耗时:4110
使用内置BufferedWriter缓冲的PrintWriter时耗时:2547 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2468
使用内置BufferedWriter缓冲的PrintWriter时耗时:3812 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2657
使用内置BufferedWriter缓冲的PrintWriter时耗时:2313 使用无内置BufferedWriter缓冲的PrintWriter时耗时:4438
使用内置BufferedWriter缓冲的PrintWriter时耗时:2188 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2218
使用内置BufferedWriter缓冲的PrintWriter时耗时:4000 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2531
使用内置BufferedWriter缓冲的PrintWriter时耗时:2328 使用无内置BufferedWriter缓冲的PrintWriter时耗时:4375
使用内置BufferedWriter缓冲的PrintWriter时耗时:2328 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2547
使用内置BufferedWriter缓冲的PrintWriter时耗时:4250 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2453
使用内置BufferedWriter缓冲的PrintWriter时耗时:3578 使用无内置BufferedWriter缓冲的PrintWriter时耗时:3047
使用内置BufferedWriter缓冲的PrintWriter时耗时:2329 使用无内置BufferedWriter缓冲的PrintWriter时耗时:4188
使用内置BufferedWriter缓冲的PrintWriter时耗时:3219 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2531
使用内置BufferedWriter缓冲的PrintWriter时耗时:2875 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2719
使用内置BufferedWriter缓冲的PrintWriter时耗时:2453 使用无内置BufferedWriter缓冲的PrintWriter时耗时:3157
使用内置BufferedWriter缓冲的PrintWriter时耗时:2563 使用无内置BufferedWriter缓冲的PrintWriter时耗时:2563
内置BufferedWriter缓冲时的耗时平均值:3002 无内置BufferedWriter缓冲时的耗时平均值:3059
二、为了使用的简单性,除了构造器外,PrintWriter类的其他方法并不抛出I/O异常,要得知IO操作过程是否出错,可通过调用checkError()方法进行查询,注意该方法同时清洗缓冲区。也正是由于这一点,我们最好把PrintWriter看成是面向最终用户的类,不要在其上再进行什么包装,例如下面两句虽然都合法,也可顺利编译,但是很明显第二句那种用法是有缺陷的:
new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
new BufferedWriter(new PrintWriter(new FileWriter("test.txt")));
发表评论
-
maven 在Mac OS下运行的问题总结
2014-05-16 17:24 834在maven下生成基本的项目结构。 生成eclipse项 ... -
【zz】 java函数参数类型后添加三点的用法
2012-07-02 09:48 1052今天看到一个没见过的函数参数列表test(int... a), ... -
【zz】Java编码的理解和Java加载器的理解
2012-06-08 15:59 757一,我对java中编码的理解1. 编码的产生 对电脑而言 ... -
类加载器入门级应用
2012-06-08 15:17 9311、类加载器负责加载 Ja ... -
ClassLoader详解
2012-06-08 14:23 1253Point One 将J2EE应用程序移植到W ... -
Java静态代理与动态代理
2012-05-29 10:32 945JAVA的静态代理与动态代 ... -
JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
2012-05-29 10:31 5195调用处理器InvocationHandle ... -
zz 动态反射实现AOP的简单原理
2012-05-28 17:46 904其实AOP的意思就是面向切面编程. OO注重的是我们 ... -
理解Java枚举在单例模式的应用
2012-06-05 15:50 12825.3.9 单例和枚举 按照《高效Java 第二版》中的说 ... -
Java 枚举的介绍
2012-05-23 16:50 0一、使用简单程序完成枚举的功能 例:使用简单类完成枚举操作 ... -
枚举类型的用法
2012-06-05 15:50 1436DK1.5引入了新的类型——枚举。在 Java 中它虽然算 ... -
单例模式的七种写法 (包括1.5新特性)
2012-05-23 16:18 0第一种(懒汉,线程不安全): <!--<br / ... -
重写hashCode方法的意义
2012-05-23 16:01 1652Java中的很多对象都override了equ ... -
JDK Log的设计思想
2012-05-23 14:39 1316最近在看《Agile Java》,看到日志一节,收获颇多,所以 ... -
[zz] Synchronized和Static Synchronized区别
2012-05-23 14:07 790通过分析这两个用法的分析,我们可以理解java中锁的概念。一 ... -
双精度、单精度的有效位数
2012-05-22 17:25 5118浮点数7位有效数字。(应该是单精度数) 双精度数16位有效 ... -
DecimalFormat 使用方法
2012-05-22 16:44 1031我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Ja ... -
Java Applet 无法运行的一个问题
2012-04-28 15:09 2541当你用JDK1.6开发出的新功能,在JDK1.6上re ... -
JDK1.5之中的Map相关的类
2012-04-26 10:14 1872java5的java.util包提供了大量集合类。其中最常用的 ... -
设计模式应用场景总结
2012-04-11 16:47 1276在J2EE的开发和测试中,其实不知不觉已经使用了许多设计模式。 ...
相关推荐
PrintStream在将字符串写入文件时,会将字符串转换为字节,而PrintWriter则不同,它会将字符串写入缓冲区,然后再将缓冲区的内容写入文件。这种机理的差异会导致两者在性能和效率上的差异。 其次,PrintStream和...
在Java编程中,缓冲区读者(BufferedReader)和缓冲区写者(BufferedWriter)是处理输入输出流的重要工具,它们提高了I/O操作的效率。这些类位于java.io包中,是字符流处理的一部分,主要用于文本数据的读写。本篇将深入...
打印流(`PrintStream`和`PrintWriter`)是输出流的子类,它们提供了格式化的输出功能,如打印字符串、数字、换行符等。通常用于日志记录或调试信息的输出。 在学习这些流的使用时,可以结合源码分析其工作原理,...
2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...
除了基本的字节和字符缓冲流外,还有对应的打印流(PrintStream 和 PrintWriter),以及可以对其他流进行缓冲化的装饰器模式实现,例如 FilterInputStream 和 FilterOutputStream。转换流(如InputStreamReader 和 ...
Java中的PrintWriter介绍 PrintWriter是Java中的一种字符类型的打印输出流,继承于Writer。它用于向文本输出流打印对象的格式化表示形式。PrintWriter提供了多种构造方法,例如PrintWriter(OutputStream out)、...
你可以通过设置`PrintWriter`的`autoFlush`属性来控制是否自动刷新缓冲区。 在实际应用中,如果你需要进行简单的文本输出,`FileWriter`可能就足够了。然而,当你需要进行格式化输出或者希望在出现异常时不立即中断...
然而,处理编码问题时,PrintWriter的行为可能会导致乱码,特别是在处理非ASCII字符(如中文字符)时。 首先,我们需要了解PrintWriter的默认编码。当没有明确指定编码时,PrintWriter并不会使用`Charset.default...
`PrintWriter`也具有缓冲功能,但默认情况下,当遇到换行符(`println()`方法会添加)或者调用`flush()`方法时,才会将内容真正发送到输出流。在示例代码中,创建了两个`PrintWriter`对象,一个用于标准输出`System....
PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。 文件下载的实质就是文件拷贝...
`PrintWriter`的一个重要特性是它可以自动处理缓冲,即在必要时自动刷新输出,使得数据能够及时地被写出。此外,`PrintWriter`还可以设置是否关闭自动刷新,以便在某些情况下手动控制输出。 在`PrintWriterPrinter....
同时,`PrintWriter`构造器的第二个参数`true`表示自动刷新,确保每次写入后立即刷新缓冲区,防止数据丢失。 此外,还可以使用`Files`类和`StandardCharsets`枚举来读写文件,如下所示: ```java import java.nio....
模拟当当网开发一套电子商务系统. 模拟产品浏览,购物车,订单,用户管理等功能. 1)用户管理模块(3天)user ... 2)产品浏览模块(2天)main 产品主界面,分类浏览界面 3)购物车模块(1.5天)cart 购买,删除,恢复,更新数量等...
数据流读写是Java编程中不可或缺的部分,涉及对文件、网络和内存的数据传输。本文将详细介绍数据流的读写操作...正确选择字节流和字符流,以及适当地使用转换类和缓冲技术,可以有效避免编码问题,实现高效的数据交换。
例如,PrintWriter类提供了flush()方法强制刷新缓冲区。同时,构造PrintWriter时可以设置autoflush参数,若设为true,当调用println()、printf()或format()方法时会自动刷新缓冲区。但需要注意的是,调用write()方法...
在处理大量数据时,使用缓冲流(如`BufferedReader`和`BufferedWriter`)可以显著提高效率,因为它们会批量处理数据,减少系统调用的次数。同时,确保正确地关闭流是非常重要的,避免造成资源泄漏或数据丢失。
- **打印流(PrintStream/PrintWriter)**:简化了写入过程,可以自动进行行结束符的添加,并支持各种数据类型的写入。 通过对这些概念的理解和掌握,可以更好地利用Java I/O流进行高效的数据处理。
最后,确保关闭`fileIn`和`fileOut`以释放资源,`flush()`方法用于确保所有缓冲的数据都写入到文件。 运行此程序后,可以看到如图1所示的控制台输出,图2展示了`aaa.txt`的原始内容,而图3则显示了`bbb.txt`写入后...
转换流是用来连接字节流和字符流的一种桥梁,主要用于处理编码转换的问题。当需要处理特定编码的文件时,转换流是非常有用的工具。 - **字节向字符的桥梁**: - `InputStreamReader`:用于从字节流中读取数据并将...
- 示例:`PrintWriter printWriter = new PrintWriter("output.txt");` - **特点**:从Java 5开始,`PrintWriter`可以直接通过`File`或`String`对象创建,具有`print()`, `println()`, `format()`等方法。 #### ...