- 浏览: 665132 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
前面我主要是对IO进行了一个整体上的认识和对File类的相关操作进行了简单的说明。下面主要再来说说Java IO中的字节流和字符流;
在整个IO包中,流的操作包括了两种-----字符流和字节流;
字节流:
字节输入流(InputStream):
public abstract class InputStream extends Object implements Closeable
字节输出流(OutputStream):
public abstract class OutputStream extends Object implements Closeable, Flushable
字符流:(一个字符为两个字节)
字符输入流(Reader):
public abstract class Reader extends Object implements Readable, Closeable
字符输出流(Writer):
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
在Java中使用IO操作的步骤:
使用File找到一个文件;
使用字符流或字节流的子类为OutputStream、InputStream、Writer、Reader进行实例化操作;
进行读或写操作;
关闭(Close()),在流的操作中必须进行关闭,但BufferedReader例外,我试过;
范例:OutputStream 通过输出流写入内容
package com.iflytek.io02; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class OutputStreamDemo01 { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt");// 要操作的文件 OutputStream out = null;// 声明字节输出流 // out = new FileOutputStream(file);// 通过子类实例化 out = new FileOutputStream(file, true);// 表示可以追加j String str = "王旭东\r\n";// 要输出的信息 byte b[] = str.getBytes();// 将String变为byte数组 out.write(b);// 写入数据 // for (int i = 0; i < b.length; i++) { // out.write(b[i]); // }// 通过循环一个个写入 out.close(); } }
范例:InputStream 通过输入流来读取内容
package com.iflytek.io02; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class InputStreamDemo01 { public static void main(String args[]) throws Exception { File file = new File("d:" + File.separator + "demo.txt");// 要操作的文件 InputStream input = null;// 声明字节输入流 input = new FileInputStream(file);// 通过子类进行实例化操作 byte b[] = new byte[1024];// 开辟空间存储读取的内容 int len = input.read(b);// 将内容读取到byte数组中 System.out.println(new String(b, 0, len));// 输出内容 input.close(); } }
但是读取是一种常见的读取方式,但是上面的代码读取受到开辟空间的限制,所以如果现在想动态的开辟数组空间,则可以根据文件的大小来决定,采用read()方法一个个的读取数据;
范例:read()
package com.iflytek.io02; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class InputStreamDemo02 { public static void main(String args[]) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); InputStream input = new FileInputStream(file); byte b[] = new byte[(int) file.length()];// 开辟空间接收读取的内容 for (int i = 0; i < b.length; i++) { b[i] = (byte) input.read();// 一个个的读取数据 } System.out.println(new String(b));// 输入内容,直接转换 input.close();// 关闭 } }
范例:Writer
package com.iflytek.io02; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class WriterDemo { public static void main(String args[]) throws IOException { File file = new File("d:" + File.separator + "demo.txt"); Writer out = null;// 声明字符输出流 // out = new FileWriter(file);// 通过子类实例化 out = new FileWriter(file,true);//表示可以追加 String str = "王旭东\r\n";// 要输出的信息 out.write(str);// 写入数据 out.close(); } }
范例:Reader
package com.iflytek.io02; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class ReaderDemo { public static void main(String args[]) throws IOException { File file = new File("d:" + File.separator + "demo.txt"); Reader input = null; input = new FileReader(file); char c[] = new char[1024]; int len = input.read(c); System.out.println(new String(c, 0, len)); input.close(); } }
或者通过一个个读取:
package com.iflytek.io02; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class ReaderDemo02 { public static void main(String args[]) throws IOException { File file = new File("d:" + File.separator + "demo.txt"); Reader input = null; input = new FileReader(file); char c[] = new char[(int) file.length()]; for (int i = 0; i < c.length; i++) { c[i] = (char) input.read();// 一个个读取 } System.out.println(new String(c)); input.close(); } }
下面我们来通过一组实例来观察字节流与字符流的区别:此程序就是向文件中保存内容
范例:字节流OutputStream实现:
package com.iflytek.io02; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class OutputStreamDemo { public static void main(String args[]) throws IOException { File file = new File("d:" + File.separator + "demo.txt"); OutputStream out = new FileOutputStream(file); String str = "java"; byte b[] = str.getBytes(); out.write(b); } }
注意:以上的操作并没有进行关闭操作,发现内容却可以正常的输出;
范例:字符流Writer实现
package com.iflytek.io02; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class WriterDemo02 { public static void main(String args[]) throws IOException{ File file = new File("d:" + File.separator + "demo.txt"); Writer out = new FileWriter(file); String str = "java"; out.write(str); } }
此时,字符流中也没有进行流的关闭操作,但与字节流不同的是,字符流并没有将内容成功的写入进去。如果此时在字符流操作的最后加入out.flush()操作,则可以成功的写入;
此时来看可以知道因为早期只有字节流,换而言之,也就是说早期是没有刷新操作的,但是因为使用了关闭,所以表示会强制刷新,注意的是其中刷新的是缓冲区(内存),但是这里我认为任何流只要初始化了最后都将其关闭了,这是一种习惯,注此处除了BufferedReader;
此时可以得到这样的一个结论:
字节流在操作的时候是直接与文件本身进行关联的,不使用缓冲区
· 字节文件 字节流直接实现底层的IO操作;
字符流在操作的时候是通过缓冲区与文件进行操作的,使用缓冲区
· 字符缓冲文件
综上比较来说,在传输或者在硬盘上保存的内容都是以字节的形式存在,所以字节流操作较多,但是在操作文件的时候字符流比较好使;
内存操作流
其主要是保存临时文件,通过内存操作流输入输出的目标是内存。使用ByteArrayInputStream(从程序向内存写入)和ByteArrayOutputStream(从内存向程序输出)完成内存的操作流。在内存操作流中所有的输入和输出都是以内存为操作源头的;
范例:通过内存流完成字符串小写变为大写的操作;
package com.iflytek.io02; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class ByteArrayInputStreamDemo { public static void main(String args[]) { String str = "hello world!"; ByteArrayInputStream bis = null;// 内存输入流,从程序向内存写入 ByteArrayOutputStream bos = null;// 内存输出流 bis = new ByteArrayInputStream(str.getBytes());// 将内存保存在内存中 bos = new ByteArrayOutputStream(); int temp = 0; while ((temp = bis.read()) != -1) {// 依次读取 char c = (char) temp; bos.write(Character.toUpperCase(c));// 输出 } String newStr = bos.toString();// 取出内存输出的内容 System.out.println(newStr); } }
注意,虽然内存流在J2EE阶段没什么感觉,但是在Java WEB中的Ajax技术中会结合XML解析和JavaScript、Ajax完成一些动态效果;
管道流:
管道流就是进行两个线程间通讯,使用PipedInputStream和PipedOutputStream两个类完成,这两个类在使用上基本上跟InputStream和OutputStream类似,唯一的区别在于连接管道的操作上public void connect(PipedOutputStream src) throws IOException,此处就暂时不举例了;
打印流:
PrintStream和PrintWriter
public class PrintStream extends FilterOutputStream implements Appendable, Closeable
从上面可知,PrintStream是OutputStream的子类,而实际上,PrintStream类属于装饰,也就是说根据实例化PrintStream类对象的不同,输出的位置也不同;
范例:使用PrintStream向文件输出
package com.iflytek.io02; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class PrintStreamDemo { public static void main(String args[]) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); PrintStream ps = new PrintStream(new FileOutputStream(file)); ps.print("hello"); ps.print("world"); ps.print(10); ps.print(10.0); ps.close(); } }
此处,发现使用打印流输出比较方便,所以建议以后都使用打印流完成输出;
在JDK1.5之后打印流可以使用格式化输出
public PrintStream format(String format,Object... args)
package com.iflytek.io02; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class PrintStreamFormatDemo { public static void main(String args[]) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); PrintStream out = new PrintStream(new FileOutputStream(file)); String name = "王旭东"; int age = 21; float score = 99.0f; char sex = 'N'; out.printf("姓名:%s;年龄:%d;成绩:%5.2f;性别:%c。",name,age,score,sex); out.close(); } }
这里需要注意,在打印流中始终记住一下原则:
· 根据实例化其子类的不同,完成的打印输出功能也不同;
System对IO的支持:
System.in:它是PrintStream的实例,常用的方法就是向屏幕上打印信息,当然如果使用System.out的话也可为OutputStream实例化
System.err:表示错误的输出
package com.iflytek.io02; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class SystemerrDemo { public static void main(String args[]) { try { Integer.parseInt("hello"); } catch (Exception e) { System.out.println(e);//e打印出来是黑字 System.err.println(e);//e打印出来是红字 } } }
其区别只能从概念上讲:
System.out:一般的信息是愿意展示给用户看见的;
System.err:一般的信息是不愿意展示给用户看见的;
System.in:表示键盘的输入;
package com.iflytek.io02; import java.io.InputStream; /** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */ public class SystemInDemo { public static void main(String args[]) throws Exception { InputStream input = System.in; System.out.println("请输入内容:"); int temp = 0; StringBuilder bud = new StringBuilder(); while ((temp = input.read()) != -1) { char c = (char) temp; if (c == '\n') { break; } bud.append(c); } System.out.println("输入的内容是:" + bud); } }
虽然此时读取时没有长度但此处注意的是每次读取的是字节,所以在输入中文时会出现错误,只能通过后面的BufferedReader来实现;
重定向问题:
· System.out、System.err都有固定的输出目标,都是屏幕。而System.in有固定的输入目标,都是键盘;但是在System类中提供了一系列的输入输出重定向,可以改变System.out、System.er、System.in的输入输出位置。
· System. out重定向:public static void setOut(PrintStream out)
· System.err重定向:public static void setErr(PrintStream err)
· System.in重定向:public static void setIn(InputStream in)
BufferedReader:
实际上表示缓冲区读取,可以一次性的将内容全部读取出来
其构造方法:public BufferedReader(Reader in)
注意:在Java中提供了两个专门的类,去实现字节流与字符流的转换:
· InputStreamReader:将字节的输入流变为字符输入流;
文件字节流(输入流)字符流(输入流)控制台
· OutputStreamWriter:将字符的输出流变为字节的输出流;
程序字符流(输出流)字节流(输出流)文件
通过public String readLine()throws IOException来读取数据,表示一次性读取一行数据,而且这里需要注意的是如果返回的内容是String是最好的操作;
发表评论
-
log4j xml配置详解
2014-06-18 10:37 1107<?xml version="1.0&qu ... -
test
2013-07-29 09:16 0private static CacheImpl insta ... -
多文件上传 by MultipartFile and Multiple
2012-12-03 09:13 14310最近的一个项目中,需要用到 ... -
布局框架-SiteMesh
2012-11-30 08:57 2549最近在一个项目中使用 ... -
Servlet
2012-12-07 08:36 1510一、认识 Servlet : ... -
连接池
2012-12-10 08:42 1405... -
忆Java String
2012-11-15 08:38 1228平时 .NET 写多了, Java ... -
Eclipse中右键快速定位文件资源的工具
2012-11-09 08:43 1964当你开发.NET项目后,使用VS习惯了再来使用Java和Ecl ... -
Java中MessageFormat对象实现格式化字符串输出,类似C#中的string.format方法
2012-09-29 11:39 3631平时.NET做多了,再做Java时,总会进行一些比较,比如说J ... -
byte[]与InputStream互转
2012-09-29 11:39 1539InputStream转byte[] private ... -
统一中英文长度问题
2012-07-20 00:17 1902最近因为在做一个项目要求很多都是英文,所以这就涉及到在页 ... -
Java中Process的waitFor()阻塞问题
2012-07-21 01:00 8853在做视频转换时,调用外部的 exe 去进行一些视频 ... -
Tomcat注册成系统服务
2012-07-17 00:00 1523为了部署项目后不出现黑色的 doc 命令框,所以很 ... -
urlrewrite实现伪静态化
2012-07-25 00:41 3182产生背景 静态网页与动态网页比较: ... -
Java中java.util.Date时间和java.sql.Date时间的相互转化
2012-01-30 22:49 2915刚刚写用 JS 禁用退格键时( http ... -
使用BeanUtils类简化request和resultset转换
2012-01-21 20:23 2898当提交表单时,如果没有使用Struts等框架的话,你的代 ... -
JDBC的多条件动态查询
2012-01-19 11:05 7115前面我已经提到了现在的项目无非就是列表里的分页加多条件查 ... -
JDBC分页
2012-01-19 10:15 5478不知道大家做项目做到最后有什么感觉没有,其实大家做来做去 ... -
Java农历(阴历)工具类
2012-01-20 11:30 2310在真实的项目开发中会可能会遇到项目需要对阴历即我们所说的农历节 ... -
Eclipse中java项目引用dll库的路径设置(System.loadLibrary()调用Dll路径问题)
2012-01-16 14:13 4212右击项目名|选择属性properties|在左边列表内选择“J ...
相关推荐
- 字节流与字符流的转换 - 新潮的 NIO - 缓冲区(Buffer) - 通道(Channel) - 示例:文件拷贝案例 - BIO 和 NIO 拷贝文件的区别 - 操作系统的零拷贝 - 选择器(Selectors) - 选择键(SelectionKey) - ...
Java IO字符流和字节流,讲述了字符传输流和字节传输流的不同和作用
2、常用21个IO流:FileWriter、FileReader、...3、JAVA IO流经典代码示例,示例从易到难。代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1683399
JavaIO实例,包括:字节流、字符流、缓冲流、转换流
javaIO操作各种文件,筛选文件,拷贝文件,上传下载,字符流和字节流都有,根据实际项目情况直接贴就可以了,根据文件类型选择不同的testclss就可以。全部使用效率最高的流
Java中IO流实例,包括:字节流、字符流、缓冲流、转换流的操作。
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
java IO流 例子 源程序 字节流,字符流。
* io流 运用 * 注意:只要子类 包含以下类名字的,就是该... * InputStream----- 输入字节流 * Reader-------- 输入字符流 * OutputStream-----输出字节流 * Writer --------输出字符流
java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流
字节流:按照字节读取数据(InputStream、OutputStream) 字符流:按照字符读取数据(Reader、Writer) 功能不同: 节点流:可以直接从数据源或目的地读写数据。 处理流:不直接连接到数据源或目的地,是处理流的流...
java io流总结,包括字符流,字节流,很详细。inputStream outputStream
字节流与字符流的练习文档,内附一个简要的记事本综合文档。
Java 的 IO 流主要包括输入、输出两种 IO 流,每种输入、输出流有可分为字节流和字符流两大类: 字节流以字节为单位来处理输入、输出操作 字符流以字符为单位来处理输入、输出操作
字节流与字符流的区别 字节流在JDK1.0中就被引进了,用于操作包含ASCII字符的文件。Java也支持其他的字符如Unicode为了读取包含Unicode字符的文件,Java语言设计者在JDK1.1中引入了字符流。ACSII作为Unicode的子集,...
23_IO_第2天(字节流、字符流)_讲义
java核心编程基础
此文档属于本人当初学习java基础之IO流,所整理的文档。里面有字节流与字符流的比较,也有总结使用不同方式读取文档的demo。希望对你的学习有帮助,谢谢!
Java文件流知识点梳理总结,IO文件流,包含了File类、缓冲流、字节流、字符流、转换流等