Java学习笔记八
IO流:就是input/output输入/输出流。
一、字节流操作文件的便捷类:FileWriter和FileReader
import java.io.FileWriter;
import java.io.IOException; public class FileWriterDemo {
private static final String LINE_SEPARATOR=System.getProperty("line.separator");
public static void main(String[] args) throws IOException{
/*FileWriter类是Writer类的一个实现,用于向文件中写入字符
* io操作可能会触发IOException.
*/
demo();
} //1、io操作应该处理IOException
public static void demo() throws IOException {
/*2、FileWriter类有多个构造函数,但是必须指定一个预期写入的目标文件,
* 下面是字符串指定的文件,如果文件不存在则创建并写入内容;如果存在则先删除在创建并写入
*/
FileWriter fw=new FileWriter("demo.txt");
//3、write()是将内容写入到缓冲区中,而非硬盘中
fw.write("asd"+LINE_SEPARATOR+"fgh"+LINE_SEPARATOR);
//4、flush()是将缓冲区内容刷新到硬盘中
fw.flush();
//5、close()是两步操作:先刷新,在关闭
fw.close();
//如果想要在其后追加内容而非覆盖,则可以使用第二个boolean参数的构造方法
FileWriter fw2=new FileWriter("demo.txt",true);
fw2.write("这是追加的内容,使用了第二个boolean参数,没有将前面内容覆盖");
fw2.close();
}
}
FileWriter示例
import java.io.FileReader;
import java.io.IOException; public class FileReaderDemo { public static void main(String[] args){
readDemo();
readDemo2();
} public static void readDemo(){
/*FileReader类是读取文件内容的Reader类的实现,特点
* 1、继承了read(),但是每次只能读取一个字符,!!!范围在 0 到 65535 之间 (0x00-0xffff)
* 2、读到结尾处,返回-1
* 3、独处的数据是int类型而非char类型,可以进行强转
*/
FileReader fr = null;
try {
fr = new FileReader("demo.txt");
while (fr.read() != -1) {
System.out.println((char)(fr.read()));
}
} catch (IOException e) {
System.out.println(e.toString());
}finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e2) {
throw new RuntimeException("关闭失败");
}
}
}
} public static void readDemo2() {
/*第二种方式是先创建一个数组,然后将读取的字符存入其中,然后可以将字符数组转为字符串然后读取
* 优点是一次可以读取多个,减少循环的次数
* !!!注意:每次都会读取数组长度的字符,并从0位开始存储,如果最后一次读取的字符<数组长度,
* !!!则只会覆盖前面的位置,之后的还是上一次读取的字符
* 数组长度最好是1024的整数倍
*/
FileReader fr = null;
char[] buff=new char[1024];
int len=0;
try {
fr = new FileReader("demo.txt");
while ((len=fr.read(buff)) != -1) {
System.out.println(new String(buff,0,len));
}
} catch (IOException e) {
System.out.println(e.toString());
}finally{
if(fr!=null){
try {
fr.close();
} catch (Exception e2) {
throw new RuntimeException("关闭失败");
}
}
}
}
}
FileReader示例
import java.io.FileWriter;
import java.io.IOException; public class IOExceptionDemo {
private static final String LINE_SEPARATOR=System.getProperty("line.separator"); public static void main(String[] args){
demo();
} public static void demo() {
/*流类异常的处理:指的是那些需要打开/关闭资源的类,如IO流和数据库操作,
* 1、就算出现异常,也要关闭资源,所以需要使用finally语句将关闭操作包含
* 2、由于{}是一个单独的作用域,而这个资源需要在try和finally中分别操作,
* !!!所以需要将资源定义在try结构之前
* 3、关闭操作在finally中也可能出错,所以也需要单独进行try操作
* !!!4、在关闭资源之前应该先判断是否打开该资源,因为可能打开时就失败了
*/
FileWriter fw =null;
try {
fw = new FileWriter("demo.txt"); fw.write("asd" + LINE_SEPARATOR + "fgh" + LINE_SEPARATOR);
} catch (IOException e) {
System.out.println(e.toString());
}finally{
if(fw!=null){
try {
fw.close();
} catch (Exception e2) {
throw new RuntimeException("关闭失败");
}
}
}
}
}
IO异常处理
缓冲区BufferedWriter/BufferedReader是用来提高流操作的效率,将要读写的内如存放在内存中统一读取,减少IO操作次数
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class BufferDemo {
public static void main(String[] args) throws IOException{
//BufferedWriterDemo();
BufferedReaderDemo();
} public static void BufferedWriterDemo() throws IOException {
//缓冲区必须封装一个字符流对象,其实内部就是用数组将字符流读取的内容先保存之后统一输出
FileWriter fw=new FileWriter("bufferdemo.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("asdsf");
bw.newLine();
bw.write("这是新一行,使用缓冲区对象的方法换行");
//这里使用缓冲区对象的close()其实就是使用字符流对象的该方法
bw.close();
} public static void BufferedReaderDemo() throws IOException {
FileReader fr=new FileReader("bufferdemo.txt");
//缓冲区内部其实就是一个数组,在这里体现的更明显
BufferedReader br=new BufferedReader(fr);
String line="";
//BufferedReader类有一个特殊方法:就是读取一行内容,!!!读到最后返回null不是-1
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
}
Buffered缓冲区示例
下图是缓冲区实现的原理图
缓冲区对象还有一个子类LineNumberReader可以读取行号,原理类似
二、字节流操作文件的便捷类:FileOutputStream和FileInputStream,和字符流对象类似
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class ByteStreamDemo { public static void main(String[] args) {
/*字节流演示:直接操作底层2进制,不管编码。和字符流的区别是
* 1、使用的是字节数组,每次读取1个字节,如果字符超出1字节会被剪切
* 2、不用刷新flush(),因为会直接输出,但是需要close()
*/
FileOutputStreamDemo();
FileInputStreamDemo();
} public static void FileOutputStreamDemo() {
FileOutputStream fos=null;
try {
fos = new FileOutputStream("ByteStream.txt");
fos.write("abcdefg".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
throw new RuntimeException("关闭失败");
}
}
}
} public static void FileInputStreamDemo() {
FileInputStream fis=null;
try {
fis = new FileInputStream("Bytestream.txt");
/*FileInputStream对象available()可以直接访问文件的字节长度,所以比较简便的读取
* !!!注意:如果文件内容过程,例如一部电影,就不能使用这种方法,因为创建的数组过长
* 但是该方法可以用在对文件的分段读取上
*/
byte[] b=new byte[fis.available()];
fis.read(b);
System.out.println(new String(b));
} catch (IOException e) {
e.printStackTrace();
}finally{
try { fis.close();
} catch (IOException e) {
throw new RuntimeException("关闭失败");
}
}
} }
字节流对象演示
字节流对象也有对应的缓冲区对象:BufferedOutputStream和BufferedInputStream
三、标准输入:即通过键盘录入数据
import java.io.IOException;
import java.io.InputStream; public class ReadKey { public static void main(String[] args) throws IOException {
readkeydemo();
readkeytest();
} public static void readkeydemo() throws IOException {
//1、通过System.in获取标准输入流对象
InputStream in=System.in;
/*2、通过read()来读取标准输入设备的输入数据,特点:
* 1、!!!注意在读取完之前/抛出异常之前总是阻塞
* 2、内容输入完使用Enter回车键结束,即使输入多个字符,该方法一次只能读取一个
* !!!注意:实际的输入内容包括回车符\r(13),换行符\n(10)
*/
int context=in.read();
System.out.println(context);
context=in.read();
System.out.println(context);
context=in.read();
System.out.println(context);
context=in.read();
System.out.println(context);
//3、!!!标准的输入/出对象在关闭之后就不能再打开了,所以不要手动关闭,会在程序结束时自动关闭
//in.close();
} public static void readkeytest() throws IOException {
/*读取用户输入信息,以over结束而不是以回车符结束
* 1、既然不使用回车符结束就要将其避免,
* 当读到\r时跳过,下一个若是\n,表示一行的结束
* 2、在一行结束时应该先判断是否是over,如果是则跳出循环,
*/
InputStream in=System.in;
StringBuffer sb=new StringBuffer();
int ch=0;
/*下面循环中的操作就是多次读取一行信息,和字符流BufferedReader中的readLine()相似,
* 只是需要将字节流转换为字符流才能操作,见InputStreamReaderDemo.java
*/
while((ch=in.read())!=-1){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
String str=sb.toString();
if(str.equals("over")){
break;
}
System.out.println(str);
sb.delete(0, sb.length());
}else{
sb.append((char)(ch));
}
}
}
}
键盘录入示例
四、字节流到字符流的转换InputStreamReader和OutputStreamWriter
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; public class StreamtoReaderWriter {
public static void main(String[] args) throws IOException{
/*字符流=字节流+编码,在Java中有对象可以实现字节流和字符流之间的转换
* 1、字节流--》字符流:解码,使用InputStreamReader
* 2、字符流--》字节流:编码,使用OutputStreamWriter
*/
//readKeyTest();
OutputStreamWriterDemo();
} public static void readKeyTest() throws IOException {
InputStream in=System.in;
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
String str=null;
while((str=br.readLine())!=null){
if(str.equals("over")){
break;
}
System.out.println(str);
}
} public static void OutputStreamWriterDemo() throws IOException {
/*这个函数是将System.out用流的方式实现了,其实其本身就是一种流
* 并且可以将一个输入流内容输出到指定位置,扩展了System.out只能输出到控制台的功能
*/
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
String str=null;
while((str=br.readLine())!=null){
if(str.equals("over")){
bw.close();
break;
}
//System.out.println(str);
bw.write(str);
bw.newLine();
bw.flush();
}
}
}
转换流
!!!注意:System.out对象就是PrintStream的一个实例,用于方便的输出各种类型的数据;而System.in就是InputStream的一个实例
!!!PrintStream对象的println()会在写入byte[]之后自动添加换行符(意味着结束此行),并自动刷新,例如out对象的println()
五、流对象该如何选择
文件系统操作:IO流操作是对数据的操作,但是不能操作文件本身,Java中将对文件/文件夹的操作封装为File对象
Java学习笔记八的更多相关文章
- Java 学习笔记 (八) Java 变量
head first java page85 实例变量是声明在类内而不是方法中 class Horse{ private double height=15.2; private String bree ...
- Java学习笔记八(反射)
1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...
- Java学习笔记八:Java的流程控制语句之循环语句
Java的流程控制语句之循环语句 一:Java循环语句之while: 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...
- Java学习笔记(八)面向对象---抽象类
当多个类中出现相同功能,但是功能主体不同时,我们可以向上抽取,只抽取功能定义,而不抽取功能主体. 抽象类的特点 抽象方法一定在抽象类中. 抽象方法和抽象类都必须被abstract关键字修饰. 抽象类不 ...
- 20145330第八周《Java学习笔记》
20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- uva 1292 树形dp
UVA 1292 - Strategic game 守卫城市,城市由n个点和n-1条边组成的树,要求在点上安排士兵,守卫与点相连的边.问最少要安排多少士兵. 典型的树形dp.每一个点有两个状态: dp ...
- linux命令su与su-的差别
su命令和su -命令最大的本质差别就是: su仅仅是切换了root身份.但Shell环境仍然是普通用户的Shell. 而su -连用户和Shell环境一起切换成root身份了. 仅仅有切换了Shel ...
- Simditor用法
一不小心接触到Simditor,瞬间被它优美极简的界面所吸引.Simditor是Tower开源的所见即所得的在线富文本编辑器. Simditor的理念是保持简单,避免过度的功能,每个特性都追求极致的用 ...
- Create the Project
https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspn ...
- 3.AngularJS-过滤器
转自:https://www.cnblogs.com/best/p/6225621.html 二.过滤器 使用过滤器格式化数据,变换数据格式,在模板中使用一个插值变量.语法格式如下: {{ expre ...
- JUnit中assertEquals和assertSame方法的不同
1)提供的接口数量不完全相同. assertEquals支持boolean,long,int等等java primitiveType变量.assertSame只支持Object. 2)比较的逻辑不同, ...
- 批处理实现添加java环境变量
作者:朱金灿 来源:http://blog.csdn.net/clever101 从网上搜了一些资料,再修改测试,终于通过了win7系统的测试.代码如下: @echo off rem 本批处理文件目的 ...
- noip 2018 day1 T2 货币系统 完全背包
Code: #include<cstdio> #include<string> #include<cstring> #include<algorithm> ...
- R学习:《R语言数据分析与挖掘实战》PDF代码
分三个部分:基础篇.实战篇.提高篇.基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例实践获得数据挖掘项目经验,同时快速领悟看似难懂的数据 ...
- 机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码
机器学习是近年来渐趋热门的一个领域,同时Python 语言经过一段时间的发展也已逐渐成为主流的编程语言之一.<Python机器学习实践指南>结合了机器学习和Python 语言两个热门的领域 ...