【随记】java I/O & byte 和 char
来源:互联网 发布:数据库判断范式的例题 编辑:程序博客网 时间:2024/06/08 05:55
先来两张图
平时我们接触最多的io流,应该就是System.out.println()了
这里调用的是PrintStream类中的方法。在System中默认的标准输出类就是PrintStream。
下面系统地总结下:
按来源/去向分类:
- File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
- byte[]:ByteArrayInputStream, ByteArrayOutputStream
- Char[]: CharArrayReader, CharArrayWriter
- String: StringBufferInputStream, StringReader, StringWriter
- 网络数据流:InputStream, OutputStream, Reader, Writer
InputStream
InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自InputStream 的流都是向程序中输入数据的(数据来源各不相同),且数据单位为字节(8bit);
这些数据起源包括(每个都有一个相关的InputStream子类):
(1) 字节数组
(2) String对象
(3) 文件
(4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西一端置入,它们在另一端输出。
(5) 一个由其他种类的流组成的序列,以便我们将其统一收集合并到一个流内。
(6) 其他数据集,如Internet连接等。
InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:
- public abstract int read():读取一个byte的数据,返回值是高位补0的int类型值(范围是0~255,也就是byte转化为int对应的值)。若返回值=-1说明没有读取到任何字节读取工作结束。
- public int read(byte b[]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
- public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
- public int available():返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
- public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
- public int close( ) :使用完后,必须对我们打开的流进行关闭。
来看看几种不同的InputStream:
1. FileInputStream把一个文件作为InputStream,实现对文件的读取操作
2. ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
3. StringBufferInputStream:把一个String对象作为InputStream
4. PipedInputStream:实现了pipe的概念,主要在线程中使用
5. SequenceInputStream:把多个InputStream合并为一个InputStream
OutputStream
OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。
- public void write(byte b[ ]):将参数b中的字节写到输出流。
- public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。
- public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。
- public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。
- public void close( ) : 关闭输出流并释放与流相关的系统资源。
几种不同的OutputStream:
1. ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2. FileOutputStream:把信息存入文件中
3. PipedOutputStream:实现了pipe的概念,主要在线程中使用
4. SequenceOutputStream:把多个OutStream合并为一个OutStream
Reader和InputStream类似;Writer和OutputStream类似。
有两个需要注意的:
- InputStreamReader : 从输入流读取字节,再将它们转换成字符。
- BufferReader :接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
如何选择I/O流
- 确定是输入还是输出
输入:输入流 InputStream Reader
输出:输出流 OutputStream Writer - 明确操作的数据对象是否是纯文本
是:字符流 Reader,Writer
否:字节流 InputStream,OutputStream - 明确具体的设备。
• 文件:
读:FileInputStream,, FileReader,
写:FileOutputStream,FileWriter
• 数组:
byte[ ]:ByteArrayInputStream, ByteArrayOutputStream
char[ ]:CharArrayReader, CharArrayWriter
• String:
StringBufferInputStream(已过时,因为其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter
• Socket流
键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutputStream对象)打印
Scanner in = new Scanner(System.in);
- 是否需要转换流
是,就使用转换流,从Stream转化为Reader、Writer:InputStreamReader,OutputStreamWriter - 是否需要缓冲提高效率
是就加上Buffered:BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter - 是否需要格式化输出
byte和char
byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 。
下面用实例来比较一下二者的区别:
1、Char是无符号型的,可以表示一个整数,不能表示负数;而byte是有符号型的,可以表示-128—127 的数;如:
char c = (char) -3; // char不能识别负数,必须强制转换否则报错,即使强制转换之后,也无法识别 System.out.println(c); byte d1 = 1; byte d2 = -1; byte d3 = 127; // 如果是byte d3 = 128;会报错 byte d4 = -128; // 如果是byte d4 = -129;会报错 System.out.println(d1); System.out.println(d2); System.out.println(d3); System.out.println(d4);
结果为:?1-1127-128
2、char可以表中文字符,byte不可以,如:
char e1 = '中', e2 = '国'; byte f= (byte) '中'; //必须强制转换否则报错 System.out.println(e1); System.out.println(e2); System.out.println(f);
结果为:中国45 // 输出的45并不是“中”对应的码
3、char、byte、int对于英文字符,可以相互转化,如:
因为英文字母的范围在-128~127之间
byte g = 'b'; //b对应ASCII是98 char h = (char) g; char i = 85; //U对应ASCII是85 int j = 'h'; //h对应ASCII是104 System.out.println(g); System.out.println(h); System.out.println(i); System.out.println(j);
结果为:98bU104
- 【随记】java I/O & byte 和 char
- Java byte[]和char[]互转
- java的char和byte
- java中的byte和char
- 【I/O】Byte Streams
- java 中 char 和 byte 的转换
- java中char和byte的转换
- java中char和byte的转换
- java中char和byte的转换
- Java 文件和 I/O
- java byte char 互转
- java-byte-char
- JAVA 中的 char, byte
- [Java] char、byte类型
- byte和char
- 【Java基础 代码片段】byte[]和char[]互转
- Java中byte[]、char[]和String的相互转化
- JAVA char与byte的区别和转换
- iOS app 运行的时候和打包出来的app 不一样
- 文章标题
- 20170622 js回顾
- Redis和Memcached的区别
- eclipse 生成发布的apk (signed zipalign过程)
- 【随记】java I/O & byte 和 char
- C++每日一课(三)
- x的平方根
- Idea常见操作
- Linux的一些基本命令与MySQL索引
- LPC 简单介绍
- 选择多个面创建BOX
- IOS使用分组导航标记
- 第一章 流与文件01