java输入输出(二)
来源:互联网 发布:方便面怎么煮好吃知乎 编辑:程序博客网 时间:2024/06/12 07:25
6.写文本(字符)
抽象类Writer定义了用于写字符的流。OutputStreamWriter是Writer的一个子类,它为使用一个字符集将字符转换为字节流提供了便利。而如果想要把字符写入文件,java提供了OutputStreamWriter的子类FileWriter,但是它有一个问题就是,使用FileWriter时只能用计算机的编码输出字符,所以当前字符集之外的字符无法正确的转换为字节流,FileWriter的一个更好的替代是PrintWriter。
6.1 Writer类
同OutputStream一样,Writer也有一下几种writer方法的重载:
注意他们传入参数的变化。
6.2 OutputStreamWriter
通过该类可以使用指定的字符集将字符编码为字节。它的构造方法包括一个OutputStream参数,写入到该类的字符经过转换后的字节再写入OutputStream。
下面是该类的一个示例;
char[] chars = new char[2];
char[0] = '\u4F60';
char[1] = '\u597D';
Path path= Paths.get(...);
Charset charset = Charset.forName("GB2312");
try(OutputStream outputstream = Files.newOutputStream(path,StandardOpenOption.CREATE);
OutputStreamWriter writer= new OutputStreamWriter(outputstream,charset)){
writer.write(chars);
}catch(....){...}
代码中传入了两个字符,使用GB2312编码就是‘你’,‘好’。
6.3 PrintWriter
使用PrintWriter同样可以替代OutputStreamWriter,PrintWriter同样可以传入指定编码。PrintWrite有两个构造方法,参数分别是OutputStream和Writer,有九个重载的print方法和九个println方法。将Writer作为参数传入BufferedWriter可以包装writer,提高性能和稳定性。所以声明一个PrintWriter可以使用下面的格式;
PrintWirter pw= new PrintWriter(new BufferedWriter(writer));
下面展示一个使用PrintWriter写字符到文件的范例:
Path path = ...
Charset cahrset = Charset.forName("US-ASCII");
try(BufferedWriter bufferedWriter = Files.newBufferedWriter(path,charset,StandardOpenOPtion.CREATE)){
PrintWriter printwriter = new PrintWriter(bufferedWriter);
printwriter.println("PrintWriter is easy to use");
}catch...
使用PrintWriter写文件的好处是当打开文件是,内容都是可读的。
7.读文本(字符)
常使用Reader来读文本,该类的层级图如下所示;
InputStreamReader同样可以使用指定的编码,将读取的字节转化为字符,由此可见很适合使用从一个OupPutStreamWriter或者PrintWriter的输出来读取。同样,每一个该类的构造方法也需要一个InputStream作为参数之一。
承接6.2,下面是一个范例:
try(InputStream inputstream = Files.newInputStream(path,StandardOpenOption.READ);InputStreamReader reader =new InputStreamReader(inputstream,charset)){
char[] chars2 = new char[2];
reader.read(chars2);
...//打印一下加深印象
}catch...
类比输出同样有一个BufferedReader,他的readLine方法可以一次读取一行文本。
展示一个读取文本文件的范例:
BufferedReader bufferedreader = Files.newBufferedReader(path,charset);
String line = bufferedrader.readLine();
while(line!=null){
...//输出line;
line = bufferreader.readLine();
}
8. 随机访问文件
假如需要读写第1000个字符,但考虑效率顺序访问显然不可取,就需要随机访问了。Java提供了两个解决方案,RandomAccessFile和SeekableByeChannel,前者出现比较早,有点过时了,但使用相对容易点。
下面是一个范例:
ByteBuffer buffer = ByteBuffer.allocate(12);//先分配12个字节的缓存
System.out.println(buffer.posotion);//ByteBuffer是使用一个byte数组实现的
buffer.putInt(10);//int类型4个字节长
buffer.putLong(12345679L);//long类型8字节长
try(SeekableByteChannel bytechannel = File.newByteChannel
(path,StandardOpenOption.CREATE,StandardOpenOption.READ,StandardOpenOption.Write)){
//也可以使用EnumSet.of(...)声明权限
bytechannel.write(buffer);//写入
//读回
ByteBuffer buffer2 = ByteBuffer.allocate(40);
bytechannel.position(0);//修改指针位置
bytechannel.read(buffer2);
buffer2.rewind();
System.out.println(buffer2.getInt()+buffer2.getLong());//int读取4字节,long都8字节
}catch...
- java输入输出(二)
- JAVA之输入输出(二)
- java IO-输入输出流(二)
- java的标准输入输出(二)
- Java基础之(三十五)输入输出<二>
- JAVA基础(二)输入输出流总结
- Java io 输入输出流(二)
- 输入输出格式(二)
- 输入输出函数(二)
- 输入输出系统(二)
- 黑马程序员——JAVA IO输入输出(二)
- 黑马程序员——JAVA IO输入输出(二)
- java io流详解(二)对象输入输出流
- java基础改学C++(二)输入输出、格式输出
- C++的输入输出(二)
- C++ 文件输入输出(二)
- java输入输出(快速)
- Java输入输出(1)
- 278. First Bad Version
- POJ 2125 Destroying The Graph 二分图 最小点权覆盖
- Python else语句
- 入门训练 Fibonacci数列
- 【详解】嵌入式开发中固件的烧录方式
- java输入输出(二)
- 内核链
- Web基础之CSS3
- 268. Missing Number
- Hexo 博客空间
- 198. House Robber&&213. House Robber II
- Linux与Unix的关系
- 动态规划(完全背包的变形)
- 测试面试题