- 浏览: 1336009 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
InputStream.read()
返回int ,且范围为0到255间int值 ,从输入流读取下一个数据字节,它是以字节为单位来读的,即每次只读取一个字节内容 ,读取后面三前面补三个字节的0,这样读取出来的结果就永远为正,且为0到255间的数。如果因已到达流末尾而没有可用的字节,则返回值-1 。用于进制文件的读取。
如果我们读取的是二进制文件,如图片声音文件时,我们应该使用如下两种方式来读取:
第一种 :还是使用InputStream.read(),方法来读取,只不过我们把int型强制转换byte型即可,这样在转换的过程中,会丢弃前三个字节所补的零,最终得到从流中读取的真实的编码。但如果这样直接通过read()方法读取,而不是通过read(byte[] b)时,我们判断流是否结尾,最好使用available()方法来判断,当然也可以使用直接比较读出的结果是否为-1,但是要注意的是我们不能在读取后强转成byte型后再判断,因为二进制文件有可能有-1的编码。
第二种 :使用InputStream.read(byte[] b)来接收,因为这样不会有byte到int提升的过程,byte数组b里存储的就是真实的编码。如果read(byte[] b)读取到流的尾,则返回-1,所以我们直接判断返回的读取子节数就可知道流是否结束。
OutputStream.write(int b)
将指定的字节写入此输出流。write 的规定是:向输出流写入一个字节。要写入的字节是参数b的八个低位。b 的24个高位将被忽略。此方法能向文件中写入负数编码,即可写入二进制流的文件,如声音、图片等文件。
我们再来看看Reader与Writer字符流相应方法:
Reader.read
Reader.read:读取单个字符。在有可用字符、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。范围在 0 到 65535 之间 (0x00-0xffff),实质上读取出来的就是一个char型,即为Unicode编码了。如果已到达流的末尾,则返回 -1
Writer. write(int c)
Writer. write(int c):写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
从上面可以看出是两类字符流,一种是字节流,另一种是字符流,如果我们读取/写入的是一个二进制文件,则使用字节流InputStream.read/OutputStream.write;如果我们读取/写入的是一个字符文件,则使用字符流Reader.read/Writer.write会很方便,当然字符流也可以使用字节流来操作,只是在某些情况下不是很方便。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import junit.framework.TestCase; public class TestBinaryStreamReadWrite extends TestCase { /* * 写二进制文件(如声音文件)时,只能使用字节流写。outputStream.write方法 只写入最低八位, * 前三字节会丢弃掉,只存储最后一字节 */ public void testCreateByteFile() { try { FileOutputStream fo = new FileOutputStream("e:/tmp/tmp"); byte b = -1; //向文件写两个-1,没有编码为-1的字符,所以创建出的文件为纯二进制文件 fo.write(b); fo.write(b); fo.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* * InputStream.read方式是读取一个字节内容后,以int型返回,在这之间有一个转换的过程:当读 * 取一个字节内容后,会在这八位二进制前再补24位二进制的0,所以最后返回的字节编码为正数,永不 * 会为负数,且范围为0-255间的整数。这样如果使用read方法读取二进制文件时,读出的编码是整数, * 原本可能为负编码,最终显示成了正编码。为了确保得到正确的原本二进制编码,在读取后只能强制转 * 换成byte型,或使用read(byte b)方式来读取。 */ public void testReadEncodeError() { try { FileInputStream fi = new FileInputStream("e:/tmp/tmp"); //read方ifc读取的一个字节内容,返回0到255范围内的int字节值,如果因已到达流 //末尾而没有可用的字节,则返回值-1 int readInt = fi.read(); //如果已到达文件末尾,则返回-1。虽然的文件中的每个字节的内容都是-1,但读出来的不是-1, //所以第二个字节也能输出,而不会出现只能读取第一个字节,第二个字节读不出的问题 while (readInt != -1) { //输入两个255,但输入的编码是错误的,应该为-1才对 System.out.println(readInt); //读下一字节 readInt = fi.read(); } fi.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* * 使用InputStream.read读取出的编码如果经过强转换byte型后,我们就不能再使用 readByte * != -1 来判断文件流是否结束了,因为如果为二进制文件,读出的编码就有 为负的,总之,如果读取 * 的是二进制文件,就不能直接使用真实编码与-1比较,只能使用available或通InputStream.read * (byte[] b)方法返回的所读字节数来判断 */ public void testAvailable() { try { File file = new File("e:/tmp/tmp"); FileInputStream fi = new FileInputStream(file); System.out.println("available实质上与file的length相同:" +file.length()); //当使用read方法读取出的编码后经强转byte后,不能使用 (byte) fi.read() != -1 来 //判断是文件流是否结束,这里我们只能使用available来判断是否达文件尾 while (fi.available() > 0) { System.out.println("available=" + fi.available()); //使用read()方法读取字节内容的编码后,只能强转byte型才能得到真实的编码 System.out.println((byte) fi.read()); } fi.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* * 读取二进制文件(如图片)而非字符文件时,除了使用read()读取强转byte型,使用 InputStream. * read(byte[] b)是最好的方式,此时使用读取返回的字节数来判断是否读完 */ public void testReadByByteArr() { try { FileInputStream fi = new FileInputStream("e:/tmp/tmp"); byte[] byteArr = new byte[1024]; //读取的字节数 int readCount = fi.read(byteArr); //如果已到达文件末尾,则返回-1 while (readCount != -1) { for (int i = 0; i < readCount; i++) { System.out.println(byteArr[i]); } readCount = fi.read(byteArr); } fi.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* * 使用InputStream.read读取二进制文件强转换byte型获取真实编码后,不能使用readByte != * -1 来判断是否到文件尾 */ public void testGetBytecodeByConvernt() { try { FileInputStream fi = new FileInputStream("e:/tmp/tmp"); //读取的一个字节内容,强制转byte型,得到真实的编码 byte readByte = (byte) fi.read(); //这里我们不能使用如下方式来判断是否读流结束,因为编码内容本身就是-1,所以不会输出任何内容 while (readByte != -1) { System.out.println((byte) readByte); readByte = (byte) fi.read(); } fi.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
评论
因为文件的传输会打成字节流,流就是0和1,的类型就不就是char或者是byte,不然还有什么类型可以匹配它的类型呢?你觉得呢?
发表评论
-
Java正则表达式
2014-03-14 10:16 1759Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1452初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1245这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2179java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34789默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1635http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1540在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12095一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 8070eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2141Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3668最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2415类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1050用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18732内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8972中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3371关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4708定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2301线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9799import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2416final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
`InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的用法,并提供实际的代码示例,帮助初学者更好地理解和应用。 1. `InputStream`...
IO流是Java中的一种基本的数据交换方式,通过InputStream和OutputStream可以实现数据的读取和写入,而Reader和Writer可以实现字符流的读取和写入。IO流的知识点很多,需要认真学习和掌握。 InputStream的类型: * ...
int received = inputStream.read(); ``` 在Android中,还需要处理权限问题。在AndroidManifest.xml文件中,添加如下权限声明: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` ...
inputStream.read(bytes); String content = new String(bytes); } ``` 五、删除文件 使用`File`对象的`delete()`方法可以删除文件: ```java if (file.delete()) { Log.d("TAG", "File deleted successfully.")...
文件流继承自Inputstream和OutputStream,用于连接文件的“管道”,可以对文件进行读写的流。 #### 2.2 字符流 字符流的超类是java.io.Reader和java.io.Writer。字符流是以字符为单位读写数据的流,用于处理文本...
writer.write("Hello, World!"); writer.newLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } } catch (IOException e) { e....
Java中的流主要分为两大类:字节流(如InputStream和OutputStream)和字符流(如Reader和Writer)。这两种类型的流分别用于处理二进制数据和文本数据。 #### 1. InputStream和OutputStream ##### 1.1 InputStream ...
Character Data Representation API 包括了 Writer 和 Reader 类。与字节流不同,字符流的单位是字符,一个字符可能由多个字节组成(如 Unicode 字符集)。 1. 字符输出流 Writer:它是一个抽象类,用于写出字符...
在Java中,输入和输出通常通过流(Stream)的概念来实现,这些流可以是字节流或字符流,分别对应于`java.io.InputStream`和`java.io.OutputStream`以及`java.io.Reader`和`java.io.Writer`接口。 字节流是处理原始8...
主要方法与OutputStream类似,包括read()方法用于读取单个字节,read(byte[])用于读取字节数组,以及close()和skip()等方法。例如,使用FileInputStream从文件读取数据: ```java public class ...
四个基本的类是InputStream、OutputStream、Reader和Writer,这四个类是流分类的根源。InputStream和OutputStream是字节流,Reader和Writer是字符流。 字节流是最基本的流,文件的操作、网络数据的传输等等都依赖于...
Java 中的流都是从四个抽象类派生出来的:InputStream、OutputStream、Reader 和 Writer。 InputStream 和 OutputStream 是基于字节流的,它们是 Java 中最早的输入/输出流接口。Reader 和 Writer 是基于字符流的,...
在Java编程语言中,了解和掌握Reader/Writer类层次结构以及InputStream/OutputStream类层次结构是非常重要的,它们分别处理字符和字节流的数据操作。这些类层次结构为输入和输出提供了基础框架,使得开发者能够有效...
Reader类有与InputStream相似的read方法,而Writer类也有与OutputStream对应的write方法。这些方法用于读取或写入单个字符或字符数组。 Java的流系统设计得非常灵活,允许不同类型的流进行组合和链接,以满足复杂的...
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String readContent = reader.readLine(); Log.d("FileRead", "读取到的内容:" + readContent); reader.close(); ``` 三、外部...
这两种流主要由四个抽象类来表示:InputStream、OutputStream、Reader、Writer,输入输出各两种。其中InputStream和OutputStream表示字节流,Reader和Writer表示字符流,其他流均是继承这四个抽象类而来的。 在Java...
我们使用InputStream的read()方法读取源文件的字节,并通过OutputStream的write()方法将这些字节写入目标文件。当所有数据都被读取和写入后,我们关闭这两个流。这是一个基本的文件复制过程,实际的IO操作可能会更...
InputStream和OutputStream是抽象类,它们提供了基本的读写操作,如read()和write()方法。原始处理器(适配器)是用来将不同类型的输入/输出资源转换为InputStream或OutputStream的类。例如,ByteArrayInputStream...
Reader → FileReader → PipedReader → FilterReader → StringReader → ... Writer → FileWriter → PipedWriter → FilterWriter → StringWriter → ... 示例代码 下面是一些Java IO流的示例代码: ```...