黑马程序员技术交流社区
标题:
java io
[打印本页]
作者:
王丽
时间:
2011-7-27 10:03
标题:
java io
问一下,在java io的类中,怎样知道哪些是对字符流,哪些是字节流,我晕晕的,有什么技巧吗?
作者:
包志恒
时间:
2011-7-27 10:09
分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 inputstream outputstream reader writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutputStream PipedReader PipeWriter
访问字符串 StringReader StringWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferReader BufferWriter
转换流 InputStreamReade OutputStreamWriter
对象流 ObjectInputStream ObjectOutputStream
抽象基类 FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataInputStream
这个表中看到区别了么一般对字符流操作的后面都是Reader和writer这样你该明白点了吧 希望可以帮到你
[
本帖最后由 包志恒 于 2011-07-27 10:11 编辑
]
作者:
匿名
时间:
2011-7-27 10:12
晕怎么改都弄不顺了楼住对付这看吧:loveliness:
作者:
匿名
时间:
2011-7-27 10:18
一.I/O 流(java 如何实现与外界数据的交流)
流定义:
任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。
1.Input/Output:指跨越出了JVM 的边界,与外界数据的源头或者目标数据源进行数据交换。
2.流的分类:
按流向分为输入流和输出流;
按传输单位分为字节流(Stream)结尾的和字符流(Reader和Writer);
按功能还可以分为节点流和过滤流。
节点流:负责数据源和程序之间建立连接;(相当于裸枪)
过滤流:用于给节点增加功能。(相当于功能零部件)
过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。
注:I/O流是一类很宝贵的资源,使用完后必须调用close()方法关闭流并释放资源。在关闭流时只用关闭最外层的流。
3.File 类(java.io.*)可表示一个文件,也有可能是一个目录
(在JAVA 中文件和目录都属于这个类中,而且区分不是非常的明显
4.Java.io 下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。
注意:创建一个文件对象和创建一个文件在JAVA 中是两个不同的概念。前者是在虚拟机中创建了一个文件,
但却并没有将它真正地创建到OS 的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。
而创建一个文件才是在系统中真正地建立一个文件。
二File类:我们猛看起来像是文件,其实他也可以指代一个文件集,当作为文件集时我们可以对此调用List方法。
这个类的常用构造有:File("路径"),File(“前边路径”,“后边路径”)File(File,“路径”)
这个类的常用方法:exists(),delete(),getName(),getPath(),isDirectory(),isFile(),length(),
listFile(FileFilter),主要用来过滤文件这里有(可以用来嵌套内部类)
mkdir(),mkdirs(),toString(),
FileFilter接口只有accept方法,其返回值为Boolean型,可以在其里边写一些正则表达式来对文件进行筛选。
这里需要注意的是传入accept的参数必须是final类型(匿名内部类的要求),这样他才能使用该类范围之外的队像。
顺便讲讲:内部类优点 高聚拢性,缺点在于不易阅读,谨慎使用。
三 字节流:
InputStream/OutputStream 所有输入输入流的父类,是抽象类。
子类有:FileInputStream/FileOutputStream(节点流)(注意FileInputStream(path名,boolean)Boolean为true 表示拼接)
DataInputStream/DataOutputStream 数据输入流允许应用程序以与"机器无关方式"
从底层输入流中读取基本 Java 数据类型 (8种基本类型,加一种String)读入写出时类型必须一致
BufferedInputStream/BufferedOutputStream 字节缓冲流 用于给节点流增加一个缓冲的功能。(典型的牺牲空间换时间)
1.字节输入流:io包中的InputStream为所有字节输入流的父类。
Int read();读入一个字节(每次一个);
可先使用new byte[]=数组,调用read(byte[] b)
read (byte[])返回值可以表示有效数;read (byte[])返回值为-1 表示结束。
2.在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。
原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。
四、字节流的字符编码:
字符编码把字符转换成数字存储到计算机中,按ASCii 将字母映射为整数。
把数字从计算机转换成相应的字符的过程称为解码。
乱码的根源在于编解码方式不统一。在世界上任何一种编码方式中都会向上兼容ASCII码。所以英文没有乱码。
编码方式的分类:
ASCII(数字、英文):1 个字符占一个字节(所有的编码集都兼容ASCII)
ISO8859-1(欧洲):1 个字符占一个字节
GB-2312/GBK:1 个字符占两个字节。GB代表国家标准。
GBK是在GB-2312上增加的一类新的编码方式,也是现在最常用的汉字编码方式。
Unicode: 1 个字符占两个字节(网络传输速度慢)
UTF-8:变长字节,对于英文一个字节,汉字三个字节。
原则:保证编解码方式的统一,才能不至于出现错误。
I/O学习种常范的两个错误 1。忘了加flush2.没有加换行。
五。字符流
Reader/Writer所有字符流的父类
其子类有
InputStreamReader/OutputStreamWriter 称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式
FileReader/FileWriter (FileInputStream/FileOutputStream和InputStreamReader/OutputStreamWriter)的组合,只能是本地默认编码
Bufferedreader/BufferedWriter 字符缓冲流,其特有方法readLine()读取一个文本行,newLine()表示Writer到下一个文本行
六 。
一.对象序列化
1. 定义:把一个对象通过I/O流写到文件(持久性介质)上的过程叫做对象的序列化。
2. 序列化接口:Serializable
此接口没有任何的方法,这样的接口称为标记接口。
3. 不是所有对象都能序列化的,只有实现了Serializable的类,他的实例对象才是可序列化的。
4. 在Java种定义了一套序列化规范,对象的编码和解码方式都是已经定义好的。
5. class ObjectOutputStream 和ObjectInputStream也是过滤流,使节点流直接获得输出对象。
[email]ganbin@tarena.com.cn[/email]
最有用的方法:
(1)writeObject(Object b)
(2)readObject();该方法返回的是读到的一个对象,但是需要我们注意的是,该方法不会以返回null表示读到文件末尾。
而是当读到文件末尾时会抛出一个IOException;
6. 序列化一个对象并不一定会序列化该对象的父类对象
7. 瞬间属性(临时属性)不参与序列化过程。
8. 所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。序列化的集合就要求集合中的每一个元素都是可序列化的。
9. 用两次序列化把两个对象写到文件中去(以追加的方式),
和用一次序列化把两个对象写进文件的大小是不一样的。
因为每次追加时都会要在文件中加入一个开始标记和结束标记。所以对于对象的序列化不能以追加的方式写到文件中。
作者:
匿名
时间:
2011-7-27 10:36
[color=Red]如果需要进行输入输出操作的内容是文本内容,就应该考虑使用字符流,如果是进行输入输出的二进制内容,就应该考虑字节流[/color]
[color=Blue]文本文件:[/color]所有能用记事本打开并且看到里面字符内容的文件称为文本文件,相反就是二进制文件
实质:计算机里面的文件都是二进制文件,文本文件只是二进制文件的一种特例,如果二进制文件里面的内容恰好能被正常解析成为字符的时候,二进制文件就变成了文本文件,更主要的即使是文本文件,如果我们打开文件强制使用了”错误“编码--就是和保存文件时候的编码不一样,那么看到的就是乱码,所以我们如果要看到正常的文本文件的内容,应该在打开文件的时候与保存文件的时候使用的编码级相同
如下两个列子刚在网上看到的:[color=Blue]第一种方法使用字节流,第二种使用字符流,但是第二个程序生成的文件打不开[/color]
第一个:使用FileInputStream,FileOutputStream 如下:[code=java]package cn.itcast.heima
import java.io.*;
public class FileCopy {
private String in;
private String out;
public FileCopy(String inName,String outName) {
in = inName;
out = outName;
}
private void copyFile ()
throws Exception {
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out);
byte[] b = new byte[256];
while(fis.read(b)!=-1) {
fos.write(b);
}
fis.close();
fos.close();
}
public static void main(String[] args) throws Exception {
try {
FileCopy fc = new FileCopy( "f:\\help.bmp ", "g:\\help.bmp ");
fc.copyFile();
}
catch (Exception e) {
e.printStackTrace();
}
}
}[/code]第二个用BufferedReader,BufferedWriter[code=java]package cn.itcast.heima
import java.io.*;
public class FileCopy {
private String in;
private String out;
public FileCopy(String inName,String outName) {
in = inName;
out = outName;
}
private void copyFile () throws Exception {
BufferedReader fis = new BufferedReader(new FileReader(in));
BufferedWriter fos = new BufferedWriter(new FileWriter(out));
char[] b = new char[256];
while(fis.read()!= -1) {
fos.write(b);
}
fis.close();
fos.close();
}
public static void main(String[] args) throws Exception {
try {
FileCopy fc = new FileCopy( "f:\\help1.bmp ", "g:\\help11.bmp ");
fc.copyFile();
} catch (Exception e) {
e.printStackTrace();
}
}
}[/code]这是因为:[color=Red]图片属于二进制文件,不能以文本文件打开,就象用文本打开可执行文件再保存后明显的文件所尺寸不一样啦[/color]
作者:
匿名
时间:
2011-7-27 10:49
我是这样区分的 : 类名后面部分带[color=#FF0000]InputStream[/color]或者[color=#FF0000]OutputStream [/color]字样的我分为字节流, 类名后面部分带[color=#FF0000]Reader [/color]或者[color=#FF0000]Writer[/color]字样的为字符流。也不知道是不是绝对的,但我所发现都是这样子的。
[size=3][/size]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2